欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
學(xué)習SpringMVC系列教程(一)Spring MVC入門(mén)

2.1、Spring Web MVC是什么

Spring Web MVC是一種基于Java的實(shí)現了Web MVC設計模式的請求驅動(dòng)類(lèi)型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進(jìn)行職責解耦,基于請求驅動(dòng)指的就是使用請求-響應模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā),Spring Web MVC也是要簡(jiǎn)化我們日常Web開(kāi)發(fā)的。

 

另外還有一種基于組件的、事件驅動(dòng)的Web框架在此就不介紹了,如Tapestry、JSF等。

 

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

2.2、Spring Web MVC能幫我們做什么

√讓我們能非常簡(jiǎn)單的設計出干凈的Web層和薄薄的Web層;

√進(jìn)行更簡(jiǎn)潔的Web層的開(kāi)發(fā);

√天生與Spring框架集成(如IoC容器、AOP等);

√提供強大的約定大于配置的契約式編程支持;

√能簡(jiǎn)單的進(jìn)行Web層的單元測試;

√支持靈活的URL到頁(yè)面控制器的映射;

√非常容易與其他視圖技術(shù)集成,如Velocity、FreeMarker等等,因為模型數據不放在特定的API里,而是放在一個(gè)Model里(Map數據結構實(shí)現,因此很容易被其他框架使用);

√非常靈活的數據驗證、格式化和數據綁定機制,能使用任何對象進(jìn)行數據綁定,不必實(shí)現特定框架的API;

√提供一套強大的JSP標簽庫,簡(jiǎn)化JSP開(kāi)發(fā);

√支持靈活的本地化、主題等解析;

√更加簡(jiǎn)單的異常處理;

√對靜態(tài)資源的支持;

√支持Restful風(fēng)格。

2.3、Spring Web MVC架構

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

 

2.3.1、Spring Web MVC處理請求的流程

如圖2-1

圖2-1

具體執行步驟如下:

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

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

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

4、 前端控制器再次收回控制權,將響應返回給用戶(hù),圖2-1中的步驟8;至此整個(gè)結束。

 

問(wèn)題:

1、 請求如何給前端控制器?

2、 前端控制器如何根據請求信息選擇頁(yè)面控制器進(jìn)行功能處理?

3、 如何支持多種頁(yè)面控制器呢?

4、 如何頁(yè)面控制器如何使用業(yè)務(wù)對象?

5、 頁(yè)面控制器如何返回模型數據?

6、 前端控制器如何根據頁(yè)面控制器返回的邏輯視圖名選擇具體的視圖進(jìn)行渲染?

7、 不同的視圖技術(shù)如何使用相應的模型數據?

 

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

 

2.3.2、Spring Web MVC架構

1、Spring Web MVC核心架構圖,如圖2-2

圖2-2

 

 

架構圖對應的DispatcherServlet核心代碼如下:

Java Code復制內容到剪貼板
  1. //前端控制器分派方法      
  2. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {      
  3.         HttpServletRequest processedRequest = request;      
  4.         HandlerExecutionChain mappedHandler = null;      
  5.         int interceptorIndex = -1;      
  6.      
  7.         try {      
  8.             ModelAndView mv;      
  9.             boolean errorView = false;      
  10.      
  11.             try {      
  12.                    //檢查是否是請求是否是multipart(如文件上傳),如果是將通過(guò)MultipartResolver解析      
  13.                 processedRequest = checkMultipart(request);      
  14.                    //步驟2、請求到處理器(頁(yè)面控制器)的映射,通過(guò)HandlerMapping進(jìn)行映射      
  15.                 mappedHandler = getHandler(processedRequest, false);      
  16.                 if (mappedHandler == null || mappedHandler.getHandler() == null) {      
  17.                     noHandlerFound(processedRequest, response);      
  18.                     return;      
  19.                 }      
  20.                    //步驟3、處理器適配,即將我們的處理器包裝成相應的適配器(從而支持多種類(lèi)型的處理器)      
  21.                 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());      
  22.      
  23.                   // 304 Not Modified緩存支持      
  24.                 //此處省略具體代碼      
  25.      
  26.                 // 執行處理器相關(guān)的攔截器的預處理(HandlerInterceptor.preHandle)      
  27.                 //此處省略具體代碼      
  28.      
  29.                 // 步驟4、由適配器執行處理器(調用處理器相應功能處理方法)      
  30.                 mv = ha.handle(processedRequest, response, mappedHandler.getHandler());      
  31.      
  32.                 // Do we need view name translation?      
  33.                 if (mv != null && !mv.hasView()) {      
  34.                     mv.setViewName(getDefaultViewName(request));      
  35.                 }      
  36.      
  37.                 // 執行處理器相關(guān)的攔截器的后處理(HandlerInterceptor.postHandle)      
  38.                 //此處省略具體代碼      
  39.             }      
  40.             catch (ModelAndViewDefiningException ex) {      
  41.                 logger.debug("ModelAndViewDefiningException encountered", ex);      
  42.                 mv = ex.getModelAndView();      
  43.             }      
  44.             catch (Exception ex) {      
  45.                 Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);      
  46.                 mv = processHandlerException(processedRequest, response, handler, ex);      
  47.                 errorView = (mv != null);      
  48.             }      
  49.      
  50.             //步驟5 步驟6、解析視圖并進(jìn)行視圖的渲染      
  51. //步驟5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale))      
  52. //步驟6 視圖在渲染時(shí)會(huì )把Model傳入(view.render(mv.getModelInternal(), request, response);)      
  53.             if (mv != null && !mv.wasCleared()) {      
  54.                 render(mv, processedRequest, response);      
  55.                 if (errorView) {      
  56.                     WebUtils.clearErrorRequestAttributes(request);      
  57.                 }      
  58.             }      
  59.             else {      
  60.                 if (logger.isDebugEnabled()) {      
  61.                     logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +      
  62.                             "': assuming HandlerAdapter completed request handling");      
  63.                 }      
  64.             }      
  65.      
  66.             // 執行處理器相關(guān)的攔截器的完成后處理(HandlerInterceptor.afterCompletion)      
  67.             //此處省略具體代碼      
  68.      
  69.      
  70.         catch (Exception ex) {      
  71.             // Trigger after-completion for thrown exception.      
  72.             triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);      
  73.             throw ex;      
  74.         }      
  75.         catch (Error err) {      
  76.             ServletException ex = new NestedServletException("Handler processing failed", err);      
  77.             // Trigger after-completion for thrown exception.      
  78.             triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);      
  79.             throw ex;      
  80.         }      
  81.      
  82.         finally {      
  83.             // Clean up any resources used by a multipart request.      
  84.             if (processedRequest != request) {      
  85.                 cleanupMultipart(processedRequest);      
  86.             }      
  87.         }      
  88.     }   

 

核心架構的具體流程步驟如下:

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

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

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

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

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

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

7、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶(hù),到此一個(gè)流程結束。

 

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

 

到此,再來(lái)看我們前邊提出的問(wèn)題:

 

 

1、 請求如何給前端控制器?這個(gè)應該在web.xml中進(jìn)行部署描述,在HelloWorld中詳細講解。

2、 前端控制器如何根據請求信息選擇頁(yè)面控制器進(jìn)行功能處理? 我們需要配置HandlerMapping進(jìn)行映射

3、 如何支持多種頁(yè)面控制器呢?配置HandlerAdapter從而支持多種類(lèi)型的頁(yè)面控制器

4、 如何頁(yè)面控制器如何使用業(yè)務(wù)對象?可以預料到,肯定利用Spring IoC容器的依賴(lài)注入功能

5、 頁(yè)面控制器如何返回模型數據?使用ModelAndView返回

6、 前端控制器如何根據頁(yè)面控制器返回的邏輯視圖名選擇具體的視圖進(jìn)行渲染? 使用ViewResolver進(jìn)行解析

7、 不同的視圖技術(shù)如何使用相應的模型數據? 因為Model是一個(gè)Map數據結構,很容易支持其他視圖技術(shù)

 

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

1、 DispatcherServlet在web.xml中的部署描述,從而攔截請求到Spring Web MVC

2、 HandlerMapping的配置,從而將請求映射到處理器

