《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结

到目前为止我们已经大概学习了StringMVC的执行流程,以及详细的处理器映射器和处理器适配器的执行流程,并可以自己写一个配置方式开发的小Demo了。今天我们来总结一下实现一个Controller的几种方法。

一、实现Controller接口

 1/**
2 * 要实现Controller接口,这样就算是一个springmvc的Controller了。
3 * @author Jonas
4 *
5 */

6public class MyController implements Controller {
7
8    @Override
9    public ModelAndView handleRequest(HttpServletRequest request,
10        HttpServletResponse response)
 throws Exception 
{
11        ModelAndView mv = new ModelAndView();
12        mv.addObject("message","hello spring mvc world");
13        mv.setViewName("welcome");
14        return mv;
15    }
16
17}
1

这种方式采用的适配器是SimpleControllerHandlerAdapter。

二、实现HttpRequestHandler接口

 1public class HelloController implements HttpRequestHandler {
2
3    @Override
4    public void handleRequest(HttpServletRequest request,
5        HttpServletResponse response)
 throws ServletException, IOException 
{
6        request.setAttribute("message""Hello HttpRequestHandler world");
7        request.getRequestDispatcher("/WEB-INF/jsp/welcome.jsp").forward(request, response);
8    }
9
10}
1

这种方式和第一种完全不一样,该方式采用的适配器为HttpRequestHandlerAdapter。该类的handleRequest方法返回值为null,更多的是由程序员来实现的。比如上方的跳转页面。

三、继承AbstractController抽象类

 1public class MyController1 extends AbstractController {
2
3    @Override
4    protected ModelAndView handleRequestInternal(HttpServletRequest request,
5        HttpServletResponse response)
 throws Exception 
{
6        // TODO Auto-generated method stub
7        return null;
8    }
9
10}

该方式和第一种一样,都使用了SimpleControllerHandlerAdapter。不同的一点在于该方式采用了一种模版方法的方式进行实现。该方法可以限制HTTP的提交请求方式。在springmvc.xml中注册处理器的时候,添加property来进行注入属性。如下:

1<!-- 注册SpringMVC处理器 -->
2<bean id="myController" class="cn.wechatbao.controller.MyController1">
3
4    <property name="supportedMethods" value="POST"></property>
5
6</bean>

以上设置当前controller只支持POST请求。supportedMethods属性来自于AbstractController的父类WebContentGenerator类。

1public abstract class AbstractController extends WebContentGenerator implements Controller {
2
3    //...
4
5}

我们打开WebContentGenerator类,如下:

441889-20181120112849993-1226903782.png

四、继承MultiActionController类

 1public class MyController2 extends MultiActionController {
2
3    public ModelAndView doFirst(HttpServletRequest request,
4            HttpServletResponse response)
{
5        ModelAndView mv = new ModelAndView();
6        mv.addObject("message","hello first world");
7        mv.setViewName("welcome");
8        return mv;
9    }
10
11    public ModelAndView doSecond(HttpServletRequest request,
12            HttpServletResponse response)
{
13        ModelAndView mv = new ModelAndView();
14        mv.addObject("message","hello second world");
15        mv.setViewName("welcome");
16        return mv;
17    }
18
19}

springmvc.xml中需要如下配置:

 1<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
2    <property name="mappings">
3        <props>
4            <prop key="/multiAction/*.do">myController</prop>
5        </props>
6    </property>
7</bean>
8
9<!-- 注册SpringMVC处理器 -->
10<bean id="myController2" class="cn.wechatbao.controller.MyController2"></bean>

这样就实现了动态路径访问,原因是MultiActionController类内部使用了一个名叫InternalPathMethodNameResolver的内部方法名称路径解析器。该解析器将方法名作为资源名称进行解析,意味着,我们提交请求时要将方法名作为资源名称出现。如下:

1http://localhost:8080/SpringMVC/multiAction/doFirst.do
2http://localhost:8080/SpringMVC/multiAction/doSecond.do

但是该方法在Spring4.3以后就废弃了。不建议使用了,官方的解释为in favor of annotation-driven handler methods有利于注解驱动处理程序的方法。


关于作者: 王俊南(Jonas)

昨夜寒蛩不住鸣。惊回千里梦,已三更。起来独自绕阶行。人悄悄,帘外月胧明。 白首为功名。旧山松竹老,阻归程。欲将心事付瑶琴。知音少,弦断有谁听。

热门文章