处理器不但可以实现Controller和HttpRequestHandler接口,还能继承实现了对应接口的抽象类
常用的有两个
- AbstractController (继承了WebContentGenerator类,实现了Controller接口)
继承该类后需要复写handleRequestInternal方法。
贴上AbstractController部分源码。
WebContentGenerator类有supportedMethods变量(设置允许的用户请求方式,POST or GET),可以在springmvc.xml中配置。value必须大写,默认为POST,GET
<bean id="/my.do" class="com.bjpowernode.handlers.MyController">
<property name="supportedMethods" value="POST"/>
</bean>
- MultiActionController (继承了AbstractController类,实现了LastModified接口)
主要特点可以自定义处理器方法(返回值要是ModelAndView)。
public class MyController extends MultiActionController {
public ModelAndView doFirst(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "执行doFirst()方法");
mv.setViewName("/WEB-INF/jsp/welcome.jsp");
return mv;
}
public ModelAndView doSecond(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "执行doSecond()方法");
mv.setViewName("/WEB-INF/jsp/welcome.jsp");
return mv;
}
}
需要在springmvc.xml配置处理器映射器SimpleUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<!-- MultiActionController类具有一个属性methodNameResolver,方法名解析器
其具有默认值InternalPathMethodNameResolver,该解析器将方法名作为资源名称进行解析,
那就意味着,我们提交请求时,要将方法名作为资源名称出现
-->
<entry key="/my/*.do" value-ref="myController"/>
</map>
</property>
</bean>
<!-- 注册处理器 -->
<bean id="myController" class="com.bjpowernode.handlers.MyController"/>
此时访问/my/doFirst.do执行的是doFirst()方法,访问/my/doSecond.do执行的是doSecond()方法
以上使用的默认的方法名解析器InternalPathMethodNameResolver,当然,还能自行配置别的方法名解析器
可以使用的方法名解析器还有
PropertiesMethodNameResolver(属性方法名解析器)【此时访问/my/first.do 执行的doFirst方法,/my/second.do则是doSecond方法】
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/my/*.do" value-ref="myController"/>
</map>
</property>
</bean>
<!-- 注册方法名称解析器 -->
<bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/my/first.do">doFirst</prop>
<prop key="/my/second.do">doSecond</prop>
</props>
</property>
</bean>
<!-- 注册处理器 -->
<bean id="myController" class="com.bjpowernode.handlers.MyController">
<property name="methodNameResolver" ref="propertiesMethodNameResolver"/>
</bean>
ParameterMethdoNameResolver(参数方法名解析器)【此时访问/my.do?xxx=doFirst就可以只喜欢那个doFirst】
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/my.do" value-ref="myController"/>
</map>
</property>
</bean>
<!-- 注册方法名称解析器 -->
<bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!-- 若不指定paramName属性,则默认参数名称是action -->
<property name="paramName" value="xxx"/>
</bean>
<!-- 注册处理器 -->
<bean id="myController" class="com.bjpowernode.handlers.MyController">
<property name="methodNameResolver" ref="parameterMethodNameResolver"/>
</bean>