3、 HandlerAdapter的配置,從而支持多種類(lèi)型的處理器

4、 ViewResolver的配置,從而將邏輯視圖名解析為具體視圖技術(shù)

5、處理器(頁(yè)面控制器)的配置,從而進(jìn)行功能處理

 

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

 

2.4、Spring Web MVC優(yōu)勢

1、清晰的角色劃分:前端控制器(DispatcherServlet)、請求到處理器映射(HandlerMapping)、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)、處理器或頁(yè)面控制器(Controller)、驗證器( Validator)、命令對象(Command 請求參數綁定到的對象就叫命令對象)、表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)。

2、分工明確,而且擴展點(diǎn)相當靈活,可以很容易擴展,雖然幾乎不需要;

3、由于命令對象就是一個(gè)POJO,無(wú)需繼承框架特定API,可以使用命令對象直接作為業(yè)務(wù)對象;

4、和Spring 其他框架無(wú)縫集成,是其它Web框架所不具備的;

5、可適配,通過(guò)HandlerAdapter可以支持任意的類(lèi)作為處理器;

6、可定制性,HandlerMapping、ViewResolver等能夠非常簡(jiǎn)單的定制;

7、功能強大的數據驗證、格式化、綁定機制;

8、利用Spring提供的Mock對象能夠非常簡(jiǎn)單的進(jìn)行Web層單元測試;

9、本地化、主題的解析的支持,使我們更容易進(jìn)行國際化和主題的切換。

10、強大的JSP標簽庫,使JSP編寫(xiě)更容易。

………………還有比如RESTful風(fēng)格的支持、簡(jiǎn)單的文件上傳、約定大于配置的契約式編程支持、基于注解的零配置支持等等。

 

到此我們已經(jīng)簡(jiǎn)單的了解了Spring Web MVC,接下來(lái)讓我們來(lái)個(gè)實(shí)例來(lái)具體使用下這個(gè)框架。

2.5、Hello World入門(mén)

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

☆開(kāi)發(fā)工具:eclipse

☆運行環(huán)境:tomcat6.0.20

