《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有利於註解驅動處理程序的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章