1. 程式人生 > >Spring MVC優勢和第一個入門程式

Spring MVC優勢和第一個入門程式

1、SpringMVC的優勢

    Spring框架提供了構建Web應用程式的全功能MVC模組——Spring MVC。Spring MVC框架提供了一個DispatcherServlet作用前端控制器來分派請求,同時提供靈活的配置處理程式對映、檢視解析、語言環境和主題解析,並支援檔案上傳。Spring MVC還包含了多種檢視技術,例如JSP、Velocity、Tiles、iText和POI等。Spring MVC分離了控制器、模型物件、分派器以及處理程式物件的角色,這種分離讓它們更容易進行定製。


Spring MVC的特點:
(1)Spring MVC擁有強大的靈活性、非入侵性和可配置性。
(2)Spring MVC 提供了一個前端控制器DispatcherServlet,開發者無須額外開發控制器物件。
(3)Spring MVC分工明確,包含控制器、驗證器、命令物件、模型物件、處理程式對映檢視解析器,等等,每一個功能實現由一個專門的物件負責完成。
(4)Spring MVC可以自動繫結使用者輸入,並正確地轉換資料型別。例如:Spring MVC能自動解析字串,並將其設定為模型的int或float型別的屬性。
(5)Spring MVC使用一個名稱/值的Map物件實現更加靈活的模型資料傳輸。
(6)Spring MVC內建了常見的校驗器,可以校驗使用者輸入,如果校驗不通過,則重定向回輸入表單。輸入校驗是可選的,並且支援程式設計方式及宣告方式。
(7)Spring MVC支援國際化,支援根據使用者區域顯示多國語言,並且國際化的配置非常簡單。
(8)Spring MVC支援多種檢視技術,最常見的有JSP技術以及其他技術,包括Velocity和FreeMarker。
(9)Spring 提供了一個簡單而強大的JSP標籤庫,支援資料繫結功能,使得編寫JSP頁面更加容易。


2、開發第一個Spring MVC應用

2.1基於xml配置開發


(1)首先開啟Eclipse,新建一個名為SpringMVCTest的Java Web專案,並且在WebContent路徑下的WEB-INF目錄下的lib目錄匯入如下圖所示jar包。
這裡寫圖片描述
(2)在WebContent路徑下的WEB-INF目錄下的web.xml檔案中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns
="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 定義Spring MVC的前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class
>
org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 讓Spring MVC的前端控制器攔截所有請求 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

在許多的SpringMVC框架中,都包含一個用於排程控制的Servlet。Spring MVC 也提供了一個名為 org.springframework.web.servlet.DispatcherServlet的Servlet充當前端控制器,所有的請求驅動都圍繞這個DispatcherServlet來分派請求。

(3)在Java目錄下的src目錄下新建包org.fkit.controller並且在包下建名為HelloController的類,如下所示:

package org.fkit.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
 *  HelloController是一個實現Controller介面的控制器,
 *  可以處理一個單一的請求動作
 */
public class HelloController implements Controller{
     private static final Log logger = LogFactory
                .getLog(SpringController.class);

     /**
      * handleRequest是Controller介面必須實現的方法。
      * 該方法的引數是對應請求的HttpServletRequest和HttpServletResponse。
      * 該方法必須返回一個包含檢視路徑或檢視路徑和模型的ModelAndView物件。
      * */
    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
         logger.info("handleRequest 被呼叫");
         // 建立準備返回的ModelAndView物件,該物件通常包含了返回檢視的路徑、模型的名稱以及模型物件
         ModelAndView mv = new ModelAndView();
         // 新增模型資料 可以是任意的POJO物件  
         mv.addObject("message", "Hello World!");  
         // 設定邏輯檢視名,檢視解析器會根據該名字解析到具體的檢視頁面  
         mv.setViewName("/WEB-INF/content/welcome.jsp"); 
        // 返回ModelAndView物件。
        return mv;
    }

}

    在Spring MVC 中處理請求的Java類被稱為Handle,在Spring2.5之前,開發一個Handle的唯一方法就是實現org.springframework.web.servlet.mvc.Controller介面。Controller介面必須實現一個方法,該方法簽名:`ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception`。

    Controller介面的實現類可以通過handleRequest方法傳遞的引數訪問對應請求的HttpServletRequest和HttpServletResponse物件,處理完業務之後,必須返回一個包含模型物件和檢視路徑的ModelAndView物件。

(4)在WebContent路徑下的WEB-INF目錄下新建名為springmvc-config.xml檔案的,內的程式碼如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

    <!-- 配置Handle,對映"/hello"請求 -->
    <bean name="/hello" class="org.fkit.controller.HelloController"/>   

    <!-- 處理對映器將bean的name作為url進行查詢,需要在配置Handle時指定name(即url) -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- SimpleControllerHandlerAdapter是一個處理器介面卡,所有處理介面卡都要實現 HandlerAdapter介面-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 檢視解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>

(5)在WebContent路徑下的WEB-INF目錄下新建名為content的目錄並且新建名為welcome.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>歡迎頁面</title>
</head>
<body>
<!-- 頁面可以訪問Controller傳遞傳遞出來的message -->
${requestScope.message}
</body>
</html>

2.2基於註解開發

