SpringMVC自定义处理器里的那些事

Spring MVC Controller详解
本文详细介绍了如何使一个普通类成为Spring MVC的Controller,包括实现Controller接口或继承AbstractController类的方法。此外,还探讨了如何在一个Controller中定义多个方法并根据URL路径调用不同方法的技术,涉及MethodNameResolver的不同实现。


一、如何让一个普通类成为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。(高大上的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
<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>
  
  <!-- 方法名称解析器 http://www.44wa.com/html/4/4843/-->
   <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>

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


内部资源对象实现效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值