处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解
Posted xb1223
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解相关的知识,希望对你有一定的参考价值。
非注解 处理器映射器 和 处理器适配器
处理器映射器:
第一种: BeanNameUrlHandlerMapping
<!-- 配置Handler -->
<bean id="userController1" name="/queryUsers.action" class="com.bjxb.ssm.controller.UserController" />
<!-- 处理器映射器 将bean的name作为url进行查找, bean就是我们写的Handler,所以我们需要在配置Handler时指定beanname(就是url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
第二种:SimpleUrlHandlerMapping
<!-- 配置Handler 实现 Controller 接口 的 Handler
既有 name 属性 可以让 BeanNameUrlHandlerMapping 处理器映射器 映射到,
又有 id 属性 可以在 SimpleUrlHandlerMapping 处理器映射器 中进行映射-->
<bean id="userController1" name="/queryUsers.action" class="com.bjxb.ssm.controller.UserController" />
<!-- 配置Handler,实现 HttpRequestHandlerAdapter 接口 的 Handler -->
<bean id="userController2" class="com.bjxb.ssm.controller.UserController2"/>
<!-- 简单URL映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 对userController1进行URL映射,URL是/queryUsers.action
同一个Bean可以有多个URL与之映射
-->
<prop key="/queryUsers1.action">userController1</prop>
<prop key="/queryUsers2.action">userController1</prop>
<prop key="/queryUsers3.action">userController2</prop>
</props>
</property>
</bean>
注意:上面两种处理器映射器,我们是在同一个 xml 文件中配置,并且根据不同的 URL 都能正常访问。
结论:多个处理器映射器可以并存,前端控制器判断 URL 能让哪些映射器映射,从中选择正确的映射器处理。
非注解的适配器:
第一种:SimpleControllerHandlerAdapter
<!-- 处理器适配器 所有的处理器适配器都实现 HandlerAdapter接口
这里我们使用SimpleControllerHandlerAdapter 处理器适配器
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
注意:这款适配器要求我们编写的 Handler 实现 Controller 接口
Handler如下:
public class UserController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ArrayList<User> userlist = new ArrayList<User>();
User user1 = new User("腾博","123456");
User user2 = new User("小兵","123456");
System.out.println("我来了");
userlist.add(user1);
userlist.add(user2);
// 返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 相当于request的setAttribute,在jsp页面中通过userlist取数据
modelAndView.addObject("userlist", userlist);
// 指定视图
modelAndView.setViewName("/WEB-INF/jsp/users/user.jsp");
return modelAndView;
}
}
第二种:HttpRequestHandlerAdapter
<!-- 另一个非注解的处理器适配器 HttpRequestHandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
注意:这款适配器要求我们编写的 Handler 实现 HttpRequestHandler 接口
Handler如下:
public class UserController2 implements HttpRequestHandler{
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ArrayList<User> userlist = new ArrayList<User>();
User user1 = new User("腾博","123456");
User user2 = new User("小兵","123456");
System.out.println("我来了");
userlist.add(user1);
userlist.add(user2);
// 设置模型数据
request.setAttribute("userlist", userlist);
// 设置转发的视图
request.getRequestDispatcher("/WEB-INF/jsp/users/user.jsp").forward(request, response);
// 使用此接口,我们可以通过修改response,设置响应的数据格式,比如响应json数据
// response.setCharacterEncoding("utf-8");
// response.setContentType("application/json;charset=utf-8");
// response.getWriter().write("json串");
}
}
经过上面的分析我们发现:
处理器映射器就是:根据我们的 URL 寻找 Handler
处理器适配器就是:按照它要求的规则去执行 Handler
而且我们发现:非注解形式的 HandlerMapping 和 HandlerAdapter 所对应的 Handler,一个类中只有一个方法,处理能力有限,比较繁琐
以上是关于处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解的主要内容,如果未能解决你的问题,请参考以下文章
SpringMVC 组件执行流程,组件:前端控制器 DispatcherServlet,处理器映射器 HandlerMapping,处理器设配器 HandlerAdapter ,视图解析器 ViewR