1.1 spring mvc簡介
Spring mvc是一個類似于struts的mvc架構。那麼有程式猿會說,我學了struts,為啥還要學spring mvc?請看下面一組比較:
運作性能上:
Jsp+servlet>struts1>springmvc>struts2+freemarker>>struts2,ognl,值棧。
開發效率上,基本正好相反。值得強調的是,spring mvc開發效率和struts2不相上下。
采用spring mvc很容易就能寫出性能優秀的代碼,而采用struts2一不小心就會寫出糟糕的代碼,使程式的性能很低。
Springmvc C層架構的核心是 DispatcherServlet,它的作用是将請求分發給不同的後端處理器,也即使用了一種被稱為Front Controller(前端控制器)的模式。Springmvc 的C 層架構使用了後端控制器來、映射處理器和視圖解析器來共同完成C 層架構的主要工作。并且springmvc 的C 層架構還真正地把業務層處理的資料結果和相應的視圖拼成一個對象,即我們後面會經常用到的ModelAndView對象。
1.2 開發環境
開發工具:myeclipse8.6.1
資料庫:mysql5.5.23
伺服器: tomcat6.0.37
架構版本: spring3.2.2
1.3 Hello world程式開發
步驟一:在myeclipse8.6中建立web工程springmvc01,拷貝如下包到lib目下:

說明:commons-logging-1.1.3.jar是日志包,在下載下傳的struts2官方包裡面可以找到。其它的包都在spring3.2.2版本官方包裡面找到。
spring-aop-3.2.2.RELEASE.jar:與Aop 程式設計相關的包
spring-beans-3.2.2.RELEASE.jar:提供了簡捷操作bean 的接口
spring-context-3.2.2.RELEASE.jar:建構在beans 包基礎上,用來處理資源檔案及國際化。
spring-core-3.2.2.RELEASE.jar:spring 核心包
spring-web-3.2.2.RELEASE.jar:web 核心包,提供了web 層接口
spring-webmvc-3.2.2.RELEASE.jar:web 層的一個具體實作包,DispatcherServlet也位于此包中。
注意:以上包是springmvc開發所需要的最基本包,不能再精簡。
步驟二:編寫web.xml 配置檔案,代碼如下:
=================================web.xml========================
<?xmlversion="1.0" encoding="UTF-8"?>
<web-appversion="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
================================================================
說明: org.springframework.web.servlet.DispatcherServlet這裡其實是不需要及記住的,在src目錄下随便建立一個類,然後輸入dispa,按下快捷鍵,就會出現這串代碼,然後拷貝過來即可。
知識講解: DispatcherServlet 就是一個Servlet ,也是對請求進行轉發的核心Servlet 。在這裡即所有.do 的請求将首先被DispatcherServlet 處理,而DispatcherServlet它要作的工作就是對請求進行分發(也即是說把請求轉發給具體的Controller )。可以簡單地認為,它就是一個總控處理器,但事實上它除了具備總控處理理器對請求進行分發的能力外,還與spring 的IOC 容器完全內建在一起,進而可以更好地使用spring 的其它功能。在這裡還需留意
<servlet-name > springmvc </ servlet-name > ,下面會用到。
當然我們也可以多加一個
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
攔截字尾是.php的請求
步驟三: 在web-inf目錄下建立springmvc-servlet.xml的配置檔案,它的命名規則{servlet-name}-servlet.xml ,注意下劃線處。當DispatcherServlet啟動的時候,它會預設根據此規則到web-inf目錄下去找這個xml配置檔案。
=========================springmvc-servlet.xml==========================
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<beanid="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<propertyname="mappings">
<props>
<propkey="/hello.do">helloControl</prop>
</props>
</property>
</bean>
<bean id="helloControl" class="com.wx.controls.HelloWorld"></bean>
</beans>
==========================================================
注意:<!DOCTYPEbeansPUBLIC"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
這段文檔類型定義是不需要我們記的,在如圖所示的地方可以找到。
知識講解:[<beanid="simpleUrlHandlerMapping"]是配置一個映射處理器,把
/hello.do的請求交給名為helloControl的bean處理,注意上面畫橫線處。
步驟四:編寫控制器HelloWord.java,如下所示:
================================== HelloWord.java===================
package com.wx.controls;
import javax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloWorld implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("hello.jsp");
mav.addObject("message","HelloWorld!");
return mav;
}
}
====================================================================
知識講解:Controller是後端控制器的接口,springmvc會把對應的請求交給實作它的方法handleRequest去處理。ModelAndView 對象是包含視圖和業務資料的混合對象,即是說通過此對象,我們可以知道所傳回的相應頁面(比如這裡傳回hello.jsp 頁面),也可以在相應的頁面中擷取此對象所包含的業務資料(相當于完成了servlet中的 request.setAttribute()和request.getRequestDispatcher("hello.jsp")兩個工作),當然我們也可以new ModelAndView("forward:hello.do")的方式進行轉發請求,也可以new ModelAndView("redirect:hello.jsp")的方式重定向請求。
步驟五:在webroot根目錄下編寫hello.jsp,如下所示:
================================hello.jsp==========================
<body>
<h1>擷取值:${requestScope.message}</h1>
</body>
==================================================================
步驟六: 啟動tomcat,釋出項目,在位址欄輸入 http://localhost:8080/springmvc01/hello.do 進行測試。
Springmvc工作原理簡析:
(1 )啟動伺服器,根據web.xml 的配置加載前端控制器(也稱總控制器) DispatcherServlet 。加載(包括加載springmvc-servlet.xml)時會完成一系列的初始化動作。
(2 )根據servlet 的映射請求(上面的helloWorld 執行個體中針對.do 請求),并參照“控制器配置檔案(即springmvc-servlet.xml 這樣的配置檔案),把具體的請求分發給特定的後端控制器進行處理(比如上例會分發給HelloWorld 控制器進行處理)
(3 )後端控制器調用相應的邏輯層代碼,完成處理并傳回視圖對象(ModelAndView )給前端處理器。
(4 )前端控制器根據後端控制器傳回的 ModelAndView 對象,并結合一些配置(後續有說明),傳回一個相應的頁面給用戶端。
小結 :這種Front Controller 模式常應用在主流的web 架構中,比如典型的struts1.x 架構FrontController 模式:所有請求先交給一個前端處理器(總控處理器)處理,然後前端處理器會參照一些配置檔案再把具體的請求交給相應的後端處理器。後端處理器調用邏輯層代碼,并根據邏輯傳回相應的視圖對象給前端控制器。然後前端控制器再根據視圖對象傳回具體的頁面給用戶端(提示:和spring mvc一樣,在struts1.x 中前端控制器是Servlet, 而在struts2 中前端控制器是Filter )。 概述FrontController 模式:前端控制器預處理并分發請求給後端控制器,後端控制器進行真正的邏輯處理并傳回視圖對象,前端控器器根據視圖對象傳回具體頁面給用戶端。
聯系作者: