博客
关于我
非注解和注解的处理器映射器、处理器适配器
阅读量:322 次
发布时间:2019-03-03

本文共 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,模拟获取用户信息列表		List
userList = 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,模拟获取用户信息列表		List
userList = 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/

你可能感兴趣的文章
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS COCO数据集介绍
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS SQL查询库、表、列数据结构信息汇总
查看>>
MS UC 2013-0-Prepare Tool
查看>>
MSBuild 教程(2)
查看>>
msbuild发布web应用程序
查看>>
MSB与LSB
查看>>
MSCRM调用外部JS文件
查看>>
MSCRM调用外部JS文件
查看>>
MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
查看>>
MsEdgeTTS开源项目使用教程
查看>>
msf
查看>>
MSP430F149学习之路——SPI
查看>>
msp430入门编程45
查看>>
MSSQL数据库查询优化(一)
查看>>
MSSQL数据库迁移到Oracle(二)
查看>>
MSSQL日期格式转换函数(使用CONVERT)
查看>>
MSTP多生成树协议(第二课)
查看>>