深入理解Spring MVC
如何让一个普通类成为Controller?
方案一:实现接口Controller
解析:handleRequest(request,response)
方案二:继承AbstractController
解析:handleRequestInternal(request,response)
若处理器继承自AbstractController类,那么该控制器就具有了一些新功能。因为AbstractController类还继承自一个父类WebContentGenerator,WebContentGenerator具有supportMethods属性
部分源码实现:
原理:
发现AbstractController类中有一个handleRequest()方法,用到了模板方法设计模式。
保证该方法中去调度了一个抽象方法。抽象方法在子类中根据业务需求被重写。
applicationContext.xml:
还可以设置支持的HTTP数据提交方式。默认支持GET/POST/HEAD,限定请求提交方式
地址栏默认的是GET请求,输入的Post请求则报405
如果想在一个Controller中定义N个方法,让他们分别执行,如何实现?[继承自MultiActionController]
其次该如何去匹配这些方法?在这里引出一个方法名称解析器[MethodNameResolver]。
作用:将url地址中的资源路径和方法名称做一一对应
在MultiActionController中有一个成员变量
private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
MethodNameResolver接口:
两大实现类:
①InternalPathMethodNameResolver---在请求地址中指定方法名称
②PropertyMethodNameResolver
第一种方案关键代码:[InternalPathMethodNameResolver]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<bean class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name= "mappings" > <props> <prop key= "/*.do" >firstController</prop> </props> </property> </bean> <!-- 默认方法名称解析器--> <bean id= "nameResolver" class = "org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" ></bean> <bean id= "firstController" class = "cn.happy.controller.MyMultiController" > <property name= "methodNameResolver" ref= "nameResolver" ></property> </bean> |
第二种方案关键代码:[PropertyMethodNameResolver]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<bean class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name= "mappings" > <props> <prop key= "/*.do" >firstController</prop> </props> </property> </bean> <!-- 方法名称解析器 --> <bean id= "nameResolver" class = "org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver" > <property name= "mappings" > <props> <prop key= "/h1.do" >list</prop> <prop key= "/h2.do" >add</prop> </props> </property> </bean> <bean id= "firstController" class = "cn.happy.controller.MyMultiController" > <property name= "methodNameResolver" ref= "nameResolver" ></property> </bean> |
实现效果:
参数方法名称解析器 [ParameterMethodNameResolver]
关键代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<bean class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name= "mappings" > <props> <prop key= "/hello.do" >firstController</prop> </props> </property> </bean> <!-- 参数方法名称解析器 默认的是action--> <bean id= "nameResolver" class = "org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver" > <property name= "paramName" value= "actionName" ></property> </bean> <bean id= "firstController" class = "cn.happy.controller.MyMultiController" > <property name= "methodNameResolver" ref= "nameResolver" ></property> </bean> |
注:不指定paramName,默认是action
通过视图解析器引入外部或内部资源对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!-- 内部资源对象 --> <bean id= "internal" class = "org.springframework.web.servlet.view.JstlView" > <property name= "url" value= "/WEB-INF/jsp/index.jsp" ></property> </bean> <!-- 外部资源对象 --> <bean id= "jd" class = "org.springframework.web.servlet.view.RedirectView" > <property name= "url" value= "http://www.jd.com" ></property> </bean> <!-- 视图解析器 --> <bean class = "org.springframework.web.servlet.view.BeanNameViewResolver" ></bean> <!-- 处理器配置 --> <bean id= "/hello.do" class = "cn.happy.controller.MyController" ></bean> |
外部资源对象实现效果:跳转到京东首页
内部资源对象实现效果:
视图解析器——XmlViewResolver
分离配置信息
myView.xml
applicationContext.xml
内部资源:
外部资源:
深入理解Spring MVC的更多相关文章
- 理解Spring MVC Model Attribute和Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- 深入理解Spring MVC(山东数漫江湖)
初始工程 使用Spring Boot和web,thymeleaf的starter来设置初始工程.xml配置如下: <parent> <groupId>org.springf ...
- 【译】理解Spring MVC Model Attribute 和 Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- 深入理解Spring MVC 思想
目录 一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...
- 转载:深入理解Spring MVC 思想
原文作者:赵磊 原文地址:http://elf8848.iteye.com/blog/875830 目录 一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.sp ...
- (转载)spring mvc DispatcherServlet详解之一---处理请求深入解析
要深入理解spring mvc的工作流程,就需要先了解spring mvc的架构: 从上图可以看到 前端控制器DispatcherServlet在其中起着主导作用,理解了DispatcherServl ...
- spring mvc 基于注解的使用总结
本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...
- spring mvc 经典总结
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
- 使用 Spring 2.5 基于注解驱动的 Spring MVC
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...
随机推荐
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 【.net 深呼吸】限制执行代码的权限
前面好几篇文章,老周都跟大伙伴们聊了跟应用程序域有关的话题,干脆咱们一聊到底吧,做学问就应该这样,有恒心. App Domain的创建新应用程序域的方法中,有一个特殊的重载: public stati ...
- lua执行字节码的过程介绍
前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...
- ASP.NET Core的路由[3]:Router的创建者——RouteBuilder
在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
- XML技术之DOM4J解析器
由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...
- H3 BPM初次安装常见错误详解1-4
错误1: 首次安装完成无法访问,效果如下. 错误原因:没有配置IIS. 解决方法: 控制面板-程序-打开或关闭Windows功能,选择internet信息服务. 因为安装的时候没有没有iis,所以程序 ...
- jQuery标准的AJAX模板
$('#saveInformationTemplate_button').on('click', function(){ if(isEmpty($("#name").val())) ...
- git远程库GitHub
首先,注册一个GitHub(github.com)帐号,免费获得Git远程仓库 由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置: 第1步:创建SSH Key.在用 ...
- atitit.细节决定成败的适合情形与缺点
atitit.细节决定成败的适合情形与缺点 1. 在理论界有两种观点:一种是"细节决定成败",另一种是"战略决定成败".1 1.1. 格局决定成败,方向决定成败 ...