☆工程:動(dòng)態(tài)web工程(springmvc-chapter2

☆spring框架下載:

spring-framework-3.1.1.RELEASE-with-docs.zip

☆依賴(lài)jar包:

1、 Spring框架jar包:

為了簡(jiǎn)單,將spring-framework-3.1.1.RELEASE-with-docs.zip/dist/下的所有jar包拷貝到項目的WEB-INF/lib目錄下;

2、 Spring框架依賴(lài)的jar包:

需要添加Apache commons logging日志,此處使用的是commons.logging-1.1.1.jar;

需要添加jstl標簽庫支持,此處使用的是jstl-1.1.2.jar和standard-1.1.2.jar;

2.5.2、前端控制器的配置

在我們的web.xml中添加如下配置:

XML/HTML Code復制內容到剪貼板
  1. <servlet>      
  2.     <servlet-name>chapter2</servlet-name>      
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>      
  4.     <load-on-startup>1</load-on-startup>      
  5. </servlet>      
  6. <servlet-mapping>      
  7.     <servlet-name>chapter2</servlet-name>      
  8.     <url-pattern>/</url-pattern>      
  9. </servlet-mapping>   

 

load-on-startup表示啟動(dòng)容器時(shí)初始化該Servlet;

url-pattern表示哪些請求交給Spring Web MVC處理, “/” 是用來(lái)定義默認servlet映射的。也可以如“*.html”表示攔截所有以html為擴展名的請求。

 

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

 

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

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

XML/HTML Code復制內容到剪貼板
  1. <!-- HandlerMapping -->      
  2. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>      
  3.        
  4. <!-- HandlerAdapter -->      
  5. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>  

 

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

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

2.5.4、在Spring配置文件中配置ViewResolver

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

XML/HTML Code復制內容到剪貼板
  1. <!-- ViewResolver -->      
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">      
  3.     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>      
  4.     <property name="prefix" value="/WEB-INF/jsp/"/>      
  5.     <property name="suffix" value=".jsp"/>      
  6. </bean>     

 

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

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

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

 

2.5.5、開(kāi)發(fā)處理器/頁(yè)面控制器

Java Code復制內容到剪貼板
  1. package cn.javass.chapter2.web.controller;      
  2. import javax.servlet.http.HttpServletRequest;      
  3. import javax.servlet.http.HttpServletResponse;      
  4. import org.springframework.web.servlet.ModelAndView;      
  5. import org.springframework.web.servlet.mvc.Controller;      
  6. public class HelloWorldController implements Controller {      
  7.     @Override     
  8.     public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {      
  9.        //1、收集參數、驗證參數      
  10.        //2、綁定參數到命令對象      
  11.        //3、將命令對象傳入業(yè)務(wù)對象進(jìn)行業(yè)務(wù)處理      
  12.        //4、選擇下一個(gè)頁(yè)面      
  13.        ModelAndView mv = new ModelAndView();      
  14.        //添加模型數據 可以是任意的POJO對象      
  15.        mv.addObject("message""Hello World!");      
  16.        //設置邏輯視圖名,視圖解析器會(huì )根據該名字解析到具體的視圖頁(yè)面      
  17.        mv.setViewName("hello");      
  18.        return mv;      
  19.     }      
  20. }   

 

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

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

ModelAndView:包含了視圖要實(shí)現的模型數據和邏輯視圖名;“mv.addObject("message", "Hello World!");

”表示添加模型數據,此處可以是任意POJO對象;“mv.setViewName("hello");”表示設置邏輯視圖名為“hello”,視圖解析器會(huì )將其解析為具體的視圖,如前邊的視圖解析器InternalResourceVi。wResolver會(huì )將其解析為“WEB-INF/jsp/hello.jsp”。

 

 

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

XML/HTML Code復制內容到剪貼板
  1. <!-- 處理器 -->      
  2. <bean name="/hello" class="cn.javass.chapter2.web.controller.HelloWorldController"/>  

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

2.5.6、開(kāi)發(fā)視圖頁(yè)面

創(chuàng )建 /WEB-INF/jsp/hello.jsp視圖頁(yè)面:

XML/HTML Code復制內容到剪貼板
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>      
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">      
  3. <html>      
  4. <head>      
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">      
  6. <title>Hello World</title>      
  7. </head>      
  8. <body>      
  9. ${message}      
  10. </body>      
  11. </html>     

${message}:表示顯示由HelloWorldController處理器傳過(guò)來(lái)的模型數據。

2.5.6、啟動(dòng)服務(wù)器運行測試

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

 

 

2.5.7、運行流程分析

如圖2-3

圖2-3

運行步驟:

1、 首先用戶(hù)發(fā)送請求http://localhost:9080/springmvc-chapter2/hello——>web容器,web容器根據“/hello”路徑映射到DispatcherServlet(url-pattern為/)進(jìn)行處理;

2、 DispatcherServlet——>BeanNameUrlHandlerMapping進(jìn)行請求到處理的映射,BeanNameUrlHandlerMapping將“/hello”路徑直接映射到名字為“/hello”的Bean進(jìn)行處理,即HelloWorldController,BeanNameUrlHandlerMapping將其包裝為HandlerExecutionChain(只包括HelloWorldController處理器,沒(méi)有攔截器);

3、 DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器(HelloWorldController)適配為SimpleControllerHandlerAdapter;

4、 SimpleControllerHandlerAdapter——> HelloWorldController處理器功能處理方法的調用,SimpleControllerHandlerAdapter將會(huì )調用處理器的handleRequest方法進(jìn)行功能處理,該處理方法返回一個(gè)ModelAndView給DispatcherServlet;

5、 hello(ModelAndView的邏輯視圖名)——>InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具體視圖頁(yè)面在/WEB-INF/jsp/hello.jsp;

6、 JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,將在處理器傳入的模型數據(message=HelloWorld!)在視圖中展示出來(lái);

7、 返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶(hù),到此一個(gè)流程結束。

 

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

 

1、 前端控制器DispatcherServlet;

2、 HandlerMapping

3、 HandlerAdapter

4、 ViewResolver

5、 處理器/頁(yè)面控制器

6、 視圖

 

因此,接下來(lái)幾章讓我們詳細看看這些配置,先從DispatcherServlet開(kāi)始吧。

 

2.6、POST中文亂碼解決方案

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

XML/HTML Code復制內容到剪貼板
  1. <filter>      
  2.     <filter-name>CharacterEncodingFilter</filter-name>      
  3.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>      
  4.     <init-param>      
  5.         <param-name>encoding</param-name>      
  6.         <param-value>utf-8</param-value>      
  7.     </init-param>      
  8. </filter>      
  9. <filter-mapping>      
  10.     <filter-name>CharacterEncodingFilter</filter-name>      
  11.     <url-pattern>/*</url-pattern>      
  12. </filter-mapping>   

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

 

 

2.7、Spring3.1新特性

一、Spring2.5之前,我們都是通過(guò)實(shí)現Controller接口或其實(shí)現來(lái)定義我們的處理器類(lèi)。

 

二、Spring2.5引入注解式處理器支持,通過(guò)@Controller 和 @RequestMapping注解定義我們的處理器類(lèi)。并且提供了一組強大的注解:

 

需要通過(guò)處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter來(lái)開(kāi)啟支持@Controller 和 @RequestMapping注解的處理器。

 

@Controller:用于標識是處理器類(lèi);

@RequestMapping:請求到處理器功能方法的映射規則;

@RequestParam:請求參數到處理器功能處理方法的方法參數上的綁定;

@ModelAttribute:請求參數到命令對象的綁定;

@SessionAttributes:用于聲明session級別存儲的屬性,放置在處理器類(lèi)上,通常列出模型屬性(如@ModelAttribute)對應的名稱(chēng),則這些屬性會(huì )透明的保存到session中;

@InitBinder:自定義數據綁定注冊支持,用于將請求參數轉換到命令對象屬性的對應類(lèi)型;

 

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

@CookieValue:cookie數據到處理器功能處理方法的方法參數上的綁定;

@RequestHeader:請求頭(header)數據到處理器功能處理方法的方法參數上的綁定;

@RequestBody:請求的body體的綁定(通過(guò)HttpMessageConverter進(jìn)行類(lèi)型轉換);

@ResponseBody:處理器功能處理方法的返回值作為響應體(通過(guò)HttpMessageConverter進(jìn)行類(lèi)型轉換);

@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態(tài)碼和原因;

@ExceptionHandler:注解式聲明異常處理器;

@PathVariable:請求URI中的模板變量部分到處理器功能處理方法的方法參數上的綁定,從而支持RESTful架構風(fēng)格的URI;

 

四、還有比如:

JSR-303驗證框架的無(wú)縫支持(通過(guò)@Valid注解定義驗證元數據);

使用Spring 3開(kāi)始的ConversionService進(jìn)行類(lèi)型轉換(PropertyEditor依然有效),支持使用@NumberFormat 和 @DateTimeFormat來(lái)進(jìn)行數字和日期的格式化;

HttpMessageConverter(Http輸入/輸出轉換器,比如JSON、XML等的數據輸出轉換器);

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

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

<mvc:annotation-driven>:

自動(dòng)注冊基于注解風(fēng)格的處理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter

支持Spring3的ConversionService自動(dòng)注冊

支持JSR-303驗證框架的自動(dòng)探測并注冊(只需把JSR-303實(shí)現放置到classpath)

自動(dòng)注冊相應的HttpMessageConverter(用于支持@RequestBody 和 @ResponseBody)(如XML輸入輸出轉換器(只需將JAXP實(shí)現放置到classpath)、JSON輸入輸出轉換器(只需將Jackson實(shí)現放置到classpath))等。

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

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

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

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

 

……等等。

 

五、Spring3.1新特性:

對Servlet 3.0的全面支持。

 

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

 

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

 

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

 

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

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

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

3以上內容,本章第×××節詳述。

 

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

 

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

 

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

 

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

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
從 Spring Boot到 Spring MVC(注解方式)
第6章 Spring MVC簡(jiǎn)介
Spring MVC版hello_world親測可用版(含詳細步驟)
springMVC入門(mén)
Spring Web MVC框架簡(jiǎn)介-最全的介紹
Java專(zhuān)家告訴你Spring Web MVC 框架
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久