亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring MVC入門_動力節(jié)點Java學院整理

 更新時間:2017年08月31日 10:52:14   作者:張開濤  
這篇文章主要介紹了Spring MVC入門,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的。另外還有一種基于組件的、事件驅(qū)動的Web框架在此就不介紹了,如Tapestry、JSF等。

Spring Web MVC也是服務(wù)到工作者模式的實現(xiàn),但進行可優(yōu)化。前端控制器是DispatcherServlet;應(yīng)用控制器其實拆為處理器映射器(Handler Mapping)進行處理器管理和視圖解析器(View Resolver)進行視圖管理;頁面控制器/動作/處理器為Controller接口(僅包含ModelAndView handleRequest(request, response) 方法)的實現(xiàn)(也可以是任何的POJO類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數(shù)據(jù)驗證、格式化和數(shù)據(jù)綁定機制;提供了強大的約定大于配置(慣例優(yōu)先原則)的契約式編程支持。

Spring Web MVC能幫我們做什么

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

Spring Web MVC架構(gòu)

Spring Web MVC框架也是一個基于請求驅(qū)動的Web框架,并且也使用了前端控制器模式來進行設(shè)計,再根據(jù)請求映射規(guī)則分發(fā)給相應(yīng)的頁面控制器(動作/處理器)進行處理。首先讓我們整體看一下Spring Web MVC處理請求的流程:

Spring Web MVC處理請求的流程

如圖2-1

圖2-1

具體執(zhí)行步驟如下:

1、  首先用戶發(fā)送請求————>前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;

2、  頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數(shù)到一個對象,這個對象在Spring Web MVC中叫命令對象,并進行驗證,然后將命令對象委托給業(yè)務(wù)對象進行處理;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名);圖2-1中的3、4、5步驟;

3、  前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;圖2-1中的步驟6、7;

4、  前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶,圖2-1中的步驟8;至此整個結(jié)束。

問題:

1、  請求如何給前端控制器?
2、  前端控制器如何根據(jù)請求信息選擇頁面控制器進行功能處理?
3、  如何支持多種頁面控制器呢?
4、  如何頁面控制器如何使用業(yè)務(wù)對象?
5、  頁面控制器如何返回模型數(shù)據(jù)?
6、  前端控制器如何根據(jù)頁面控制器返回的邏輯視圖名選擇具體的視圖進行渲染?
7、  不同的視圖技術(shù)如何使用相應(yīng)的模型數(shù)據(jù)?

首先我們知道有如上問題,那這些問題如何解決呢?請讓我們先繼續(xù),在后邊依次回答。

Spring Web MVC架構(gòu)

1、Spring Web MVC核心架構(gòu)圖,如圖2-2

圖2-2

架構(gòu)圖對應(yīng)的DispatcherServlet核心代碼如下:

//前端控制器分派方法 
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    HttpServletRequest processedRequest = request; 
    HandlerExecutionChain mappedHandler = null; 
    int interceptorIndex = -1; 
 
    try { 
      ModelAndView mv; 
      boolean errorView = false; 
 
      try { 
          //檢查是否是請求是否是multipart(如文件上傳),如果是將通過MultipartResolver解析 
        processedRequest = checkMultipart(request); 
          //步驟2、請求到處理器(頁面控制器)的映射,通過HandlerMapping進行映射 
        mappedHandler = getHandler(processedRequest, false); 
        if (mappedHandler == null || mappedHandler.getHandler() == null) { 
          noHandlerFound(processedRequest, response); 
          return; 
        } 
          //步驟3、處理器適配,即將我們的處理器包裝成相應(yīng)的適配器(從而支持多種類型的處理器) 
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
 
         // 304 Not Modified緩存支持 
        //此處省略具體代碼 
 
        // 執(zhí)行處理器相關(guān)的攔截器的預處理(HandlerInterceptor.preHandle) 
        //此處省略具體代碼 
 
        // 步驟4、由適配器執(zhí)行處理器(調(diào)用處理器相應(yīng)功能處理方法) 
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 
 
        // Do we need view name translation? 
        if (mv != null && !mv.hasView()) { 
          mv.setViewName(getDefaultViewName(request)); 
        } 
 
        // 執(zhí)行處理器相關(guān)的攔截器的后處理(HandlerInterceptor.postHandle) 
        //此處省略具體代碼 
      } 
      catch (ModelAndViewDefiningException ex) { 
        logger.debug("ModelAndViewDefiningException encountered", ex); 
        mv = ex.getModelAndView(); 
      } 
      catch (Exception ex) { 
        Object handler = (mappedHandler != null ? mappedHandlergetHandler() : null); 
        mv = processHandlerException(processedRequest, response, handler, ex); 
        errorView = (mv != null); 
      } 
 
      //步驟5 步驟6、解析視圖并進行視圖的渲染 
//步驟5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale)) 
//步驟6 視圖在渲染時會把Model傳入(view.render(mv.getModelInternal(), request, response);) 
      if (mv != null && !mv.wasCleared()) { 
        render(mv, processedRequest, response); 
        if (errorView) { 
          WebUtils.clearErrorRequestAttributes(request); 
        } 
      } 
      else { 
        if (logger.isDebugEnabled()) { 
          loggerdebug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() + 
              "': assuming HandlerAdapter completed request handling"); 
        } 
      } 
 
      // 執(zhí)行處理器相關(guān)的攔截器的完成后處理(HandlerInterceptor.afterCompletion) 
      //此處省略具體代碼 
 
 
    catch (Exception ex) { 
      // Trigger after-completion for thrown exception 
      triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); 
      throw ex; 
    } 
    catch (Error err) { 
      ServletException ex = new NestedServletException("Handler processing failed", err); 
      // Trigger after-completion for thrown exception. 
      triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); 
      throw ex; 
    } 
 
    finally { 
      // Clean up any resources used by a multipart request 
      if (processedRequest != request) { 
        cleanupMultipart(processedRequest); 
      } 
    } 
  } 

核心架構(gòu)的具體流程步驟如下:

1、  首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統(tǒng)一訪問點,進行全局的流程控制;

2、  DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;

3、  DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設(shè)計模式的應(yīng)用,從而很容易支持很多類型的處理器;

4、  HandlerAdapter——>處理器功能處理方法的調(diào)用,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個ModelAndView對象(包含模型數(shù)據(jù)、邏輯視圖名);

5、  ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術(shù);

6、  View——>渲染,View會根據(jù)傳進來的Model模型數(shù)據(jù)進行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);

7、返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶,到此一個流程結(jié)束。

此處我們只是講了核心流程,沒有考慮攔截器、本地解析、文件上傳解析等,后邊再細述。

到此,再來看我們前邊提出的問題:

1、  請求如何給前端控制器?這個應(yīng)該在web.xml中進行部署描述,在HelloWorld中詳細講解。
2、  前端控制器如何根據(jù)請求信息選擇頁面控制器進行功能處理? 我們需要配置HandlerMapping進行映射
3、  如何支持多種頁面控制器呢?配置HandlerAdapter從而支持多種類型的頁面控制器
4、  如何頁面控制器如何使用業(yè)務(wù)對象?可以預料到,肯定利用Spring IoC容器的依賴注入功能
5、  頁面控制器如何返回模型數(shù)據(jù)?使用ModelAndView返回
6、  前端控制器如何根據(jù)頁面控制器返回的邏輯視圖名選擇具體的視圖進行渲染? 使用ViewResolver進行解析
7、  不同的視圖技術(shù)如何使用相應(yīng)的模型數(shù)據(jù)? 因為Model是一個Map數(shù)據(jù)結(jié)構(gòu),很容易支持其他視圖技術(shù)

在此我們可以看出具體的核心開發(fā)步驟:

1、  DispatcherServlet在web.xml中的部署描述,從而攔截請求到Spring Web MVC
2、  HandlerMapping的配置,從而將請求映射到處理器
3、  HandlerAdapter的配置,從而支持多種類型的處理器
4、  ViewResolver的配置,從而將邏輯視圖名解析為具體視圖技術(shù)
5、處理器(頁面控制器)的配置,從而進行功能處理

上邊的開發(fā)步驟我們會在Hello World中詳細驗證。

Spring Web MVC優(yōu)勢

1、清晰的角色劃分:前端控制器(DispatcherServlet)、請求到處理器映射(HandlerMapping)、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)、處理器或頁面控制器(Controller)、驗證器(   Validator)、命令對象(Command  請求參數(shù)綁定到的對象就叫命令對象)、表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)。
2、分工明確,而且擴展點相當靈活,可以很容易擴展,雖然幾乎不需要;
3、由于命令對象就是一個POJO,無需繼承框架特定API,可以使用命令對象直接作為業(yè)務(wù)對象;
4、和Spring 其他框架無縫集成,是其它Web框架所不具備的;
5、可適配,通過HandlerAdapter可以支持任意的類作為處理器;
6、可定制性,HandlerMapping、ViewResolver等能夠非常簡單的定制;
7、功能強大的數(shù)據(jù)驗證、格式化、綁定機制;
8、利用Spring提供的Mock對象能夠非常簡單的進行Web層單元測試;
9、本地化、主題的解析的支持,使我們更容易進行國際化和主題的切換。
10、強大的JSP標簽庫,使JSP編寫更容易。

………………還有比如RESTful風格的支持、簡單的文件上傳、約定大于配置的契約式編程支持、基于注解的零配置支持等等。
到此我們已經(jīng)簡單的了解了Spring Web MVC,接下來讓我們來個實例來具體使用下這個框架。

Hello World入門

準備開發(fā)環(huán)境和運行環(huán)境:

☆開發(fā)工具:eclipse
☆運行環(huán)境:tomcat6.0.20
☆工程:動態(tài)web工程(springmvc-chapter2)
☆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;
前端控制器的配置
在我們的web.xml中添加如下配置:

<servlet> 
  <servlet-name>chapter2</servlet-name> 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
  <servlet-name>chapter2</servlet-name> 
  <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。

在Spring配置文件中配置HandlerMapping、HandlerAdapter

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

<!-- HandlerMapping --> 
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
 
<!-- HandlerAdapter --> 
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

BeanNameUrlHandlerMapping:表示將請求的URL和Bean名字映射,如URL為 “上下文/hello”,則Spring配置文件必須有一個名字為“/hello”的Bean,上下文默認忽略。

SimpleControllerHandlerAdapter:表示所有實現(xiàn)了org.springframework.web.servlet.mvc.Controller接口的Bean可以作為Spring Web MVC中的處理器。如果需要其他類型的處理器可以通過實現(xiàn)HadlerAdapter來解決。

在Spring配置文件中配置ViewResolver

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

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

InternalResourceViewResolver:用于支持Servlet、JSP視圖解析;

viewClass:JstlView表示JSP模板頁面需要使用JSTL標簽庫,classpath中必須包含jstl的相關(guān)jar包;

prefix和suffix:查找視圖頁面的前綴和后綴(前綴[邏輯視圖名]后綴),比如傳進來的邏輯視圖名為hello,則該該jsp視圖頁面應(yīng)該存放在“WEB-INF/jsp/hello.jsp”;

開發(fā)處理器/頁面控制器

package com.bjpowernode.chapter2.web.controller; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.Controller; 
public class HelloWorldController implements Controller { 
  @Override 
  public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { 
    //1、收集參數(shù)、驗證參數(shù) 
    //2、綁定參數(shù)到命令對象 
    //3、將命令對象傳入業(yè)務(wù)對象進行業(yè)務(wù)處理 
    //4、選擇下一個頁面 
    ModelAndView mv = new ModelAndView(); 
    //添加模型數(shù)據(jù) 可以是任意的POJO對象 
    mv.addObject("message", "Hello World!"); 
    //設(shè)置邏輯視圖名,視圖解析器會根據(jù)該名字解析到具體的視圖頁面 
    mv.setViewName("hello"); 
    return mv; 
  } 
} 

org.springframework.web.servlet.mvc.Controller:頁面控制器/處理器必須實現(xiàn)Controller接口,注意別選錯了;后邊我們會學習其他的處理器實現(xiàn)方式;

public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能處理方法,實現(xiàn)相應(yīng)的功能處理,比如收集參數(shù)、驗證參數(shù)、綁定參數(shù)到命令對象、將命令對象傳入業(yè)務(wù)對象進行業(yè)務(wù)處理、最后返回ModelAndView對象;

ModelAndView:包含了視圖要實現(xiàn)的模型數(shù)據(jù)和邏輯視圖名;“mv.addObject("message", "Hello World!");
”表示添加模型數(shù)據(jù),此處可以是任意POJO對象;“mv.setViewName("hello");”表示設(shè)置邏輯視圖名為“hello”,視圖解析器會將其解析為具體的視圖,如前邊的視圖解析器InternalResourceVi。wResolver會將其解析為“WEB-INF/jsp/hello.jsp”。

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

<!-- 處理器 --> 
<bean name="/hello" class="com.bjpowernode.chapter2.web.controller.HelloWorldController"/> 

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

開發(fā)視圖頁面

創(chuàng)建 /WEB-INF/jsp/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>Hello World</title> 
</head> 
<body> 
${message} 
</body> 
</html> 

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

啟動服務(wù)器運行測試

通過請求:http://localhost:9080/springmvc-chapter2/hello,如果頁面輸出“Hello World! ”就表明我們成功了!

運行流程分析

如圖2-3

圖2-3

運行步驟:

1、  首先用戶發(fā)送請求http://localhost:9080/springmvc-chapter2/hello——>web容器,web容器根據(jù)“/hello”路徑映射到DispatcherServlet(url-pattern為/)進行處理;
2、  DispatcherServlet——>BeanNameUrlHandlerMapping進行請求到處理的映射,BeanNameUrlHandlerMapping將“/hello”路徑直接映射到名字為“/hello”的Bean進行處理,即HelloWorldController,BeanNameUrlHandlerMapping將其包裝為HandlerExecutionChain(只包括HelloWorldController處理器,沒有攔截器);
3、  DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器(HelloWorldController)適配為SimpleControllerHandlerAdapter;
4、  SimpleControllerHandlerAdapter——> HelloWorldController處理器功能處理方法的調(diào)用,SimpleControllerHandlerAdapter將會調(diào)用處理器的handleRequest方法進行功能處理,該處理方法返回一個ModelAndView給DispatcherServlet;
5、  hello(ModelAndView的邏輯視圖名)——>InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具體視圖頁面在/WEB-INF/jsp/hello.jsp;
6、  JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,將在處理器傳入的模型數(shù)據(jù)(message=HelloWorld!)在視圖中展示出來;
7、  返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶,到此一個流程結(jié)束。

到此HelloWorld就完成了,步驟是不是有點多?而且回憶下我們主要進行了如下配置:

1、  前端控制器DispatcherServlet;
2、  HandlerMapping
3、  HandlerAdapter
4、  ViewResolver
5、  處理器/頁面控制器
6、  視圖

因此,接下來幾章讓我們詳細看看這些配置,先從DispatcherServlet開始吧。

POST中文亂碼解決方案

spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解決POST方式造成的中文亂碼問題,具體配置如下:

<filter> 
  <filter-name>CharacterEncodingFilter</filter-name> 
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
  <init-param> 
    <param-name>encoding</param-name> 
    <param-value>utf-8</param-value> 
  </init-param> 
