到目前爲止咱們已經大概學習了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有利於註解驅動處理程序的方法。