又见SpringMVC
一、如何让一个普通类成为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> |
外部资源对象实现效果:跳转到京东首页
内部资源对象实现效果: