本文共 3327 字,大约阅读时间需要 11 分钟。
在上一篇日志中我们看到,配置Spring MVC,当用户发来一个HTTP请求,前端控制器DispatcherServlet首先会去接收,然后请求处理器映射器HandlerMapping,在处理器映射器中查找可以处理该请求的Handler,得到处理器映射器返回的执行链后,前端控制器再根据执行链,与处理器适配器HandlerAdapter进行匹配,找到可以处理的Handler,最后执行相关的handler()方法来获得ModelAndView对象。从这一系列过程来看,处理器映射器和处理器适配器起到了关键的作用,它们决定了选择哪个Handler来处理数据请求。处理器映射器和处理器适配器都有两种配置方式,非注解和注解的形式,上一篇Spring MVC配置中使用的就是非注解形式,在这篇日志中我会再总结两种方式的配置。
非注解形式,也就是把配置信息放在了XML文件中,如把处理器映射器和适配器的信息放在Spring MVC的配置文件springmvc.xml中。
这里使用处理器映射器SimpleUrlHandlerMapping来做示例,SimpleUrlHandlerMapping映射器可以让我们自行配置url和处理器handler之间的映射关系:
userController userController userController2
在Spring MVC的配置文件springmvc.xml中,配置一个名为urlMapping的映射器,里面用prop标签对配置url请求与Controller控制器的映射关系,我们可以配置不同的url映射同一个控制器,如queryUserTest1和queryUserTest2都对应userController。也可以配置不同url映射不同的控制器,如queryUserTest3对应userController2。最后声明两个Controller对应的控制器实现类。
为了判断处理器映射器返回的执行链,在处理器适配器中是否有匹配的控制器Handler,还需要配置处理器适配器,非注解方式的处理器适配器,同样在配置文件springmvc.xml中配置:
示例使用HttpRequestHandlerAdapter,即HTTP请求适配器,负责处理用户的HTTP请求。既然用到HTTP请求适配器,自然我们需要一个实现HttpRequestHandler接口的Handler控制器。
实现HttpRequestHandler接口控制器
public class UserControllerTest2 implements HttpRequestHandler { private UserService userService = new UserService(); @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 数据模型Model,模拟获取用户信息列表 ListuserList = userService.queryUserList(); // 设置数据模型 request.setAttribute("userList", userList); // 设置转发视图 request.getRequestDispatcher("/WEB-INF/jsp/users/userList.jsp").forward(request, response); }
实现HttpRequestHandler接口的Handler处理器中,重写的handleRequest()方法不需要返回ModelAndView对象,而是设置返回请求参数response的一些参数,如设置其数据模型和视图,直接配置在了返回请求response中。之后,我们就可以通过访问地址:
得到请求的数据视图。
使用注解方式的处理器映射器和处理器适配器,在xml文件中代码量减少了很多,只需要在处理器实现类以及具体Handler方法中使用注解即可。在Spring MVC中的处理器映射器和适配器分别是RequestMappingHandlerMapping和RequestMappingHandlerAdapter。
在springmvc.xml配置文件中,使用bean标签对配置注解的处理器映射器:
注解形式的处理器映射器会对类中用@RequestMapping标记的方法进行映射。
同样地,使用注解形式的处理器适配器,会把使用@RequestMapping标记的方法与处理器映射器返回的执行链进行适配,匹配则执行相应的Handler方法:
以上是注解形式的其中一种配置方式,我们还可以使用简写的方式:
这种简写方式配置中,会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter。
注解的Handler控制器实现类
上面说到,使用注解形式配置的处理器映射器和适配器,需要在具体的Handler实现类中使用注解:
// 使用注解的控制器,@Controller标识它是一个控制器@Controllerpublic class annotateControllerTest {private UserService userService = new UserService(); @RequestMapping("/queryUserList") public ModelAndView queryUserList() { // 数据模型Model,模拟获取用户信息列表 ListuserList = userService.queryUserList(); // 返回的ModelAndView对象 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("userList", userList); // 指定视图View modelAndView.setViewName("/WEB-INF/jsp/users/userList.jsp"); // 数据处理完后,返回视图和数据 return modelAndView; }
在具体的控制器实现类中,使用了@Controller注解这是一个Handler控制器类,这样该类才可以被处理器适配器查找到。然后到了具体的实现方法queryUserList()上,有一个注解信息@RequestMapping,注解括号里指定了一个url请求,也就是该url匹配的是这个Handler方法()。
最后,要在配置文件springmvc.xml中生命这个Handler类,这样才能让处理器映射器也找到这个控制器类:
声明的方式有两种,一种是直接使用bean标签对声明该Handler类,不过不推荐这种方式,因为随着控制器类越来越多,代码量也变得越来越多,所以推荐第二种方式,配置扫描包下的控制器类。
所有东西配置完后,就可以重启Tomcat服务器,访问地址:
得到访问结果:
完整代码已上传GitHub:
转载地址:http://nntm.baihongyu.com/