深入理解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 ...
随机推荐
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- Database Replay和Consolidated Database replay
简介 在数据库的迁移和升级场景中,我们经常会遇到一个问题:在做压力测试时,如何模拟真实的业务压力,解决这个问题的方法有很多,比如:应用方开发模拟程序或者使用压力测试工具模拟,如load runner, ...
- 我为NET狂官方面试题-数据库篇
求结果:select "1"? 查找包含"objs"的表?查找包含"o"的数据库? 求今天距离2002年有多少年,多少天? 请用一句SQL获 ...
- 10个最好用的HTML/CSS 工具、插件和资料库
大家在使用HTML/CSS开发项目的过程中,有使用过哪些工具,插件和库?下面介绍的10种HTML/CSS工具,插件和资料库,是国外程序员经常用到的. Firebug Lite FirebugLite ...
- Python的单元测试(二)
title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...
- iOS开发之Masonry框架源码深度解析
Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...
- iOS逆向工程之KeyChain与Snoop-it
今天博客的主题是Keychain, 在本篇博客中会通过一个登陆的Demo将用户名密码存入到KeyChain中,并且查看一下KeyChain中存的是什么东西,把这些内容给导出来.当然本篇博客的重点不是如 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Dropzone.js实现文件拖拽上传
dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...
- iOS开发--ChildViewController实现订单页的切换
先不说废话, 上效果图, 代码量也不大, 也不上传github骗星星了, 你们复制粘贴下代码, 就可以轻而易举的弄出一个小demo. 这个代码的实现并不复杂, 甚至于说非常简单, 就是逻辑有点小绕, ...