zoukankan      html  css  js  c++  java
  • 《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结

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

    一、实现Controller接口

    /**
     * 要实现Controller接口,这样就算是一个springmvc的Controller了。
     * @author Jonas
     *
     */
    public class MyController implements Controller {
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
            ModelAndView mv = new ModelAndView();
            mv.addObject("message","hello spring mvc world");
            mv.setViewName("welcome");
            return mv;
        }
    
    }
        
    

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

    二、实现HttpRequestHandler接口

    public class HelloController implements HttpRequestHandler {
    
     
        @Override
    
        public void handleRequest(HttpServletRequest request,
    
            HttpServletResponse response) throws ServletException, IOException {
    
            request.setAttribute("message", "Hello HttpRequestHandler world");
    
            request.getRequestDispatcher("/WEB-INF/jsp/welcome.jsp").forward(request, response);
    
        }
    
     
    
    }    
    

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

    三、继承AbstractController抽象类

    public class MyController1 extends AbstractController {
    
    	@Override
    
    	protected ModelAndView handleRequestInternal(HttpServletRequest request,
    		HttpServletResponse response) throws Exception {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    }
    

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

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

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

    public abstract class AbstractController extends WebContentGenerator implements Controller {
    
        //...
    
    }

    我们打开WebContentGenerator类,如下:

     

    四、继承MultiActionController类

    public class MyController2 extends MultiActionController {
    
        public ModelAndView doFirst(HttpServletRequest request,
                HttpServletResponse response){
            ModelAndView mv = new ModelAndView();
            mv.addObject("message","hello first world");
            mv.setViewName("welcome");
            return mv;
        }
        
        public ModelAndView doSecond(HttpServletRequest request,
                HttpServletResponse response){
            ModelAndView mv = new ModelAndView();
            mv.addObject("message","hello second world");
            mv.setViewName("welcome");
            return mv;
        }
    
    }

    springmvc.xml中需要如下配置:

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/multiAction/*.do">myController</prop>
            </props>
        </property>
    </bean>
    
    <!-- 注册SpringMVC处理器 -->
    <bean id="myController2" class="cn.wechatbao.controller.MyController2"></bean>

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

    http://localhost:8080/SpringMVC/multiAction/doFirst.do

    http://localhost:8080/SpringMVC/multiAction/doSecond.do

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

  • 相关阅读:
    opencv-0-项目启程
    [SketchUp]-绘制自己的家
    C51_PID 水温控制系统
    latex-列表环境
    nCOV 数据简要分析 (0326)
    引入OpenCV导致私有内存巨大
    【带着canvas去流浪(15)】threejs fundamentals翻译系列1-scene graph
    【一统江湖的大前端(9)】TensorFlow.js 开箱即用的深度学习工具
    【一统江湖的大前端(8)】matter.js 经典物理
    2019年12月前端面经及总结(西安,杭州)
  • 原文地址:https://www.cnblogs.com/xinhudong/p/9987923.html
Copyright © 2011-2022 走看看