国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringMVC學習筆記

roundstones / 1106人閱讀

摘要:是目前最流行的一種互聯(lián)網軟件架構。協(xié)議,是一個無狀態(tài)協(xié)議,即所有的狀態(tài)都保存在服務器端。而這種轉化是建立在表現(xiàn)層之上的,所以就是表現(xiàn)層狀態(tài)轉化。具體說,就是協(xié)議里面,四個表示操作方式的動詞。

一、SpringMVC概述

Spring為展現(xiàn)層提供的基于MVC設計理念的優(yōu)秀的Web框架,是目前最主流的MVC框架之一

Spring3.0之后全面超越Struts2,成為最優(yōu)秀的MVC框架

SpringMVC通過一套MVC注解,讓POJO成為處理請求的控制器,而無須實現(xiàn)任何接口

支持REST風格的URL請求

采用了松散耦合可挺拔組件結構,比其他MVC框架更具擴展性和靈活性

二、HelloWorld

步驟:

maven依賴



    4.0.0

    com.meituan.spring
    mvc
    1.0-SNAPSHOT

    
        
            org.springframework
            spring-web
            4.3.14.RELEASE
        

        
            org.springframework
            spring-core
            4.3.14.RELEASE
        

        
            org.springframework
            spring-context
            4.3.14.RELEASE
        

        
            org.springframework
            spring-webmvc
            4.3.14.RELEASE
        

    

    
        
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.5.1
                
                    1.8
                    1.8
                    UTF-8
                
            
            
                org.apache.maven.plugins
                maven-war-plugin
            
        
    

在Module Settings->Project Settings->Artifacts->output layout中,找到WEB-INF目錄,確認在其下存在lib目錄,不存在則創(chuàng)建,將library files添加進去

web.xml



    
        contextConfigLocation
        /WEB-INF/applicationContext.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    
    
        dispatcher
        org.springframework.web.servlet.DispatcherServlet
        1
    
    
        dispatcher
        /
    

dispatcher-servlet.xml

可以通過contextConfigLocation來指定SpringMVC配置文件的位置

使用默認規(guī)則:/WEB-INF/-servlet.xml




    

    

    
        
        
    

注意:前后綴一定不要出錯

Controller類

   import org.springframework.stereotype.Controller;
   import org.springframework.web.bind.annotation.RequestMapping;
   import org.springframework.web.bind.annotation.ResponseBody;

   @Controller
   public class HelloWorld {
   
       @RequestMapping("/helloworld")
       public String hello() {
           System.out.println("hello world, hello springmvc !");
           return "success";
       }
   }

index.jsp文件

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
  
    $Title$
  
  
    hello world!
  
 

視圖jsp文件

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
  
    $Title$
  
  
    

success page!

配置好Tomcat

值得注意的是,在deployment->Deploy at the server startup中添加artifact

啟動Tomcat即可

三、使用@RequestMapping映射請求

源碼

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping
3.1 使用@RequestMapping映射請求

可以用來修飾方法,還可以用來修飾類

類定義處:提供初步的請求映射信息,相對于WEB應用的根目錄

方法處:提供進一步的細分映射信息,相對于類定義處的URL,若類定義處未標@RequestMapping,則方法處標記的URL相對于WEB應用的根目錄

DispatcherServlet截獲請求后,就通過控制器上@RequestMapping提供的映射信息確定請求所對應的處理方法

3.2 映射請求參數(shù)、請求方法或請求頭

@RequestMapping除了可以使用請求URL映射請求外,還可以使用請求方法、請求參數(shù)及請求頭映射請求

@RequestMapping的value、method、params及heads分別表示請求URL、請求方法、請求參數(shù)及請求頭的映射條件,它們之間是與的關系,聯(lián)合使用多個條件可讓請求映射更加精確化

params和headers支持簡單的表達式

param1:表示請求必須包含名為param1的請求參數(shù)

!param1:表示請求不能包含名為param1的請求參數(shù)

param1!=value1表示請求包含名為param1的請求參數(shù),但其值不能為value1

{"param1=value1", "param2"}:請求必須包含名為param1和param2的兩個請求參數(shù),且param1參數(shù)的值必須為value1

Ant風格資源地址支持3種匹配符:

?:匹配文件名中的一個字符

* :匹配文件名中的任意字符

**:匹配多層路徑

3.3 支持Ant風格(了解即可)

@RequestMapping 還支持 Ant 風格的 URL :

/user/*/createUser:匹配 /user/aaa/createUser、/user/bbb/createUser 等 URL

/user/**/createUser:匹配 /user/createllser、/user/aaa/bbb/createUser 等 URL

