淺談spring——spring MVC(十一)

來源:互聯網
上載者:User

springMVC架構主要是圍繞DispatcherServlet這個核心展開,它負責攔截請求並將其指派給相應的的處理器處理,然後將結果響應給使用者。包括註解驅動控制器、請求及響應資訊處理、視圖解析、本地化解析、上傳檔案解析、異常處理、表單綁定等


springMVC是基於Model2來實現的,利用處理器分離模型、視圖和控制,達到不同技術層級間鬆散層耦合的效果,提高系統靈活性、複用性和可維護性。而Model1則是將展現邏輯和商務邏輯集中在一起,耦合性高,不容易擴充。


spring MVC的整體架構:


整個架構中DispatcherServlet處於核心位置,負責協調不同組件完成請求處理和響應工作。

1. 首先用戶端發起一個HTTP請求,web伺服器接收這個請求,如果匹配DispatcherServlet的請求路徑(web.xml裡面配置),web容器會將該請求交由DispatcherServlet處理

2. DispatcherServlet接收這個請求後,根據請求資訊(URL、HTTP方法、請求參數、Cookie等)及HandlerMapping配置找到處理該請求的處理器(Handler)。我們可以將HandlerMapping看作是路由控制器,將Handler看作目標主機。實際上spring MVC並沒有單獨定義一個Handler介面,Handler只是一個虛擬概念,任何Object對象都可以作為要求處理常式

3. 當DispatcherServlet根據HandlerMapping找到對應的Handler後,通過HandlerAdapter對Handler進行封裝,再以統一的適配器介面調用Handler。HandlerAdapter充當一個適配器的角色,它以統一的介面對各種Handler方法進行調用。

如:SimpleControllerHandlerAdapter.java

public class SimpleControllerHandlerAdapter implements HandlerAdapter {public boolean supports(Object handler) {return (handler instanceof Controller);}public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return ((Controller) handler).handleRequest(request, response);}public long getLastModified(HttpServletRequest request, Object handler) {if (handler instanceof LastModified) {return ((LastModified) handler).getLastModified(request);}return -1L;}}

Controller.java

public interface Controller {ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;}

4. Handler處理器完成商務邏輯處理後會返回一個ModelAndView給DispatcherServlet,其中ModelAndView包含了視圖邏輯名和模型資料(k-v索引值對)

5. ModelAndView中包含的是“邏輯視圖名”而非真正的視圖對象,DispatcherServlet會藉助ViewResolver完成從邏輯視圖名到真實視圖對象的解析工作

6. 當得到真實的視圖對象View後,DispatcherServlet使用這個View對象對ModelAndView中的模型資料進行視圖渲染。

7. 最後將資訊響應給用戶端。會存在多種方式,html、xml 、json串、或圖片等等


執行個體:

1. 配置web.xml,指定業務層對應的Spring設定檔,定義DispatcherServlet

<servlet><servlet-name>mvcDispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvcDispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

容器初始化時會自動載入/WEB-INF/mvcDispatcher-servlet.xml設定檔,啟動web層的Spring容器(子容器)

2. 編寫處理器

/** * 類HelloWorldController.java的實現描述:TODO 類實現描述 *  * @author onlyone 2013-8-23 下午10:07:43 */public class HelloController implements Controller {    @Override    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {        // 1、收集參數        // 2、綁定參數到命令對象        // 3、調用業務對象        // 4、選擇下一個頁面        ModelAndView mv = new ModelAndView();        // 添加模型資料 可以是任意的POJO對象        mv.addObject("refundObject", "hello tom !");        // 設定邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面        mv.setViewName("hello");        return mv;    }}

3. 編寫視圖對象

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>This is the first sample of springMVC</title></head><body>Result is : ${refundObject}</body></html>

4. 配置Spring MVC的設定檔,使用控制器、視圖解析器生效

mvcDispatcher-servlet.xml

  <!-- HandlerMapping -->    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>        <!-- HandlerAdapter -->    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>        <!-- ViewResolver -->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>        <property name="prefix" value="/WEB-INF/jsp/"/>        <property name="suffix" value=".jsp"/>    </bean>        <!-- 處理器 -->    <bean name="/hello" class="com.alibaba.china.HelloController"/>

參考文章:http://jinnianshilongnian.iteye.com/blog/1752171

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.