第一個SpringMVC實例和解析(HelloSpringMVC)


1. 開發步驟:

(1)增加Spring支持

  下載Spring安裝包和其依賴的commons-logging.jar,復制到項目Web應用的lib文件夾(WebRoot/WEB-INF/lib);

Spring文件夾內容介紹:    

dccs: Spring相關文檔,包括開發指南、API參考文檔;

libs: jar包。分為:1)Spring框架calss文件的JAR包;2)Spring框架源文件的壓縮包,文件名以-source結尾; 3)Spring框架API文檔的壓縮包,文件名以-javadoc結尾;

schemas: Spring配置文件的XML Schema文檔;

其他.txt說明性文檔。

 

(2)配置前端控制器DispatchServlet

  在部署描述符web.xml中編輯配置DispatchServlet(WebRoot/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" version="3.1">
  <display-name>SM02</display-name>
  
  <!-- 配置SpringMVC前端控制器DispatcherServlet -->
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <!-- 指定SpringMVC配置文件spring-config.xml,用來將攔截的對應請求分發給對應的Controller-->
          <param-value>/WEB-INF/springmvc-config.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- 指定該springmvc的Servlet可以攔截的請求為所有請求("/"),
之后可以分發給對應的Controller
--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

 

(3)配置SpringMVC的Controller

  在SpringMVC的配置文件springmvc-config.xml中配置對應的Controller、對應的Java Bean、對應攔截的請求等

  (WEN-INF/springmvc-config.xml,路徑在web.xml的DispatcherServlet的配置中param-value子標簽中配置)

<?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>

  其中,Spring4.0之后可以不配置處理映射器、處理器適配器、視圖解析器,這些工作會默認完成。此處為顯式表現出SpringMVC工作流程。

 

(4)Controller類的實現

  HelloController類實現了Controller接口,用來處理"/hello"的單一請求,即瀏覽器發出http://localhost:8080/SM02/hello的請求時實際由該Controller處理。

 (src/org/fkit/controller/HelloController.java)

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;

/**
 * 一個實現了Controller接口的控制器
 * 可以處理一個單一的請求動作("/hello")
 * http://localhost:8080/SM02/hello
 */
public class HelloController implements Controller {
    private static final Log logger = LogFactory.getLog(HelloController.class);
    /**
     * handleRequest方法時Controller接口必須實現的方法
     * 返回一個ModelAndView對象,包含視圖名或視圖名和模型
     */
    public ModelAndView handleRequest(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        logger.info("handleRequest調用");
        
        //創建ModelAndView對象
        ModelAndView mv = new ModelAndView();
        
        //添加模型數據,可以是任意POJO對象,第一個參數是對該對象的命名,可在jsp中用EL表達式引用
        mv.addObject("message", "Hello SpringMVC");
        
        //設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面,參數指定該頁面路徑
        mv.setViewName("/WEB-INF/content/welcome.jsp");
        
        //返回ModelAndView對象
        return mv;
    }
}

 

(5)View頁面實現

  HelloController返回的頁面,用來顯式返回的視圖內容,在該Controller的ModelAndView對象的setViewName()中指定路徑。

  (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>

 

(6)結果展示

  在瀏覽器中輸入URL:http://localhost:8080/SM02/hello,返回以下視圖,表示訪問成功。

2. 執行流程解析

(1)用戶向服務器發送請求

(2)請求被DispatcherServlet攔截

(3)DispatcherServlet對請求URL(統一資源定位符)進行解析,得到URI(請求資源標識符)。根據該URI,調用HandlerMapping獲得該Handler(Controller)配置的所有相關對象,包括Handler對象以及Handler對象對應的攔截器,這些對象會被封裝到一個HandlerExecutionChain對象中返回。

(4)DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。HandlerAdapter的設計符合面向對象的單一職責原則,代碼架構清晰,便於維護,可復用性高。HandlerAdapter被用於處理多種Handler,調用Handler實際處理請求的方法。

(5)提取請求中的模型數據,執行Handler(Controller)。在填充Handler入參過程中,根據配置,Spring會做一些額外的工作(消息轉換、數據轉換、數據格式化、數據驗證...)

(6)Handler執行完成后向DispatcherServlet返回一個ModelAndView對象,對象中應包括視圖名,或視圖名和模型

(7)根據返回的對象,選擇合適的ViewResolver(視圖解析器),返回給DispatcherServlet。

(8)ViewResolver結和Model和View渲染視圖。

(9)將視圖渲染結果返回給客戶端。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM