一、如何让一个普通类成为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>

  

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


内部资源对象实现效果:

又见SpringMVC的更多相关文章

  1. SpringMVC总结的部分教程及使用方法

    注:本文只用注解来实现 SpringMVC各种流程图流程图(其他的各种流程图)jsp.xml.action彼此之间的关系,都如何使用spring-mvc.xml如何配置,放在哪里?action中如何转 ...

  2. SpringMVC源码情操陶冶-InterceptorsBeanDefinitionParser拦截器解析器

    解析mvc:interceptors节点 观察下InterceptorsBeanDefinitionParser的源码备注 /** * {@link org.springframework.beans ...

  3. SpringMVC源码阅读:Controller中参数解析

    1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...

  4. form表单的action提交写到js中来,同时onclick事件也写在js中来。其action也可以通过ajax来提交的。

    1,html脚本 <body> <div style="display: none;"> <form id="submitForm" ...

  5. JavaWeb基础——JSON

    一.JSON是什么? JSON(JavaScript Object Notation).轻量级数据交换格式. JSON的后缀名:.json JSON的MINE类型:application/json 二 ...

  6. SpringMvc支持Ajax概述【见前两篇随笔--详述前后数据互通】

    1.原生javaWeb:不再用 1).导入GSON: 2).返回的数据用GSON转成json 3).写出去: 2.SpringMVC快速的完成ajax功能? 导包 jackson-annotation ...

  7. 这个SpringMVC的一直刷屏的问题你见过吗?无解

    严重: Servlet.service() for servlet DispatcherServlet threw exceptionjava.lang.StackOverflowError at o ...

  8. SpringMVC注解汇总(一)-定义

    本文根据开涛哥学习SpringMVC汇总而成,方便更好查阅! 网址:http://jinnianshilongnian.iteye.com/blog/1752171 注解式控制器简介 @Control ...

  9. SpringMVC文件上传和下载

    上传与下载 1文件上传 1.1加入jar包 文件上传需要依赖的jar包 1.2配置部件解析器 解析二进制流数据. <?xml version="1.0" encoding=& ...

随机推荐

  1. # ios开发 @property 和 Ivar 的区别

    ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...

  2. 《你不知道的JavaScript》整理(三)——对象

    一.语法 两种形式定义:文字形式和构造形式. //文字形式 var myObj = { key: value }; //构造形式 var myObj = new Object(); myObj.key ...

  3. js的单线程和异步

    前言 说到js的单线程(single threaded)和异步(asynchronous),很多同学不禁会想,这不是自相矛盾么?其实,单线程和异步确实不能同时成为一个语言的特性.js选择了成为单线程的 ...

  4. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  5. 使用h5的history改善ajax列表请求体验

    信息比较丰富的网站通常会以分页显示,在点“下一页”时,很多网站都采用了动态请求的方式,避免页面刷新.虽然大家都是ajax,但是从一些小的细节还是 可以区分优劣.一个小的细节是能否支持浏览器“后退”和“ ...

  6. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  7. .net 用户控件ascx.cs注册js脚本代码无效果

    在.net web项目中碰到一个比较奇怪的问题,网上没找到解决方案,先自己mark一下 问题描述: 添加一个用户控件ascx,在后端.cs添加js注册脚本,执行后没有弹出框 注册脚本为: this.P ...

  8. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  9. java多线程解读一(基础篇)

    一.线程的定义 每个应用程序内部都是由一个或多个的进程组成,而每个进程内部都是由许多具体的线程执行,所以,线程是每个程序执行的最小单位. 二.线程的实现 1.通过继承java.lang.Thread类 ...

  10. 浅谈为之奋斗过的Set接口

    Set接口 Set接口存储一组唯一,无序的对象 HashSet 是Set接口常用的实现类 HashSet允许集合元素值为null 操作数据的方法与List类似 Set接口不存在get()方法 set ...