处理器映射器(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{@Overridepublic 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);// 返回ModelAndViewModelAndView 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{@Overridepublic 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,一个类中只有一个方法,处理能力有限,比较繁琐

 

转载于:https://www.cnblogs.com/xb1223/p/10185280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gateway Sentinel 做网关降级/流控,转发header和cookie

大家好&#xff0c;我是烤鸭&#xff1a; Springcloud Gateway 使用 Sentinel 流量控制。 环境 springcloud-gateway的网关应用&#xff0c;springboot的服务&#xff0c;nacos作为注册中心 sentinel-dashboard-1.8.2 最新版下载地址&#xff1a; https://github.com/aliba…

[css] 说说CSS的优先级是如何计算的?

[css] 说说CSS的优先级是如何计算的&#xff1f; 选择器种类严格来讲&#xff0c;选择器的种类可以分为三种&#xff1a;标签名选择器、类选择器和ID选择器。而所谓的后代选择器和群组选择器只不过是对前三种选择器的扩展应用。而 在标签内写入 style"" 的方式&…

django后台数据管理admin设置代码

新建admin用户 createsuperuser 设定好用户名&#xff0c;邮箱&#xff0c;密码 设置setting LANGUAGE_CODE zh-hansTIME_ZONE Asia/ShanghaiUSE_I18N TrueUSE_L10N TrueUSE_TZ False 在写好的users的app下修改admin.py # -*- coding: utf-8 -*- from __future__ import u…

rocketmq 初探(一)

大家好&#xff0c;我是烤鸭&#xff1a; 今天看下rocketmq。这篇主要是简单介绍下 rocketmq以及idea 本地调试 rocketmq。 项目架构 感兴趣的可以下载源码看下。 https://github.com/apache/rocketmq 项目结构图。 rocketmq-acl: acl 秘钥方式的鉴权&#xff0c;用在bro…

[css] 说说浏览器解析CSS选择器的过程?

[css] 说说浏览器解析CSS选择器的过程&#xff1f; 按照从上到下&#xff0c;从右到左的顺序解析。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

客户将数据库迁移上云的常用办法

下载网站:www.SyncNavigator.CN 客服QQ1793040---------------------------------------------------------- 关于HKROnline SyncNavigator 注册机价格的问题 HKROnline SyncNavigator 8.4.1 非破解版 注册机 授权激活教程 最近一直在研究数据库同步的问题&#xff0c;在网上…

基于nchan打造百万用户的聊天室

大家好&#xff0c;我是烤鸭&#xff1a; 这次介绍下nchan&#xff0c;nginx的一个module。 nchan 源码: https://github.com/slact/nchan 官网: https://nchan.io/ nginx 配置说明文档: https://nchan.io/documents/nginxconf2016-slides.pdf 测试环境搭建 4 台linux cent…

springboot 获取控制器参数的几种方式

这里介绍springboot 获取控制器参数有四种方式 1、无注解下获取参数 2、使用RequestParam获取参数 3、传递数组 4、通过URL传递参数 无注解下获取参数无注解下获取参数&#xff0c;需要控制器层参数与HTTP请求栏参数名称一致&#xff0c;这样后台就可以获取到请求栏的参数。 /*…

rocketmq 初探(二)

大家好&#xff0c;我是烤鸭&#xff1a; 上一篇简单介绍和rocketmq&#xff0c;这一篇看下源码之注册中心。 namesrv 先看两个初始化方法 NamesrvController.initialize() 和 NettyRemotingServer.start(); public boolean initialize() {// 加载配置文件this.kvConfigMana…

[css] 说说你对line-height是如何理解的?

[css] 说说你对line-height是如何理解的&#xff1f; line-height 行高&#xff0c;就是两行文字之间基线的距离&#xff0c;用来调整文字的行间距。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 …

2 JVM 运行机制

转载于:https://www.cnblogs.com/likevin/p/10186591.html

[css] 要让Chrome支持小于12px的文字怎么做?

[css] 要让Chrome支持小于12px的文字怎么做&#xff1f; 1, 改用图片 2, 使用 -webkit-text-size-adjust:none; 但是不支持chrome 27.0以上版本 3, 使用 transform: scale( )缩小 暂时不知道更多方法了个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

rocketmq 初探(三)

大家好&#xff0c;我是烤鸭&#xff1a; 上一篇介绍了注册中心&#xff0c;这一篇看下broker。基于 rocketmq 4.9 版本。 BrokerStartup#BrokerController 按照代码的先后顺序撸源码&#xff1a; BrokerController.createBrokerController public static BrokerController…

WIN10远程连接时提示内部错误

微软官方的解决方案是重置远程连接设置&#xff0c;步骤如下&#xff1a; 1、以管理员身份运行命令提示符 2、输入以下命令&#xff1a; netsh winsoc reset 随后会提示重启电脑&#xff0c;遂解决。 3、重启后还不行的话&#xff0c;再试试删除掉远程连接保存的凭据&#xff0…

[css] css的属性content有什么作用呢?有哪些场景可以用到?

[css] css的属性content有什么作用呢&#xff1f;有哪些场景可以用到&#xff1f; content属性与 ::before 及 ::after 伪元素配合使用生成文本内容通过attr()将选择器对象的属性作为字符串进行显示&#xff0c;如&#xff1a;a::after{content: attr(href)} <a href"h…

rocketmq 初探(四)

大家好&#xff0c;我是烤鸭&#xff1a; 上一篇简单介绍broker的初始化&#xff0c;这一篇介绍 NettyRequestProcessor 的实现(主要是broker里用到的)。 AdminBrokerProcessor、ClientManageProcessor、ConsumerManageProcessor、EndTransactionProcessor NettyRequestProce…

iOS 去除警告 看我就够了

你是不是看着开发过程中出现的一堆的警告会心情一阵烦躁&#xff0c;别烦躁了&#xff0c;看完此文章&#xff0c;消除警告的小尾巴。 一、SVN 操作导致的警告 1.svn删除文件后报错 ”xx“is missing from working copy 使用命令sudo find 工程项目路径 -name ".svn"…

[css] 什么是FOUC?你是如何避免FOUC的?

[css] 什么是FOUC&#xff1f;你是如何避免FOUC的&#xff1f; FOUC 即 Flash of Unstyled Content&#xff0c;是指页面一开始以样式 A&#xff08;或无样式&#xff09;的渲染&#xff0c;突然变成样式B。 原因是样式表的晚于 HTML 加载导致页面重新进行绘制。通过 import 方…

rocketmq 初探(五)

大家好&#xff0c;我是烤鸭&#xff1a; 上一篇简单介绍部分 NettyRequestProcessor (AdminBrokerProcessor、ClientManageProcessor、ConsumerManageProcessor、EndTransactionProcessor)&#xff0c;这一篇介绍其他的。 PullMessageProcessor、QueryMessageProcessor、Repl…

Python 装饰器初探

Python 装饰器初探 在谈及Python的时候&#xff0c;装饰器一直就是道绕不过去的坎。面试的时候&#xff0c;也经常会被问及装饰器的相关知识。总感觉自己的理解很浅显&#xff0c;不够深刻。是时候做出改变&#xff0c;对Python的装饰器做个全面的了解了。 1. 函数装饰器 直接上…