控制器Controller解释
- 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型。
- 在Spring MVC中一个控制器类可以包含多个方法
- 在Spring MVC中,对于Controller的配置方式有很多种
我们来看看有哪些方式可以实现:
实现Controller接口
Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法;
@FunctionalInterface
//实现该接口的类获得控制器功能
public interface Controller {
@Nullable
//处理请求且返回一个模型与视图对象
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
编写一个Controller类,HelloController
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","HelloMySpringMVC");
mv.setViewName("myHello");
return mv;
}
}
注意点:
编写完毕后,去Spring配置文件中注册请求的bean;id对应请求路径,class对应处理请求的类
<bean id="/myHello" class="com.loey.controller.HelloController"/>
说明:
实现接口Controller定义控制器是较老的办法
缺点是:一个控制器中只能有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比 较麻烦
使用注解@Controller
- @Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注 解
@Component
@Controller:web层
@Service:service层
@Repository:dao层 );
@Controller是一个注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
- Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的 控制器,需要在配置文件中声明组件扫描。
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.loey.controller"/>
使用注解实现Controller
@Controller//代表这个类会被Spring接管
//被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
@RequestMapping("/HelloControllerAnno")
public class HelloControllerAnno {
//真实访问地址:项目名/HelloControllerAnno/helloAnno
@RequestMapping("/helloAnno")
public String sayHello(Model model){
//向模型中添加属性msg与值,可以在JSP页面中取出渲染
model.addAttribute("msg","Hello,SpringMVCAnno");
//WEB-INF/jsp/hello.jsp
return "hello";
}
}
说明:
视图可以被复用的,而控制器与视图之间是弱偶合关系.即一个控制器中可以有多个方法,不需要定义多个Controller;
RequestMapping解释
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
只注解在方法上
@Controller//代表这个类会被Spring接管
//被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
public class HelloControllerAnno {
//真实访问地址:项目名/HelloControllerAnno/helloAnno
@RequestMapping("/helloAnno")
public String sayHello(Model model){
//向模型中添加属性msg与值,可以在JSP页面中取出渲染
model.addAttribute("msg","Hello,SpringMVCAnno");
//WEB-INF/jsp/hello.jsp
return "hello";
}
}
访问路径:http://localhost:8080 / 项目名 / helloAnno
同时注解类与方法
@Controller//代表这个类会被Spring接管
//被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
@RequestMapping("/HelloControllerAnno")
public class HelloControllerAnno {
//真实访问地址:项目名/HelloControllerAnno/helloAnno
@RequestMapping("/helloAnno")
public String sayHello(Model model){
//向模型中添加属性msg与值,可以在JSP页面中取出渲染
model.addAttribute("msg","Hello,SpringMVCAnno");
//WEB-INF/jsp/hello.jsp
return "hello";
}
}
访问路径:http://localhost:8080 / 项目名/ HelloControllerAnno /helloAnno , 需要先指定类的路径再指定方法的路径