我們基於註解開發的例子是基於上面的例子的,只需要進行一些修改就可以的。

(1)將springmvc-config.xml,修改成如下程式碼所示即可:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd     
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!-- spring可以自動去掃描base-pack下面的包或者子包下面的java檔案,
        如果掃描到有Spring的相關注解的類,則把這些類註冊為Spring的bean -->
    <context:component-scan base-package="org.fkit.controller"/>

    <!-- 配置處理對映器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

     <!-- 配置處理器介面卡-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 檢視解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

</beans>

這裡面主要是添加了約束檔案、包掃配置、型別處理對映器、型別處理介面卡。

(2)將HelloController類改成如下所示即可,主要是去掉實現Controller介面,和實現裡面的handleRequest方法。只是需要新增兩個註解@Controller和@RequestMapping(value=”/hello”)即可。

package org.fkit.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;


/**
 *  HelloController是一個基於註解的控制器,
 *  可以同時處理多個請求動作,並且無須實現任何介面。
 *  org.springframework.stereotype.Controller註解用於指示該類是一個控制器
 */
@Controller
public class HelloController{

     private static final Log logger = LogFactory
                .getLog(HelloController.class);

     /**
      * org.springframework.web.bind.annotation.RequestMapping註解
      * 用來對映請求的的URL和請求的方法等。本例用來對映"/hello"
      * hello只是一個普通方法。
      * 該方法返回一個包含檢視路徑或檢視路徑和模型的ModelAndView物件。
      * */
     @RequestMapping(value="/hello")
     public ModelAndView hello(){
         logger.info("hello方法 被呼叫");
         // 建立準備返回的ModelAndView物件,該物件通常包含了返回檢視的路徑、模型的名稱以及模型物件
         ModelAndView mv = new ModelAndView();
         //新增模型資料 可以是任意的POJO物件  
         mv.addObject("message", "Hello World!");  
         // 設定邏輯檢視名,檢視解析器會根據該名字解析到具體的檢視頁面  
         mv.setViewName("/WEB-INF/content/welcome.jsp"); 
        // 返回ModelAndView物件。
        return mv;
     }

}

3、Spring MVC應用的開發步驟

(1)在web.xml檔案中定義前端控制器DispatcherServlet來攔截使用者請求。

由於Web應用是基於請求響應架構的應用所以不管哪個MVC Web框架,都需要web.xml中配置該框架的核心Servlet或Filter,這樣才可以讓該框架介入Web應用中。

(2)如果需要以POST方式提交請求,則定義包含表單資料的JSP頁面。如果僅僅只是以GET方式來發送請求,則無須經過這一步。

(3)定義處理使用者請求的Handle類,可以實現Controller介面或使用@Controller註解。

這一步也是所有MVC框架中必不可少的,因為這個DispatcherServlet就是MVC中的C,也就是前端控制器,該控制器負責接收請求,並將請求分發給對應的Handle,即實現Controller介面的Java類,而該Java類負責呼叫後臺業務邏輯程式碼來處理請求。

(4)配置Handle。

Java領域的絕大部分MVC框架都非常喜歡使用xml檔案來進行配置管理,這在以前是一種思維定勢。即配置哪個請求對應哪個Controller進行處理,從而讓前端控制器根據該配置來建立合適的Controller例項,並呼叫該Controller的業務控制方法。

(5)編寫檢視資源。

當Handler處理使用者請求結束後,通常會返回一個ModelAndView物件,該物件應該包含返回的檢視名或檢視名和模型,這個檢視名就代表需要顯示的物理檢視資源。如果Handle需要把一些資料傳給檢視資源,則可以通過資源物件。

4、Spring MVC的執行流程

Spring MVC請求–>響應的完整工作流程如下:
(1)使用者想伺服器傳送請求,請求被Spring的前端控制器DispatcherServlet截獲。

(2)DispatcherServlet對請求URL進行解析,得到URL。然後根據該URL,呼叫HandlerMapping獲得該Handler配置的所有相關物件,包括Handler物件以及Handler對應的攔截器,這些物件會被封裝到一個HandlerExecutionChain物件當中返回。

(3)DispatcherServlet根據獲得的handler,選擇一個合適的HandlerAdapter。HandlerAdapter的設計符合面向物件中的單一職責原則,程式碼架構清晰,便於維護,最重要的是,程式碼可複用性高。HandlerAdapter會被用於處理多種Handler,呼叫Handler實際處理請求的方法。

(4)提取請求中的模型資料,開始執行Handler(Controller)。在填充Handler的入參過程中,根據配置,Spring將幫你做一些額外的工作。

    訊息轉換:將請求訊息(Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應訊息。
    資料轉換:對請求訊息進行資料轉換,如String轉換成Integer、Double等。
    資料格式化:對請求訊息進行資料格式化,如將字串轉換成格式化數字或者格式化日期等。
    資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中。

(5)Handler執行完成後,向DispatcherServlet返回一個ModelAndView物件,ModelAndView物件中包含檢視名或檢視名和模型。

(6)根據返回的ModelAndView物件,選擇一個合適的ViewResolver(檢視解析器)返回給DispatcherServlet。

(7)ViewResolver結合Model和View來渲染檢視。

(8)將檢視渲染結果返回給客戶端。