理解springmvc中的Controller

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

  

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

 


内部资源对象实现效果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值