控制器controller
- 控制器负责提供访问应用程序的行为,通常通过接口定义或注解两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型
- 在Springmvc中一个控制器可以包含多个方法。
- 在Springmvc中对于Controller的配置方式有很多种
1.实现Controller接口
@FunctionalInterface
//实现该接口的类获得控制器功能
public interface Controller {
//处理请求并返回一个模型与视图对象
@Nullable
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
编写一个Controller类
public class ControllerTest1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","ControllerTest1");
modelAndView.setViewName("test");
return modelAndView;
}
}
编写完毕后,去spring配置文件中注册请求的bean,name对应请求路径,class对应处理请求的类
<bean class="com.yf.controller.ControllerTest1" name="/test"/>
这样就可以使用了。
说明:
- 实现接口Controller定义控制器是比较老的方法
- 缺点是:一个控制器中只有一个方法,如果要多个方法需要定义多个Controller,定义方式比较麻烦。
使用注解@Controller
- @Controller注解类型用于声明Spring类的实例是一个控制器
- Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了Spring能够找到你的控制器,需要在配置文件中声明组件扫描。
<!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
<context:component-scan base-package="com.yf.controller"/>
然后进行Controller类的编写
@Controller
//代表这个类会被spring接管
//被这个注解的类,中所有的方法,如果返回值是string,并且有具体的页面可以跳转,就会被视图解析器解析
public class ControllerTest2 {
@RequestMapping("/test2")
public String test1(Model model){
model.addAttribute("msg","ControllerTest2");
return "test";
}
@RequestMapping("/test3")
public String test3(Model model){
model.addAttribute("msg","ControllerTest3");
return "test";
}
}
可以看到一个控制器内的两个方法指向都是同一个视图,但是页面的 结果是不一样的,视图是被复用的,而控制器和视图之间是弱耦合关系。
ResultMapping
- ResultMapping注解用于映射到控制器类或一个特定的处理程序方法。可用于类和方法上,用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
例如我在一个controller类中写:
@RequestMapping("/t")
public class ControllerTest2 {
@RequestMapping("/test2")
public String test1(Model model){
model.addAttribute("msg","ControllerTest2");
return "test";
}
@RequestMapping("/test3")
public String test3(Model model){
model.addAttribute("msg","ControllerTest3");
return "test";
}
}
这样要想访问到控制器中的方法就必须在路径上加上/t