深入理解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>

  

外部资源对象实现效果:跳转到京东首页



内部资源对象实现效果:

时间: 2024-10-15 14:31:23

深入理解Spring Mvc的相关文章

深入理解Spring MVC 思想

原文:http://www.cnblogs.com/baiduligang/p/4247164.html 深入理解Spring MVC 思想 目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 六.springMVC-mvc.xml 配置文件片段讲解 七.spring mvc 如何访问到静态的文件,如jpg,js,css 八.spring mvc 

【译】理解Spring MVC Model Attribute 和 Session Attribute

作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用时,理解这些作用域,如何将数据与对象和这些作用域交互是十分重要的.[在 StackOverflow 上有一篇文章可以帮助你快速了解 request 和 session 作用域] SPRING MVC 作用域 当我开始用 Spring MVC 编写 Web 应用时,我发现 Spring model 和

理解Spring MVC Model Attribute和Session Attribute

作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用时,理解这些作用域,如何将数据与对象和这些作用域交互是十分重要的.[在 StackOverflow 上有一篇文章可以帮助你快速了解 request 和 session 作用域] SPRING MVC 作用域 当我开始用 Spring MVC 编写 Web 应用时,我发现 Spring model 和

理解Spring MVC Model Attribute 和 Session Attribute

作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用时,理解这些作用域,如何将数据与对象和这些作用域交互是十分重要的.SPRING MVC 作用域当我开始用 Spring MVC 编写 Web 应用时,我发现 Spring model 和 session attribute 有一点神秘,尤其当它们与我熟知的 HTTP request 和 sessio

spring mvc 经典总结

概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller 的映射关系,仅仅使用注解就可以让一个 POJO 具有 Controller 的绝大部分功能 —— Spring MVC 框架的易用性得到了进一步的增强.在框架灵活性.易用性和扩展性上,Spring MVC 已经全面超越了其它的 MVC 框架,伴随

[读后感]spring Mvc 教程框架实例以及系统演示下载

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 不要好意思,昨晚写的,睡着忘发了,后附是篇好文,赶紧w分享一下. 感脚着,俺好像做了件聪明事儿,却不知会不会遭到不理解. 转载的好文,是不会推荐到

spring mvc DispatcherServlet详解之一---处理请求深入解析

要深入理解spring mvc的工作流程,就需要先了解spring mvc的架构: 从上图可以看到 前端控制器DispatcherServlet在其中起着主导作用,理解了DispatcherServlet 就完全可以说弄清楚了spring mvc. 为了加深对spring mvc的整个工作流程的理解,本文从分析DispatcherServlet的工作过程来一窥spring mvc的整个面貌. 1. 初始化 protected void initStrategies(ApplicationCont

[4] spring mvc学习笔记

基于spring MVC的用户管理 以实际小项目出发来深入理解spring MVC 1.首先是User类 public class User { private int id; private String username; private String password; private String nickname; private String email; 省略构造函数和get.set方法 } 2.接着UserController的编写 几点注意: (1).两种跳转方式,服务器端跳转

Spring MVC 编程基础

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 12.0pt; font-family: Consolas } h1 { margin-top: 17.0pt; margin-right: 0cm; margin-bottom: 16.5pt; margin-left: 21.25pt; text-align: justify