到目前为止咱们已经大概学习了StringMVC的执行流程,以及详细的处理器映射器和处理器适配器的执行流程,并能够本身写一个配置方式开发的小Demo了。今天咱们来总结一下实现一个Controller的几种方法。java
1、实现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。web
2、实现HttpRequestHandler接口spring
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,更多的是由程序员来实现的。好比上方的跳转页面。mvc
3、继承AbstractController抽象类app
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来进行注入属性。以下:jsp
<!-- 注册SpringMVC处理器 --> <bean id="myController" class="cn.wechatbao.controller.MyController1"> <property name="supportedMethods" value="POST"></property> </bean>
以上设置当前controller只支持POST请求。supportedMethods属性来自于AbstractController的父类WebContentGenerator类。ide
public abstract class AbstractController extends WebContentGenerator implements Controller { //... }
咱们打开WebContentGenerator类,以下:学习
4、继承MultiActionController类spa
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有利于注解驱动处理程序的方法。