Spring MVC入門


1.1、Spring Web MVC是什么
Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。

1.2、Spring Web MVC能幫我們做什么
√讓我們能非常簡單的設計出干凈的Web層和薄薄的Web層;
√進行更簡潔的Web層的開發;
√天生與Spring框架集成(如IoC容器、AOP等);
√提供強大的約定大於配置的契約式編程支持;
√能簡單的進行Web層的單元測試;
√支持靈活的URL到頁面控制器的映射;
√非常容易與其他視圖技術集成,如Velocity、FreeMarker等等,因為模型數據不放在特定的API里,而是放在一個Model里(Map數據結構實現,因此很容易被其他框架使用);
√非常靈活的數據驗證、格式化和數據綁定機制,能使用任何對象進行數據綁定,不必實現特定框架的API;
√提供一套強大的JSP標簽庫,簡化JSP開發;
√支持靈活的本地化、主題等解析;
√更加簡單的異常處理;
√對靜態資源的支持;
√支持Restful風格。

1.3、Spring Web MVC架構
Spring Web MVC框架也是一個基於請求驅動的Web框架,並且也使用了前端控制器模式來進行設計,再根據請求映射規則分發給相應的頁面控制器(動作/處理器)進行處理。首先讓我們整體看一下Spring Web MVC處理請求的流程:

具體執行步驟如下:
1、首先用戶發送請求————>前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委托給它,即以前的控制器的控制邏輯部分;圖中的1、2步驟;
2、頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,並進行驗證,然后將命令對象委托給業務對象進行處理;處理完畢后返回一個ModelAndView(模型數據和邏輯視圖名);圖中的3、4、5步驟;
3、前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;圖中的步驟6、7;
4、前端控制器再次收回控制權,將響應返回給用戶,圖中的步驟8;至此整個結束。

1.4、Hello World入門
1.4.1、准備開發環境和運行環境:

☆工程:動態web工程(springmvc)
☆spring框架下載:
spring-framework-3.1.1.RELEASE-with-docs.zip
☆依賴jar包:
1、Spring框架jar包:
為了簡單,將spring-framework-3.1.1.RELEASE-with-docs.zip/dist/下的所有jar包拷貝到項目的WEB-INF/lib目錄下;
2、Spring框架依賴的jar包:
需要添加Apache commons logging日志,此處使用的是commons.logging-1.1.1.jar;
需要添加jstl標簽庫支持,此處使用的是jstl-1.1.2.jar和standard-1.1.2.jar;

1.4.2、前端控制器的配置
在我們的web.xml中添加如下配置:

    <servlet>
        <servlet-name>chapter2</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- load-on-startup:表示啟動容器時初始化該Servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>chapter2</servlet-name>
        <!-- url-pattern:表示哪些請求交給Spring Web MVC處理, "/"是用來定義默認servlet映射的。也可以如"*.html"表示攔截所有以html為擴展名的請求。 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

load-on-startup:表示啟動容器時初始化該Servlet;
url-pattern:表示哪些請求交給Spring Web MVC處理,“/”是用來定義默認servlet映射的。也可以如“*.html”表示攔截所有以html為擴展名的請求。

自此請求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置文件,默認DispatcherServlet會加載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。本示例為WEB-INF/chapter2-servlet.xml。

1.4.3、在Spring配置文件中配置HandlerMapping、HandlerAdapter具體配置在WEB-INF/chapter2-servlet.xml文件中:

    <!-- 表示將請求的URL和Bean名字映射,如URL為 “上下文/hello”,則Spring配置文件必須有一個名字為“/hello”的Bean,上下文默認忽略。 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

    <!-- 表示所有實現了org.springframework.web.servlet.mvc.Controller接口的Bean可以作為Spring Web MVC中的處理器。如果需要其他類型的處理器可以通過實現HadlerAdapter來解決。 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

BeanNameUrlHandlerMapping:表示將請求的URL和Bean名字映射,如URL為 “上下文/hello”,則Spring配置文件必須有一個名字為“/hello”的Bean,上下文默認忽略。
SimpleControllerHandlerAdapter:表示所有實現了org.springframework.web.servlet.mvc.Controller接口的Bean可以作為Spring Web MVC中的處理器。如果需要其他類型的處理器可以通過實現HadlerAdapter來解決。

