1. 介绍
在Spring框架中,@Controller
注解是一个非常重要的组件,它用于定义一个类为Spring MVC的控制器(Controller)。这个注解会告诉Spring框架,被标注的类是一个Web控制器,并且可以处理HTTP请求。
2. 特点
- 组件扫描:
@Controller
注解的类会被Spring的组件扫描机制自动检测到,并注册为Spring容器中的一个Bean。这意味着你不需要在XML配置文件中手动声明这个Bean。 - 请求映射:通常与
@RequestMapping
或其变体(如@GetMapping
,@PostMapping
等)一起使用,以定义哪些URL应该触发控制器中的特定方法。这些注解可以放在类级别或方法级别上,用来指定请求的路径、HTTP方法等。 - 数据绑定:控制器中的方法可以通过方法参数接收来自客户端的数据,例如表单提交的数据或URL中的参数。Spring MVC会自动将请求参数绑定到方法参数上。
- 视图解析:控制器方法通常返回一个逻辑视图名称,Spring会根据这个名称找到相应的视图资源来渲染页面。也可以直接返回视图对象或者使用
@ResponseBody
直接写出响应内容。
3. 源码
/*** @author Arjen Poutsma* @author Juergen Hoeller* @since 2.5* @see Component* @see org.springframework.web.bind.annotation.RequestMapping* @see org.springframework.context.annotation.ClassPathBeanDefinitionScanner*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {// Spring类型的属性,表示注入IOC容器时Bean的唯一标识@AliasFor(annotation = Component.class)String value() default "";}
4. Demo
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class HelloWorldController {@GetMapping("/hello")public String sayHello(@RequestParam(value = "name", required = false, defaultValue = "World") String name, Model model) {model.addAttribute("name", name);return "hello"; // 返回逻辑视图名,这里假设有一个名为 "hello" 的视图模板}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.ui.Model;@Controller
@RequestMapping("/hello")
public class HelloController {@GetMappingpublic String hello(@RequestParam(value = "name", defaultValue = "World") String name, Model model) {model.addAttribute("name", name);return "hello"; // 返回视图名称,通常对应一个模板文件(如 Thymeleaf, JSP 等)}
}