处理器映射器(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…

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…

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

下载网站: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…

rocketmq 初探(二)

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

2 JVM 运行机制

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

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

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

rocketmq 初探(四)

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

《自律100天,穿越人生盲点》读书笔记

大家好&#xff0c;我是烤鸭&#xff1a; 《自律100天&#xff0c;穿越人生盲点》&#xff0c;读书笔记。 第一章 “自律100天”的华丽开启 第一节 “自律100天”的底层逻辑 习惯没办法用金钱换&#xff0c;只能用时间。 训练延迟满足(增强自控、培养耐心、减少短期诱惑…

2021 年终总结

2021 年终总结 大家好&#xff0c;我是烤鸭&#xff0c;这是一篇无关技术的记录&#xff0c;总结一下这一年干了什么。 年初的目标 减肥 炒股回本 PMP拿证 多赚钱 多学习新技术 坚持写博客(一周一篇) 多看书 没达成的目标 减肥这个事&#xff0c;拖了好久&#xff0c…

记一次线上cpu飙升100%的排查过程

大家好&#xff0c;我是烤鸭&#xff1a; 最近没怎么写技术文章&#xff0c;还是得回归下初心&#xff0c;正好前几天出现个线上问题&#xff0c;记录下排查过程。 问题描述 某个时间点&#xff0c;接收到接口响应慢报警。 过一会收到服务器cpu可用率低(<10%)报警。 去c…

Node.js(爱前端) 一

一 Node.js 简介 1.1 官网 https://nodejs.org/en/ 官网介绍&#xff1a; Node.js是一个构建在 Chrome 浏览器V8引擎上的 JavaScript 运行环境。 Node.js 使用了事件驱动、非阻塞I/O模型&#xff0c;这些都使它轻量、好用。 Node.js 的包生态&#xff08;npm&#xff09;&#…

记一次线上服务假死排查过程

大家好&#xff0c;我是烤鸭&#xff1a; 最近线上问题有点多啊&#xff0c;分享一个服务假死的排查过程。 问题描述 9点10分&#xff0c;收到进程无响应报警(一共6台机器&#xff0c;有1台出现)&#xff0c;后来又有1台出现。 排查思路 首先确认是否误报或者网络抖动&…

vue小记

1.vue绑定属性&#xff0c;点击事件 1.<!-- 完整语法 --> <a v-bind:href"url">...</a><!-- 缩写 --> <a :href"url">...</a>2.<!-- 完整语法 --> <a v-on:click"doSomething">...</a>&l…

nacos注册中心自动上下负载

大家好&#xff0c;我是烤鸭&#xff1a; 还有2天就过年了&#xff0c;祝大家新年快乐。最近好久没写技术文章了&#xff0c;还是得回归下主业&#xff0c;今天分享下nacos注册中心自动上下负载的方式和组件。 组件版本 <properties><java.version>1.8</java.v…

windows10 C盘清理

大家好&#xff0c;我是烤鸭&#xff1a; 身为一个号称修电脑的&#xff0c;磁盘清理是必备技能了。前几天刚出的新闻 男子帮女友清理电脑C盘&#xff0c;扫出17万个文件。 想必大家都经历过清理C盘的痛苦&#xff0c;这两天正好又清了&#xff0c;分享下。 先给个结论&#…

《实现领域驱动设计》读书笔记

大家好&#xff0c;我是烤鸭&#xff1a; 《实现领域驱动设计》&#xff0c;读书笔记&#xff0c;贴个封面&#xff0c;要不不知道是哪本。 了解概念 刚开始接触DDD&#xff0c;肯定懵逼&#xff0c;很多名词&#xff0c;一点点看下。 领域&#xff1a;带有业务属性的范…

spring junit单元测试

项目是有很多个功能块组成的&#xff0c;我们开发的时候&#xff0c;当我们开发出来一个功能&#xff0c;想要测试这个功能是否正确&#xff0c;不可能等到前端和后端全部写好了再进行测试&#xff0c;这样太浪费时间&#xff0c;有没有什么方法能直接测试后台的功能写的是否正…

windows docker redis

大家好&#xff0c;我是烤鸭&#xff1a; docker真的太方便了&#xff0c;尤其是对windows系统&#xff0c;友好的不得了。以前还只能是正版的专业版才能用&#xff0c;现在已经没有限制了&#xff0c;虽然加了收费&#xff0c;个人用免费就够了。redis 新版也不支持windows系统…