/user/createllser??:匹配 /user/createllseraa、/user/createllserbb 等 URL

3.4 @PathVariable映射URL綁定的占位符

帶 占 位 符 的 URL是Spring3.0新增的功能,該功能在SpringMVC向REST目標挺進發(fā)展過程中具有里程碑的意義

通過@PathVariable可以將URL中占位符參數(shù)綁定到控制器處理方法的入參中:URL中的{xxx丨占位符可以通過 @PathVariable("xxx")綁定到操作方法的入參中。

    @RequestMapping("/delete/{id}")
    public String delete(@PathVariable("id") Integer id) {
        System.out.println(id);
        return "redirect:/user/list.action";
    }
3.5 REST

REST 即Representational State Transfer。 (資源)表現(xiàn)層狀態(tài)轉化。是目前最流行的一種互聯(lián)網軟件架構。它結構清晰、符合標準、易于理解、擴展方便, 所以正得到越來越多網站的采用

資 源 ( Resources):網絡上的一個實體,或者說是網絡上的一個具體信息。它 可以是一段文本、 一 張圖片、一首歌曲、一種服務,總之就是一個具體的存在。 可以用一個URI (統(tǒng)一資源定位符)指向它,每種資源對應一個特定的URU要 獲取這個資源,訪問它的URI就可以,因此URI即為每一個資源的獨一無二的識別符。

表現(xiàn)層 ( Representation):把資源具體呈現(xiàn)出來的形式,叫做它的表現(xiàn)層 (Representation) ^比如,文本可以用txt格式表現(xiàn),也可以用HTML格式、XML格式、JSON格式表現(xiàn),甚至可以采用二進制格式

狀態(tài)轉化 ( StateTransfer):每發(fā)出一個請求,就代表了客戶端和服務器的一 次交互過程。HTTP協(xié)議,是一個無狀態(tài)協(xié)議,即所有的狀態(tài)都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發(fā)生“狀態(tài)轉化”( State Transfer)。而這種轉化是建立在表現(xiàn)層之上的,所以就是“ 表現(xiàn)層狀態(tài)轉化”。具體說,就是HTTP協(xié)議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來獲取資源,POST用來新建資源,PUT用來更新資源,DELETE用來刪除資源。

HiddenHttpMethodFilter: 瀏覽器 form 表單只支持 GET 與 POST請求,而 DELETE、PUT等method并不支持,Spring3.0添加了一個過濾器,可以將這些請求轉換為標準的http方法,使得支持GET、POST、PUT與DELETE請求

web.xml

    
    
        HiddenHttpMethodFilter
        org.springframework.web.filter.HiddenHttpMethodFilter
    
    
    
        HiddenHttpMethodFilter
        /*
    

jsp

添加一個form,增加一個隱藏域name="_method",指明請求的類型,值取PUT或DELETE

    

java

    @RequestMapping("/delete/{id}")
    public String delete(@PathVariable("id") Integer id) {
        userDao.deleteUserById(id);
        return "success";
    }

在Tomcat8以上版本,會出現(xiàn)問題,需要在jsp文件中添加

<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true"%>

指定屬性isErrorPage="true"

四、映射請求參數(shù) & 請求參數(shù) 4.1 請求處理方法簽名

Spring MVC通過分析處理方法的簽名,將HTTP請求信息綁定到處理方法的相應入參中。

Spring MVC對控制器處理方法簽名的限制是很寬松的, 幾乎可以按喜歡的任何方式對方法進行簽名。

必要時可以對方法及方法入參標注相應的注解(@PathVariable、@RequestParam、 @RequestHeader等)、Spring MVC框架會將HTTP請求的信息綁定到相應的方法入參中,并根據方法的返回值類型做出相應的后續(xù)處理。

4.2 使用@RequestParam綁定請求參數(shù)值

在處理方法入參處使用@RequestParam可以把請求參數(shù)傳遞給請求方法

value:參數(shù)名

required:是否必須。默認為true,表示請求參數(shù)中必須包含對應 的參數(shù),若不存在,將拋出異常

defaultValue:請求參數(shù)的默認值

4.3 使用@RequestHeader綁定請求報頭的屬性值(了解即可)

請求頭包含了若干個屬性,服務器可據此獲知客戶端的信息,通過@RequestHeader即可將請求頭中的屬性值綁定到處理方法的入參中

4.4 使用CookieValue綁定請求中的cookie值(了解即可)

@CookieValue可讓處理方法入參綁定某個cookie值

4.5 使用POJO對象綁定請求參數(shù)值

SpringMVC會按請求參數(shù)名和POJO屬性名進行自動匹配,自動為該對象填充屬性值,支持級聯(lián)屬性

如:dept.deptId、dept.address.tel等

4.6 使用Servlet API作為入參

MVC的handler訪求可以接受以下Servlet API類型的參數(shù)

HttpServletRequest

HttpServletResponse

HttpSession

java.security.Principal

Locale

InputStream

OutputStream

Reader

Writer

五、處理模式數(shù)據

Spring MVC提供了以下幾種途徑輸出模型數(shù)據:

ModelAndView:處理方法返回值類型為ModelAndView 時,方法體即可通過該對象添加模型數(shù)據

Map及Model: 入參為org.springframework.ui.Model、 org.springframework.ui.ModelMap或 java.util.Map時,處理 方法返回時,Map中的數(shù)據會自動添加到模型中。

@SessionAttributes:將模型中的某個屬性暫存到 HttpSession中,以便多個請求之間可以共享這個屬性

@ModelAttribute:方法入參標注該注解后,入參的對象就會放到數(shù)據模型中

5.1 ModelAndView

SpringMVC會把 ModelAndView 里model 中的數(shù)據放入到request域對象( requestScope )中

控制器處理方法的返回值如果為ModelAndView,則其既包含視圖信息,也包含模型數(shù)據信息。

添加模型數(shù)據:

MoelAndView addObject(String attributeName, Object attributeValue)

ModelAndView addAIIObject(Map modelMap)

設置視圖:

void setView(View view)

void setViewName(String viewName)

5.2 Map及Model

Spring MVC在內部使用了一個 org.springframework.ui.Model 接口存儲模型數(shù)據

具體步驟

Spring MVC在調用方法前會創(chuàng)建一個隱 含的模型對象作為模型數(shù)據的存儲容器。

如果方法的入參為Map或Model類型,Spring MVC會將隱含模型的引用傳遞給這些入參。在方法體內,開發(fā)者可以通過這個入參對象訪問到模型中的所有數(shù) 據,也可以向模型中添加新的屬性數(shù)據。

5.3 將模型數(shù)據存入Session中

若希望在多個請求之間共用某個模型屬性數(shù)據,則可以在控制器上標注一個 @SessionAttributes,Spring MVC 將在模型中對應的屬性暫存到HttpSession中。

@SessionAttributes除了可以通過屬性名指定需要放到會話中的屬性外,還可以通過模型屬性的對象類型指定哪些模型屬性需要放到session會話中

@SessionAttributes(types=User.class)會將隱含模型中所有類型 為User.class的屬添加到會話中。

@SessionAttributes(value={“user1”, “user2”})

@SessionAttributes(types={User.class, Dept.class})

@SessionAttributes(value={“user1”, “user2” } , types={Dept.class})

5.4 @ModelAttribute

在方法定義上使用@ModelAttribute注解: Spring MVC 在調用目標處理方法前,會先逐個調用在方法級上標注了@ModelAttribute 的方法,因此對于一個controller映射多個URL的用法來說,要謹慎使用。

在方法的入參前使用@ModelAttribute注解:

可以從隱含對象中獲取隱含的模型數(shù)據中獲取對象,再將請求參數(shù)綁定到對象中,再傳入入參

將方法入參對象添加到模型中

@ModelAttribute 注解也可以來修飾目標方法POJO類型的入參,其 value 屬性值有如下的作用:

SpringMVC會使用 value 屬性值在implicitModel中查找對應的對象,若存在則會直接傳入到目標方法的入參中

SpringMVC會以value為key,POJO類型的對象為value,存入到request中

5.4.1 @ModelAttribute運行原理
@ModelAttribute
public void getUser(@RequestParam(value="id", required=false) Integer id, Map map) {
    System.out.println("modelAttribute method");
    
    if (id != null) {
        //模擬從數(shù)據庫中獲取對象
        User user = new User(1, "Tom", "123456", "Tom@meituan.com", 12);
        System.out.println("從數(shù)據庫中獲取一個對象: " + user);
        map.put("user", user);
    }
}

運行流程:

1、 執(zhí)行@ModelAttribute注解修飾的方法;從數(shù)據庫中取出對象,把對象放入到Map中,鍵為user

2、SpringMVC從Map中取出User對象,并把表單的請求參數(shù)賦值給該User對象對應的屬性

3、SpringMVC把上述對象傳入目標方法的參數(shù)

注意:在@ModelAttribute修飾的方法中,放入到Map時的鍵需要和目標方法入參類型的第一個字母小寫的字符串一致!

5.4.2 源碼分析的流程

調用@ModelAttribute注解修飾的方法,實際上把@ModelAttribute方法中Map中的數(shù)據放在了implicitModel中

解析請求處理器的目標參數(shù),實際上該目標參數(shù)來自于WebDataBinder對象的target屬性,

創(chuàng)建WebDataBinder對象:

確定objectName屬性:若傳入的attrName屬性值為"",則objectName為類名第一個字母小寫

注意:attrName,若目標方法的POJO屬性使用了@ModelAttribute來修飾,則attrName值即為@ModelAttribute的value屬性

確定target的值

在implicitModel中查找attrName對應的屬性值。若存在,ok;若不存在,則驗證當前handler是否使用了@SessionAttributes進行修飾,若使用了,則嘗試從Session中獲取attrName所對應的屬性值,若session中沒有對應的屬性值,則拋出異常;若handler沒有使用@SessionAttribute進行修飾,或@SessionAttributes中沒有使用value值指定的key和attrName相匹配,則通過反射創(chuàng)建POJO對象

SpringMVC把表單的請求參數(shù)賦給了WebDataBinder的target對應的屬性

SpringMVC會把WebDataBinder的attrName和target賦值給implicitModel

把WebDataBinder的target作為參數(shù)傳遞給目標參數(shù)的入參

5.4.3 如何確定目標方法POJO類型的入參

確定一個key

若目標方法的POJO類型的參數(shù)沒有使用@ModelAttribute作為修飾,則key為POJO類名第一個字母的小寫

若使用了@ModelAttribute來修飾,則key為@ModelAttribute注解的value屬性值

在implicitModel中查找key對應的對象,若存在,則作為入參傳入

若@ModelAttribute標記的方法在Map中保存過,且key和1確定的key一致,則會獲取到

若implicitModel中不存在key對應的對象,則檢查當前的handler是否使用@SessionAttributes注解修飾,若使用了該注解,且@SessionAttributes注解的value屬性值中包含了key,則會從HttpSession中來獲取key所對應的value值,若存在則直接傳入目標方法的入參中;若不存在則將拋出異常

若handler沒有標識@SessionAttributes注解的value值中不包含key,則會通過反射來創(chuàng)建POJO類型的參數(shù),傳入為目標方法的參數(shù)

SpringMVC會把key和POJO類型的對象保存到implicitModel,進而保存到request中

5.5 @SessionAttributes 注解引發(fā)的異常
org.springframework.web.HttpSessionRequiredException: Session attribute "user" required - not found in session

如果在處理類定義處標注了@SessionAttributes(“xxx”), 則嘗試從session會話中獲取該屬性,并將其賦給該入參,然后再用請求消息填充該入參對象。如果在會話中找不到對應的屬性,則拋出HttpSessionRequiredException 異常

5.6 視圖和視圖解析器 5.6.1 視圖解析流程分析

請求處理方法執(zhí)行完成后,最終返回一個ModelAndView 對象。對于那些返回String, View或ModeMap等類型的處理方法,Spring MVC也會在內部將它們裝配成一個 ModelAndView對象,它包含了邏輯名和模型對象的視圖

SpringMVC借助視圖解析器(ViewResolver)得到最終的視圖對象(View),最終的視圖可以是JSP,也可能是 Excel、JFreeChart等各種表現(xiàn)形式的視圖

對于最終究竟采取何種視圖對象對模型數(shù)據進行渲染,處理器并不關心,處理器工作重點聚焦在生產模型數(shù)據的工作上,從而實現(xiàn)MVC的充分解耦

5.6.2 視圖

視圖的作用是渲染模型數(shù)據,將模型里的數(shù)據以某種形式呈現(xiàn)給客 戶。

為了實現(xiàn)視圖模型和具體實現(xiàn)技術的解耦,Spring在org.springframework.web.servlet 包中定義了一個高度抽象的 View接口

視圖對象由視圖解析器負責實例化。由于視圖是無狀態(tài)的,所以他們 不會有線程安全的問題

常用的視圖實現(xiàn)類:?

5.6.3 視圖解析器(ViewResolver)

視圖解析器的作用是將邏輯視圖轉為物理視圖,所有的視圖解析器都必須實現(xiàn)ViewResolver接口。

視圖解析器的作用比較單一:將邏輯視圖解析為一個具體的視圖對象

SpringMVC為邏輯視圖名的解析提供了不同的策略,可以在Spring WEB上下文中配置一種或多種解析策略,并指定他們之間的先后順序。每一種映射策略對應一個具體的視圖解析器實現(xiàn)類。

程序員可以選擇一種視圖解析器或混用多種視圖解析器??梢酝ㄟ^order屬性指定解析器的優(yōu)先順序,order越小優(yōu)先級越高

SpringMVC會按視圖解析器順序的優(yōu)先順序對邏輯視圖名進行解析,直到解析成功并返回視圖對象,否則拋出ServletException異常。

5.6.4 使用mvc:view-controller不經控制器直接跳轉到頁面

若希望直接響應通過SpringMVC渲染的頁面,可以使用mvc:view-controller標簽實現(xiàn):

       
  
      

那么現(xiàn)在可以直接在某一頁面中通過請求路徑”success”訪問到/WEB-INF/views/success.jsp頁面(因為我們上面配置了視圖解析器將邏輯視圖解析為前綴為/WEB-INF/views/,后綴為.jsp的物理視圖)。但是,這種情況下通過控制器就無法映射到請求了,需要再進行如下配置:

   
      
5.6.5 關于重定向

一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理,但如果返回的字符串中帶forward:或redirect:前綴時,SpringMVC會對它們進行特殊處理:將forward: 和redirect: 當成指示符,其后的字符串作為URL 來處理。示例如下:?

index.jsp:

Test Redirect

controller:

@Controller
@RequestMapping("/springmvc")
public class SpringMVCTest {

    @RequestMapping("/testRedirect")
    public String testRedirect() {
        System.out.println("testRedirect");
        return "redirect:/index.jsp";
    }
}

即可重定向到index.jsp。也可在redirect:/后添加控制器方法的映射路徑,重定向到該目標方法。

六、SpringMVC表單標簽&處理靜態(tài)資源

通過SpringMVC的表單標簽可以實現(xiàn)將模型數(shù)據 中的屬性和HTML表單元素相綁定,以實現(xiàn)表單

數(shù)據更便捷編輯和表單值的回顯

6.1 表單標簽

form:input、 form:passwordN form:hidden、 form:textarea :對應 HTML 表車的 text、password、hidden、 textarea 標簽

form:radiobutton :單選框組件標簽,當表單bean對應的屬性值和value值相等時,單選框破選中

form:radiobuttons :單選框組標簽,用于構造多個單選

items :可以是一個 List、String[]或 Map

item Value :指定radio 的value值??梢允羌现衎ean的一個屬性值

itemLabel :指定 radio 的 label 值

delimiter :多個單選框可以通過delimiter指定分隔符

form:checkbox :復選框組件。用于構造單個復選框

form:checkboxs :用于構造多個復選框。使用方式同form:radiobuttons 標簽

form:select :用于@造下拉框組件。使用方式同form:radiobuttons 標簽

form:option :下拉框選項組件標簽。使用方式同 form:radiobuttons 標簽

form:errors :顯示表單組件或數(shù)據校驗所對應的錯誤

6.2 處理靜態(tài)資源

優(yōu)雅的REST風格的資源URL不希望帶.html或.do等后綴

若將DispatcherServlet請求映射配置為/,則Spring MVC將捕獲 WEB容器的所有請求,包括靜態(tài)資源的請求,SpringMVC會將他 們當成一個普通請求處理,因找不到對應處理器將導致錯誤。

可以在SpringMVC的配置文件中配置的方式解決靜態(tài)資源的問題:

將在 SpringMVC 上下文中定義一個DefaultServletHttpRequestHandler,它會對進入DispatcherServlet 的請求進行篩查,如果發(fā)現(xiàn)是沒有經過映射的請求,就將該請求交由WEB 應用服務器默認的Servlet處理,如果不是靜態(tài)資源的請求,才由DispatcherServlet 繼續(xù)處理

一般WEB應用服務器默認的Servlet的名稱都是default。若所使用的 WEB服務器的默認Servlet名稱不是default,則需要通過default-servlet-name 屬性顯式指定

七、數(shù)據轉換 & 數(shù)據格式化 & 數(shù)據校驗 7.1 數(shù)據轉換 7.1.1 數(shù)據綁定流程

Spring MVC主框架將ServletRequest對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,以創(chuàng)建DataBinder實例對象

DataBinder調用裝配在Spring MVC上下文中的
ConversionService組件進行數(shù)據類型轉換、數(shù)據格式化工作。將Servlet中的請求信息填充到入參對象中

調用Validator組件對已經綁定了請求消息的入參對象進行數(shù)據合法性校驗,并最終生成數(shù)據綁定結果BindingData 對象

Spring MVC抽取BindingResult中的入參對象和校驗錯誤對象,將它們賦給處理方法的響應入參

SpringMVC通過反射機制對目標處理方法進行解析,將請求消息綁定到處理方法的入參中。數(shù)據綁定的核心部件是DataBinder,運行機制如下:

7.1.2 關于mvc:annotation-driven

會自動注冊RequestMappingHandlerMapping、RequestMappingHandlerAdapter 與ExceptionHandlerExceptionResolver 三個bean。

還將提供以下支持:

支持使用ConversionService實例對表單參數(shù)進行類型轉換

支持使用 @NumberFormat annotation、@DateTimeFormat注解完成數(shù)據類型的格式化

支持使用@Valid注解對JavaBean實例進行JSR 303驗證

支持使用 @RequestBody和 @ResponseBody 注解

7.1.3 @InitBinder注解

由@lnitBinder標識的方法,可以對WebDataBinder對

象進行初始化。WebDataBinder是DataBinder的子類,用
于完成由表單字段到JavaBean屬性的綁定

@lnitBinder方法不能有返回值,它必須聲明為void。

@lnitBinder方法的參數(shù)通常是是WebDataBinder

7.2 數(shù)據格式化

對屬性對象的輸入/輸出進行格式化,從其本質上講依然屬于“類型轉換”的范疇。

Spring在格式化模塊,定義了一個實現(xiàn)ConversionService接口的FormattingConversionService 實現(xiàn)類,該實現(xiàn)類擴展了 GenericConversionService,因此它既具有類型轉換的功能,又具有格式化的功能

FormattingConversionService 擁有一個FormattingConversionServiceFactroyBean 工廠類,后者用于在 Spring上下文中構造前者

FormattingConversionServiceFactroyBean 內部已經注冊了:

NumberFormatAnnotationFormatterFactroy :支持對數(shù)字類型的屬性,使用 @NumberFormat 注解

JodaDateTimeFormatAnnotationFormatterFactroy :支持對日期類型的屬性使用@DateTimeFormat注解

裝配了 FormattingConversionServiceFactroyBean 后,就可

以在Spring MVC入參綁定及模型數(shù)據輸出時使用注解驅動
了。 默認創(chuàng)建的ConversionService 實例即為FormattingConversionServiceFactroyBean

7.2.1 日期格式化

@DateTimeFormat 注解可對java.util.Date、java.util.Calendar、java.long.Long 時間類型進行標注:

pattern屬性:類型為字符串。指定解析/格式化字段數(shù)據的模式,如:”yyyy-MM-dd hh:mm:ss”

iso屬性:類型為DateTimeFormat.lSO。指定解析/格式化字段數(shù)據的ISO模式,包括四種MSO.NONE (不使用)默認、ISO.DATE(yyyy-MM-dd)、IS〇.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)

style屬性:字符串類型。通過樣式指定日期時間的格式,由兩位字符組成,第一位表示日期的格式,第二位表示時間的格式:S :短日期/時間格式、M :中日期/時間格式、L :長日期/時間格式、F :完整日期/時間格式、忽略日期或時間格式

7.2.2

@NumberFormat可對類似數(shù)字類型的屬性進行標注,它擁有兩個互斥的屬性:

style :類型為NumberFormat.Style。用于指定樣式類型,包括三種:Style.NUMBER (正常數(shù)字類型)、Style.CURRENCY (貨幣類型)、Style.PERCENT (百分數(shù)類型)

pattern :類型為String,自定義樣式,如patter="#,###";

7.3 數(shù)據校驗 7.3.1 JSR 303

JSR 303是Java為Bean數(shù)據合法性校驗提供的標準框架,它已經包含在JavaEE 6.0中

JSR 303通過在Bean屬性上標注類似于@NotNull、@Max等標準的注解指定校驗規(guī)則,并通過標準的驗證接口對Bean進行驗證

7.3.2 SpringMVC數(shù)據校驗

Spring 4.0擁有自己獨立的數(shù)據校驗框架,同時支持JSR 303標準的校驗框架。

Spring在進行數(shù)據綁定時,可同時調用校驗框架完成數(shù)據校驗工作。在Spring MVC中,可直接通過注解驅動的方式進行數(shù)據校驗

Spring 的 LocalValidatorFactroyBean 既實現(xiàn)了 Spring 的Validator 接口,也實現(xiàn)了 JSR 303 的 Validator 接口。只要在Spring容器中定義了一個LocalValidatorFactoryBean,即可將其注入到需要數(shù)據校驗的Bean中。

Spring本身并沒有提供JSR303的實現(xiàn),所以必須將JSR303的實現(xiàn)者的jar包放到類路徑下。

在已經標注了 JSR303 注解的表單/命令對象前標注一個 @Valid , Spring MVC 框架在將請求參數(shù)綁定到該入參對象后,就會調用校驗框架根據注解聲明的校驗規(guī)則實施校驗

Spring MVC 是通過對處理方法簽名的規(guī)約來保存校驗結果的:前一個表單/命令對象的校驗結果保存到隨后的入參中,這個保存校驗結果的入參必須是 BindingResult 或 Errors 類型,這兩個類都位于 org.springframework.validation 包中

需校驗的Bean對象和其綁定結果對象或錯誤對象時成對出現(xiàn)的,它們之間不允許聲明其他的入參

Errors接口提供了獲取錯誤信息的方法,如getErrorCount()或getFieldErrors(String field)

BindingResult擴展了Errors接口

7.3.3 在目標方法中獲取校驗結果

在表單/命令對象類的屬性中標校驗注解,在處理方法對應的入參前添加@Valid,SpringMVC就會實施校驗并將校驗結果保存在被校驗入參對象之后的BindingResult或Errors入參中

7.3.4 在頁面上顯示錯誤

Spring MVC 除了會將表單/命令對象的校驗結果保存到對 應的 BindingResu|t或 Errors對象中外,還會將所有校驗結果保存到“隱含模型”

即使處理方法的簽名中沒有對應于表單/命合對象的結果入參,校驗結果也會保存在“隱含對象”中。

隱含模型中的所有數(shù)據最終將通過 Http Servletrequest的屬性列表暴露給 JSP 視圖對象,因此在 JSP 中可以獲取錯誤信息

在JSP頁面上可通過顯示錯誤消息

八、文件上傳

Spring MVC為文件上傳提供了直接的支持,這種支持是通過即插即用的MultipartResolver實現(xiàn)的。 Spring用 Jakarta Commons FileUpload 技術實現(xiàn)了一個 MultipartResolver 實現(xiàn)類:CommonsMultipartResovler

Spring MVC上下文中默認沒有裝配MultipartResovler,因此默認情況下不能處理文件的上傳工作,如果想使用Spring 的文件上傳功能,需現(xiàn)在上下文中配置MultipartResolver

配置MultipartResolver

defaultEncoding:必須和用戶 JSP 的 pageEncoding 屬性 一致,以便正確解析表單的內容

為了讓 CommonsMultipartResovler正確工作,必須先將 Jakarta Commons FileUpload & Jakarta Commons io 的類包添加到類路徑下。

九、攔截器

Spring MVC也可以使用攔截器對請求進行攔截處理,用戶 可以自定義攔截器來實現(xiàn)特定的功能,自定義的攔截器必須實現(xiàn) Handlerlnterceptor 接口

preHandle():這個方法在業(yè)務處理器處理請求之前被調用,在該 方法中對用戶請求request進行處理。如果程序員決定該攔截器對 請求進行攔截處理后還要調用其他的攔截器,或者是業(yè)務處理器去 進行處理,則返回true ;如果程序員決定不需要再調用其他的組件 去處理請求,則返回false。

postHandle():這個方法在業(yè)務處理器處理完請求后,但是DispatcherServlet向客戶端返回響應前被調用,在該方法中對用戶請求request進行處理。

afterCompletion():這個方法在 DispatcherServlet 完全處理完請求后被調用,可以在該方法中進行一些資源清理的操作。

攔截器方法執(zhí)行順序

攔截器配置

多個攔截器的執(zhí)行順序


十、 異常處理

Spring MVC通過 HandlerExceptionResolver 處理程序的異常,包括Handler映射、數(shù)據綁定以及目標方法執(zhí)行時發(fā)生的異常

Spring MVC提供的 HandlerExceptionResolver 的實現(xiàn)類

10.1 HandlerExceptionResolver

DispatcherServlet 默認裝配的HandlerExceptionResolver

沒有使用配置

使用配置

10.2 ExceptionHandlerExceptionResolver

主要處理Handler中用@ExceptionHandler注解定義的方法。

@ExceptionHandler注解定義的方法優(yōu)先級問題:例如發(fā)生的是NullPointerException,但是聲明的異常有 RuntimeException和Exception,此時會根據異常的最近繼承關系找到繼承深度最淺的那個@ExceptionHandler 注解方法,即標記了 RuntimeException的方法

ExceptionHandlerMethodResolver 內部若找不到@ExceptionHandler注解的話,會找 @ControllerAdvice 中的@ExceptionHandler 注解方法

10.3 ResponseStatusExceptionResolver

在異常及異常父類中找到@ResponseStatus注解,然后使用這個注解的屬性進行處理。

定義一個@ResponseStatus注解修飾的異常類

若在處理器方法中拋出了上述異常: 若 ExceptionHandlerExceptionResolver 不解析上述異常。由于觸發(fā)的異常 UnauthorizedException 帶有@ResponseStatus 注解。因此會被 ResponseStatusExceptionResolver 解析到。最后響應HttpStatus_UNAUTH〇RIZED代碼給客戶端。HttpStatus_UNAUTH〇RIZED代表響應碼401,無權限。 關于其他的響應碼請參考HttpStatus枚舉類型源碼。

10.4 DefaultHandlerExceptionResolver

對一些特殊的異常進行處理,比如NoSuchRequestHandlingMethodException、 HttpReques tMethodNotSupportedException、 HttpMediaTypeNotSuppo rtedException、 HttpMediaTypeNotAcceptableException 等

10.5 SimpleMappingExceptionResolver

如果希望對所有異常進行統(tǒng)一處理,可以使用SimpleMappingExceptionResolver,它將異常類名映射為視圖名,即發(fā)生異常時使用對應的視圖報告異常

十一、SpringMVC運行流程

十二、在Spring環(huán)境下使用SpringMVC

需要進行Spring 整合SpringMVC嗎

還是否需要再加入Spring的IOC容器?

是否需要在web.xml文件中配置啟動Spring IOC容器的ContextLoaderListener?

需要:通常情況下,類似于數(shù)據源、事務、整合其他框架都是放在Spring 的配置文件中(而不是放在SpringMVC的配置文件中),實際上放入Spring配置文件對應的IOC容器中的還有Service和Dao(推薦)

不需要:都放在SpringMVC的配置文件中,也可以分多個Spring的配置文件,然后使用import節(jié)點導入其他的配置文件(不推薦)

12.1 Bean的重復創(chuàng)建

若Spring的IOC容器和SpringMVC的IOC容器掃描的包有重合的部分,就會導致有的bean會被創(chuàng)建2次

解決:

使Spring的IOC容器掃描的包和SpringMVC的IOC容器掃描的包沒有重合的部分

使用 exclude-filter 和 include-filter 子節(jié)點來規(guī)定只能掃描的注解

12.2 SpringMVC與Spring容器的關系

多個Spring l〇C容器之間可以設置為父子關系,以實現(xiàn)良好的解耦。

Spring MVC WEB層容器可作為“業(yè)務層” Spring 容器的子容器:即WEB層容器可以引用業(yè)務層容器的Bean,而業(yè)務層容器卻訪問不到WEB層容器的Bean

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76552.html

相關文章

  • angularjs+springMvc學習筆記

    摘要:回調說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)和,下面的方法請求成功執(zhí)行,失敗執(zhí)行異步異步的原理我看了網上的一些博客和例子,大都以定時任務為例子說明,但具體的原理我還是不太 回調 說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)success和error,下...

    dreamGong 評論0 收藏0
  • angularjs+springMvc學習筆記

    摘要:回調說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)和,下面的方法請求成功執(zhí)行,失敗執(zhí)行異步異步的原理我看了網上的一些博客和例子,大都以定時任務為例子說明,但具體的原理我還是不太 回調 說白了,就是把函數(shù)當參數(shù)傳給另一根函數(shù),在另一個函數(shù)執(zhí)行時調用此函數(shù)例如,在下面這段代碼中,上面定義了兩個函數(shù)success和error,下...

    rozbo 評論0 收藏0
  • springMvc學習筆記(2)

    摘要:筆記這周學習安裝和配置和,為測試做準備。該軟件由創(chuàng)建,并于年首次公開發(fā)布。同名公司成立于年,以提供支持。從年月開始,的開發(fā)由贊助,而年月至年月期間,其開發(fā)由贊助。最后發(fā)現(xiàn)是因為中的中的應該為大寫將其改為及解決了此問題。 筆記 這周學習安裝和配置nginx和redis,為測試做準備。showImg(https://segmentfault.com/img/bVbpdYF?w=660&h=...

    Shonim 評論0 收藏0
  • 設計模式學習筆記:適配器模式

    摘要:二適配器模式概念適配器模式是一種結構型模式,它的思想是將一個接口轉化為另一個接口。適配器模式包含四個角色對象定義所需要的方法請求者負責使用對象定義的方法來做具體的處理被適配者以持有方法的角色適配器使用被適配者的方法來滿足對象的需要。 一、結構型設計模式 1、概念結構型設計模式描述如何將類或者對象結合在一起形成更為復雜,功能更為強大的結構。 2、分類(1)類結構模型:這種結構模型關心類的...

    CompileYouth 評論0 收藏0
  • SpringMVC入門筆記

    摘要:入門筆記簡介是一種基于的實現(xiàn)了設計模式的請求驅動類型的輕量級框架,是系開源項目中的一個,和配合使用。配置在中需要添加使用的和映射規(guī)則。入門較快,而掌握起來相對較難。 SpringMVC入門筆記 1. 簡介 Spring MVC是一種基于Java的實現(xiàn)了Web MVC設計模式的請求驅動類型的輕量級Web框架 ,是Spring系開源項目中的一個,和IoC配合使用。通過策略接口,Spring...

    zhaochunqi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<