</filter> 
<filter-mapping> 
  <filter-name>CharacterEncodingFilter</filter-name> 
  <url-pattern>/*</url-pattern> 
</filter-mapping> 

以后我們項目及所有頁面的編碼均為UTF-8。

Spring3.1新特性

1.Spring2.5之前,我們都是通過實現(xiàn)Controller接口或其實現(xiàn)來定義我們的處理器類。

2.Spring2.5引入注解式處理器支持,通過@Controller 和 @RequestMapping注解定義我們的處理器類。并且提供了一組強大的注解:

需要通過處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter來開啟支持@Controller 和 @RequestMapping注解的處理器。

@Controller:用于標識是處理器類;
@RequestMapping:請求到處理器功能方法的映射規(guī)則;
@RequestParam:請求參數(shù)到處理器功能處理方法的方法參數(shù)上的綁定;
@ModelAttribute:請求參數(shù)到命令對象的綁定;
@SessionAttributes:用于聲明session級別存儲的屬性,放置在處理器類上,通常列出模型屬性(如@ModelAttribute)對應(yīng)的名稱,則這些屬性會透明的保存到session中;
@InitBinder:自定義數(shù)據(jù)綁定注冊支持,用于將請求參數(shù)轉(zhuǎn)換到命令對象屬性的對應(yīng)類型;

3.Spring3.0引入RESTful架構(gòu)風格支持(通過@PathVariable注解和一些其他特性支持),且又引入了更多的注解支持:

@CookieValue:cookie數(shù)據(jù)到處理器功能處理方法的方法參數(shù)上的綁定;
@RequestHeader:請求頭(header)數(shù)據(jù)到處理器功能處理方法的方法參數(shù)上的綁定;
@RequestBody:請求的body體的綁定(通過HttpMessageConverter進行類型轉(zhuǎn)換);
@ResponseBody:處理器功能處理方法的返回值作為響應(yīng)體(通過HttpMessageConverter進行類型轉(zhuǎn)換);
@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態(tài)碼和原因;
@ExceptionHandler:注解式聲明異常處理器;
@PathVariable:請求URI中的模板變量部分到處理器功能處理方法的方法參數(shù)上的綁定,從而支持RESTful架構(gòu)風格的URI;

4.還有比如:

JSR-303驗證框架的無縫支持(通過@Valid注解定義驗證元數(shù)據(jù));

使用Spring 3開始的ConversionService進行類型轉(zhuǎn)換(PropertyEditor依然有效),支持使用@NumberFormat 和 @DateTimeFormat來進行數(shù)字和日期的格式化;

HttpMessageConverter(Http輸入/輸出轉(zhuǎn)換器,比如JSON、XML等的數(shù)據(jù)輸出轉(zhuǎn)換器);

ContentNegotiatingViewResolver,內(nèi)容協(xié)商視圖解析器,它還是視圖解析器,只是它支持根據(jù)請求信息將同一模型數(shù)據(jù)以不同的視圖方式展示(如json、xml、html等),RESTful架構(gòu)風格中很重要的概念(同一資源,多種表現(xiàn)形式);

Spring 3 引入 一個  mvc XML的命名空間用于支持mvc配置,包括如:

<mvc:annotation-driven>:

自動注冊基于注解風格的處理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter

 支持Spring3的ConversionService自動注冊

支持JSR-303驗證框架的自動探測并注冊(只需把JSR-303實現(xiàn)放置到classpath)

自動注冊相應(yīng)的HttpMessageConverter(用于支持@RequestBody  和 @ResponseBody)(如XML輸入輸出轉(zhuǎn)換器(只需將JAXP實現(xiàn)放置到classpath)、JSON輸入輸出轉(zhuǎn)換器(只需將Jackson實現(xiàn)放置到classpath))等。

<mvc:interceptors>:注冊自定義的處理器攔截器;

<mvc:view-controller>:和ParameterizableViewController類似,收到相應(yīng)請求后直接選擇相應(yīng)的視圖;

<mvc:resources>:邏輯靜態(tài)資源路徑到物理靜態(tài)資源路徑的支持;

 <mvc:default-servlet-handler>:當在web.xml 中DispatcherServlet使用<url-pattern>/</url-pattern> 映射時,能映射靜態(tài)資源(當Spring Web MVC框架沒有處理請求對應(yīng)的控制器時(如一些靜態(tài)資源),轉(zhuǎn)交給默認的Servlet來響應(yīng)靜態(tài)文件,否則報404找不到資源錯誤,)。

……等等。

6.Spring3.1新特性:

對Servlet 3.0的全面支持。

@EnableWebMvc:用于在基于Java類定義Bean配置中開啟MVC支持,和XML中的<mvc:annotation-driven>功能一樣;

新的@Contoller和@RequestMapping注解支持類:處理器映射RequestMappingHandlerMapping 和 處理器適配器RequestMappingHandlerAdapter組合來代替Spring2.5開始的處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter,提供更多的擴展點,它們之間的區(qū)別我們在處理器映射一章介紹。

新的@ExceptionHandler 注解支持類:ExceptionHandlerExceptionResolver來代替Spring3.0的AnnotationMethodHandlerExceptionResolver,在異常處理器一章我們再詳細講解它們的區(qū)別。

@RequestMapping的"consumes" 和 "produces" 條件支持:用于支持@RequestBody 和 @ResponseBody,

1consumes指定請求的內(nèi)容是什么類型的內(nèi)容,即本處理方法消費什么類型的數(shù)據(jù),如consumes="application/json"表示JSON類型的內(nèi)容,Spring會根據(jù)相應(yīng)的HttpMessageConverter進行請求內(nèi)容區(qū)數(shù)據(jù)到@RequestBody注解的命令對象的轉(zhuǎn)換;

2produces指定生產(chǎn)什么類型的內(nèi)容,如produces="application/json"表示JSON類型的內(nèi)容,Spring的根據(jù)相應(yīng)的HttpMessageConverter進行請求內(nèi)容區(qū)數(shù)據(jù)到@RequestBody注解的命令對象的轉(zhuǎn)換,Spring會根據(jù)相應(yīng)的HttpMessageConverter進行模型數(shù)據(jù)(返回值)到JSON響應(yīng)內(nèi)容的轉(zhuǎn)換

3以上內(nèi)容,本章第×××節(jié)詳述。

URI模板變量增強:URI模板變量可以直接綁定到@ModelAttribute指定的命令對象、@PathVariable方法參數(shù)在視圖渲染之前被合并到模型數(shù)據(jù)中(除JSON序列化、XML混搭場景下)。

@Validated:JSR-303的javax.validation.Valid一種變體(非JSR-303規(guī)范定義的,而是Spring自定義的),用于提供對Spring的驗證器(org.springframework.validation.Validator)支持,需要Hibernate Validator 4.2及更高版本支持;

@RequestPart:提供對“multipart/form-data”請求的全面支持,支持Servlet 3.0文件上傳(javax.servlet.http.Part)、支持內(nèi)容的HttpMessageConverter(即根據(jù)請求頭的Content-Type,來判斷內(nèi)容區(qū)數(shù)據(jù)是什么類型,如JSON、XML,能自動轉(zhuǎn)換為命令對象),比@RequestParam更強大(只能對請求參數(shù)數(shù)據(jù)綁定,key-alue格式),而@RequestPart支持如JSON、XML內(nèi)容區(qū)數(shù)據(jù)的綁定;詳見本章的第×××節(jié);

Flash 屬性 和 RedirectAttribute:通過FlashMap存儲一個請求的輸出,當進入另一個請求時作為該請求的輸入,典型場景如重定向(POST-REDIRECT-GET模式,1、POST時將下一次需要的數(shù)據(jù)放在FlashMap;2、重定向;3、通過GET訪問重定向的地址,此時FlashMap會把1放到FlashMap的數(shù)據(jù)取出放到請求中,并從FlashMap中刪除;從而支持在兩次請求之間保存數(shù)據(jù)并防止了重復表單提交)。

Spring Web MVC提供FlashMapManager用于管理FlashMap,默認使用SessionFlashMapManager,即數(shù)據(jù)默認存儲在session中。

相關(guān)文章

  • Java之遍歷枚舉值問題

    Java之遍歷枚舉值問題

    這篇文章主要介紹了Java之遍歷枚舉值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 一文詳解mybatis二級緩存執(zhí)行流程

    一文詳解mybatis二級緩存執(zhí)行流程

    本文主要詳細介紹了mybatis二級緩存執(zhí)行流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考價值,感興趣的朋友們下面隨著小編來一起學習吧
    2024-02-02
  • Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解

    Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解

    這篇文章主要為大家介紹了Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Eureka源碼閱讀解析Server服務(wù)端啟動流程實例

    Eureka源碼閱讀解析Server服務(wù)端啟動流程實例

    這篇文章主要為大家介紹了Eureka源碼閱讀解析Server服務(wù)端啟動流程實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Spring Boot 簡單使用EhCache緩存框架的方法

    Spring Boot 簡單使用EhCache緩存框架的方法

    本篇文章主要介紹了Spring Boot 簡單使用EhCache緩存框架的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 解析Mybatis連續(xù)傳遞多個參數(shù)的方法

    解析Mybatis連續(xù)傳遞多個參數(shù)的方法

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,這篇文章主要介紹了Mybatis連續(xù)傳遞多個參數(shù)的方法,需要的朋友可以參考下
    2016-08-08
  • SpringCloud整合Consul的實現(xiàn)

    SpringCloud整合Consul的實現(xiàn)

    這篇文章主要介紹了SpringCloud整合Consul的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java如何從List中刪除元素的正確用法舉例

    Java如何從List中刪除元素的正確用法舉例

    這篇文章主要給大家介紹了關(guān)于Java如何從List中刪除元素的正確用法, 列表List是Java中的一種數(shù)據(jù)結(jié)構(gòu),存放按照添加順序的元素,是個有序的集合,需要的朋友可以參考下
    2023-07-07
  • java中如何判斷JSONObject是否存在某個Key

    java中如何判斷JSONObject是否存在某個Key

    這篇文章主要介紹了java中如何判斷JSONObject是否存在某個Key,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程

    web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程

    這篇文章主要為大家介紹了web.xml?SpringBoot打包可執(zhí)行Jar運行SpringMVC加載流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論