1.4.4、在Spring配置文件中配置ViewResolver
具體配置在WEB-INF/chapter2-servlet.xml文件中:

    <!-- InternalResourceViewResolver:用於支持Servlet、JSP視圖解析;
         viewClass:JstlView表示JSP模板頁面需要使用JSTL標簽庫,classpath中必須包含jstl的相關jar包;
         prefix和suffix:查找視圖頁面的前綴和后綴(前綴[邏輯視圖名]后綴),比如傳進來的邏輯視圖名為hello,則該jsp視圖頁面應該存放在“WEB-INF/jsp/hello.jsp”; -->
    <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>

InternalResourceViewResolver:用於支持Servlet、JSP視圖解析;
viewClass:JstlView表示JSP模板頁面需要使用JSTL標簽庫,classpath中必須包含jstl的相關jar包;
prefix和suffix:查找視圖頁面的前綴和后綴(前綴[邏輯視圖名]后綴),比如傳進來的邏輯視圖名為hello,則該該jsp視圖頁面應該存放在“WEB-INF/jsp/hello.jsp”;

1.4.5、開發處理器/頁面控制器

package com.test.ljq;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
 * 頁面控制器
 * 
 * @author 林計欽
 * @version 1.0 2013-11-1 下午05:39:25
 */
public class HelloWorldController implements Controller {
    //org.springframework.web.servlet.mvc.Controller:頁面控制器/處理器必須實現Controller接口,注意別選錯了;后邊我們會學習其他的處理器實現方式;
    //public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能處理方法,實現相應的功能處理,比如收集參數、驗證參數、綁定參數到命令對象、將命令對象傳入業務對象進行業務處理、最后返回ModelAndView對象;
    //ModelAndView:包含了視圖要實現的模型數據和邏輯視圖名;例如:
    //“mv.addObject("message", "Hello World!");”表示添加模型數據,此處可以是任意POJO對象;
    //“mv.setViewName("hello");”表示設置邏輯視圖名為“hello”,視圖解析器會將其解析為具體的視圖,如前邊的視圖解析器InternalResourceVi。Resolver會將其解析為“WEB-INF/jsp/hello.jsp”。
     
    //我們需要將其添加到Spring配置文件(WEB-INF/chapter2-servlet.xml),讓其接受Spring IoC容器管理:
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        // 1、收集參數、驗證參數
        // 2、綁定參數到命令對象
        // 3、將命令對象傳入業務對象進行業務處理
        // 4、選擇下一個頁面
        ModelAndView mv = new ModelAndView();
        // 添加模型數據,可以是任意的POJO對象
        mv.addObject("message", "Hello World!");
        // 設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面
        mv.setViewName("hello");
        return mv;
    }
}

org.springframework.web.servlet.mvc.Controller:頁面控制器/處理器必須實現Controller接口,注意別選錯了;后邊我們會學習其他的處理器實現方式;
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能處理方法,實現相應的功能處理,比如收集參數、驗證參數、綁定參數到命令對象、將命令對象傳入業務對象進行業務處理、最后返回ModelAndView對象;
ModelAndView:包含了視圖要實現的模型數據和邏輯視圖名;“mv.addObject("message", "Hello World!");
”表示添加模型數據,此處可以是任意POJO對象;“mv.setViewName("hello");”表示設置邏輯視圖名為“hello”,視圖解析器會將其解析為具體的視圖,如前邊的視圖解析器InternalResourceVi。wResolver會將其解析為“WEB-INF/jsp/hello.jsp”。


我們需要將其添加到Spring配置文件(WEB-INF/chapter2-servlet.xml),讓其接受Spring IoC容器管理:

    <!-- 處理器 -->  
    <bean name="/hello" class="com.test.ljq.HelloWorldController"/> 

name="/hello":前邊配置的BeanNameUrlHandlerMapping,表示如過請求的URL為 “上下文/hello”,則將會交給該Bean進行處理。

1.4.6、開發視圖頁面
創建/WEB-INF/jsp/hello.jsp視圖頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>Insert title here</title>

    </head>
    <body>
        ${message}
    </body>
</html>


${message}:表示顯示由HelloWorldController處理器傳過來的模型數據。

1.4.7、啟動服務器運行測試
通過請求:http://localhost:8083/springmvc/hello,如果頁面輸出“Hello World! ”就表明我們成功了!


免責聲明!

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



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