SpringMVC學習要點--十分鐘幫你快速掌握框架核心

<code>《“愛讀書”--給你講技術》,我來看書,你來進步,讓我們開始吧!/<code> 

本書簡介

書名為《Spring+MyBatis企業應用實戰》,是本人在學習JavaEE框架時候的一本基礎書籍,本書對於SpringMVC和MyBatis框架及相關基礎知識講述的比較清晰,適合需要詳細學習Java框架的讀者。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

本文內容為本書第二章--第八章,記錄和總結了所有SpringMVC的知識

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

DispatcherServlet

1.DispatcherServlet使用和配置

SpringMVC提供了一個名為
org.springframework.web.servlet.DispatcherServlet的Servlet充當前端控制器,所有請求驅動都圍繞這個DispatcherServlet來分配請求。DispatcherServlet是一個Servlet類,需要在web.xml中完成配置。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(1)配置了啟動時立即加載Servlet

(2)需要配置springmvc-config.xml配置文件

(3)配置了用當前servlet處理所有請求URL

2.DispatcherServlet的分發原理

先看一下DispatcherServlet源碼中的方法

源碼如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

initStrategies方法將在WebApplicationContext初始化後自動執行,自動掃描上下文的Bean,根據名稱或類型匹配機制查找自定義的組件。如果沒有找到則會裝配一套默認組件,默認組件在


DispatcherServlet.properties配置文件中。

配置文件如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

如 果開發者希望使用自定義類型的組件,則只需要在Spring配置文件中配置自定義的Bean即可。MVC如果發現上下文中有用戶自定義的組件,就不會使用默認組件。

SpringMVC開發步驟

1.在web.xml中定義前端控制器DispatcherServlet來攔截用戶請求

2.定義處理用戶請求的Handle類,可以實現Controller接口或使用@Controller註解

3.配置Handle,可採用xml文件或註解的方式

<code> 
/<code>
<code>@Controller
public class HelloController{
    @RequestMapping(value="/hello")
    public ModelAndView hello(){
    }
}/<code>

4.編寫視圖資源,Handle處理用戶請求結束後,通常會返回一個ModelAndView對象,該對象包含返回的試圖名和模型。試圖名代表需要顯示的物理視圖資源;模型用於傳輸數據給視圖資源。

SpringMVC執行流程

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

說明如下:

(1)用戶向服務器發送請求,請求被Spring的前端控制器DispatcherServlet截獲

(2)DispatcherServlet對請求URL進行解析,得到URI。然後根據URI,調用HandlerMapping獲得該Handler配置的所有相關對象,包括Handler對象以及Handler對象對應的攔截器,會被封裝到一個HandlerExecutionChain對象中返回

(3)DispatcherServlet根據獲得的Handler,選擇一個HandlerAdapter。HandlerAdapter會被用於處理多種Handler,調用Handler實際處理請求的方法

(4)提取請求中的模型數據,開始執行Handler。在填充Handler的入參過程中,根據配置spring會幫你實現消息轉換、數據轉換、數據格式化、數據驗證

(5)Handler執行完成後,向DispatcherServlet返回一個ModelAndView對象。ModelAndView對象中包含試圖名和模型

(6)根據返回的ModelAndView對象,選擇一個ViewResolver返回給DispatcherServlet

(7)ViewResolver結合Model和View來渲染視圖

(8)將試圖渲染結果返回給客戶端

SpringMVC常用註解

1.@Controller註解

@Controller用於標記一個類,使用它標記的類就是一個Controller對象,及一個控制器。Spring使用掃描機制查找應用中所有基於註解的控制器類。

<code>@Controller
public class HelloController{
    @RequestMapping(value="/hello")
    public ModelAndView hello(){
    }
}/<code>

使用註解前需要如下步驟

  • 在SpringMVC配置文件的頭中引入spring-context
  • 使用元素,功能是:啟動包掃描功能,以便註冊帶有@Controller、@Service、@Repository、@Component等註解的類成為Bean。base-package指定了需要掃描的類包,類包及其遞歸子包中的所有類都會被掃描。配置如下:
<code>/<code>

springmvc-config.xml常用配置

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

說明如下:

(1)使用指定需要掃描的包

(2)會自動註冊
RequestMappingHandlerMapping和Request MappingHandlerAdapter兩個Bean,提供註解的必要支持

(3)<
mvc:default-servlet-handler>是靜態資源處理器,SpringMVC會默認捕獲所有請求,包括靜態資源請求。配置了當前元素後靜態資源不會被DispatcherServlet處理

(4)視圖解析器
InternalResourceViewResolver來解析視圖,將View呈現給用戶。配置的prefix屬性表示視圖的前綴,suffix表示視圖的後綴。

2.@RequestMapping註解

@RequestMapping註解可以用來註釋一個控制器類,所有方法都將映射為相對於類級別的請求,表示該控制器處理的所有請求都被映射到value屬性所指示的路徑下。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

上圖代表映射到如下路徑:

<code>http://localhost:8080/user/register
http://localhost:8080/user/login/<code>

常用屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

3.請求處理方法可出現的參數類型

所有參數Spring會自動將值傳給方法

(1)HttpServletRequest參數

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(2)HttpSession參數

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(3)HttpServletResponse

(4)InputStream

(5)OutputStream

(6)Map

(7)Model

(8)ModelMap

(9)BindingResult

(10)WebRequest

4.請求處理方法可返回的類型

  • ModelAndView
  • Model
  • Map
  • View
  • String

下面做一些詳細說明。

(1)Model和ModelMap

SpringMVC在調用處理方法之前會創建一個隱含的模型對象,作為模型數據的存儲容器。如果處理方法的參數為Model或ModelMap類型,則SpringMVC會將隱含模型的引用傳遞給這些參數。在處理方法內部,開發者可以通過這個參數對象訪問模型中的所有數據,也可以向模型中添加新的數據。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(2)ModelAndView

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

常用方法如下:

<code>//添加模型數據
addObject(String key, Object value);
//設置視圖
setViewName(String name);/<code>
SpringMVC學習要點--十分鐘幫你快速掌握框架核心

5.頁面轉發

(1)轉發到JSP

<code>//默認forward跳轉
return "main";
modelAndView.setViewName("main");
//重定向頁面
return "redirect:/main.jsp";
modelAndView.setViewName("redirect:/main.jsp");/<code>

(2)轉發到其他處理方法

<code>//forward跳轉
return "forward:/main";
modelAndView.setViewName("forward:/main");
//重定向
return "redirect:/main";
modelAndView.setViewName("redirect:/main");/<code>

6.@RequestParam註解

@RequestParam用於將指定的請求參數賦值給方法中的形參。屬性如下:

<code>name:指定請求參數綁定的名稱
value:name屬性的別名
required:指定參數是否必須綁定
defaultValue:指定默認值/<code>
SpringMVC學習要點--十分鐘幫你快速掌握框架核心

7.@PathVariable註解

@PathVariable可以方便的獲得請求URL中的動態參數。屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

舉例如下:

<code>@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable Integer userId)/<code>

假如請求的URL為
http://localhost:8080/pathVariableTest/1,則自動將URL中模板變量{userId}綁定到通過@PathVariable註解的同名參數上,即userId變量將被賦值為1。

8.@RequestHeader註解

@RequestHeader註解用於將請求頭信息數據映射到功能處理方法的參數上。屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

9.@CookieValue註解

@CookieValue註解用於將請求的Cookie數據映射到功能處理方法的參數上。屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

10.@RequestAttribute註解

@RequestAttribute註解用於訪問由請求處理方法、過濾器或攔截器創建的、預先存在於request作用域中的屬性,將該屬性轉換到目標方法的參數。屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

11.@SessionAttribute註解

@SessionAttribute註解用於訪問由請求處理方法、過濾器或攔截器創建的、預先存在於session作用域中的屬性,將該屬性轉換到目標方法的參數。屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

12.@ModelAttribute註解

@ModelAttribute註解用於將請求參數綁定到對象。

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

Form請求的參數值會自動入參到@ModelAttribute註解的對象的同名屬性中

13.@RequestBody註解

@RequestBody註解用來處理content-type類型為:application/json或application/xml的情況,將請求數據綁定到方法參數上。

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

其中前臺向處理方法傳遞了Json格式的數據,Json數據的key和Book屬性相對應

14.@ResponseBody註解

@ResponseBody註解用於將請求處理方法返回的對象,轉換為指定格式後,寫入到Response對象的body中。返回的數據不是HTML頁面,而是其他格式數據,如JSON、XML時使用註解。

舉例如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

上圖將List轉換為Json格式輸出

15.@RestController註解

@RestController註解相當於同時使用了@Controller和@ResponseBody。用於RESTFUL風格的請求處理方式。

SpringMVC異常處理

SpringMVC提供的兩種異常處理方式:

  • 使用異常處理器SimpleMappingExceptionResolver,類有如下方法:
<code>//該方法處理程序執行期間被拋出的異常,返回一個模型和視圖,視圖返回錯誤處理頁面
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response)/<code>

通過springmvc-config.xml配置實現

<code> 

       
      
          
              ioerror
              sqlerror
         
     
/<code>
  • 使用@ExceptionHandler註解實現局部異常處理
SpringMVC學習要點--十分鐘幫你快速掌握框架核心

@ExceptionHandler註解只在當前類生效

  • 使用@ControllerAdvice註解實現全局異常處理

使用掃描到@ControllerAdvice註解後,會將註解修飾的類內部使用@ExceptionHandler、@InitBinder、@ModelAttribute註解的方法應用到所有請求的異常處理上。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

SpringMVC國際化

1.messageSource接口

SpringMVC不直接使用java.util.ResourceBundle,而是使用messageSource的Bean來配置國際化屬性文件。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

上圖basenames指定了資源文件的名稱

2.localeResolver接口

SpringMVC使用語言區域解析器來實現用戶選擇語言區域。提供了一個語言區域解析器接口LocaleResolver,實現類包括:

  • AcceptHeaderLocaleResolver
  • SessionLocaleResolver
  • CookieLocaleResolver


AcceptHeaderLocaleResolver是默認解析器,會讀取瀏覽器accept-language標題,來確定使用哪個語言區域

3.message標籤

SpringMVC顯示本地化消息使用message標籤,使用前需先導入taglib標籤庫。

<code>/<code>

message標籤屬性如下:

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

4.AcceptHeaderLocaleResolver

實現步驟:

(1)創建資源文件

message_en_US.properties

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

message_zh_CN.properties

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(2)在JSP中使用message標籤輸出國際化消息

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(3)在SpringMVC配置文件中加載國際化資源文件並配置

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(4)可在controller中使用國際化

<code>RequestContext requestContext = new RequestContext(request);
String username = requestContext.getMessage("username");/<code>

SpringMVC數據轉換、格式化、校驗原理

Spring MVC框架將ServletRequest對象及處理方法的參數對象傳遞給DataBinder,DataBinder調用ConversionService組件進行數據類型轉換、數據格式化工作,並將ServletRequest中的消息填充到參數對象中。然後再調用Validator組件對已經綁定了請求消息數據的參數對象進行數據合法性校驗,並最終生成 數據綁定結果BindingResult 對象。

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

SpringMVC文件上傳

實現步驟:

(1)創建表單並設置為multipart/form-data

(2)創建controller

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

SpringMVC會將上傳文件綁定到MultipartFile對象。MultipartFile提供了獲取上傳文件內容、文件名等方法。

MultipartFile常用方法如下:

<code>byte[] getBytes():獲取文件數據
String getContentType():獲取文件MIME類型,如image/jpeg
InputStream getInputStream():獲取文件流
String getName(): 獲取表單中文件組件的名稱
String getOriginalFilename():獲取上傳文件的原名
long getSize(): 獲取文件的字節大小,單位為byte
boolean isEmpty(): 是否有上傳的文件
void transferTo(File file):將上傳文件保存到一個目標文件中/<code> 

(3)在SpringMVC配置文件中增加文件上傳功能(配置MultipartResolver)

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

CommonsMultipartResolver必須依賴於Apach FileUpload組件,需要引入JAR包

SpringMVC文件下載

實現步驟:

(1)在頁面中加入下載超鏈接,鏈接地址指向controller方法

(2)編寫controller處理方法,用於文件下載

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

使用Apache FileUpload組件FileUtils讀取要下載的文件,並將其構建成ResponseEntity對象返回。ResponseEntity對象可以方便的定義返回的BodyBuilder、HttpHeaders、HttpStatus。

BodyBuilder對象用來構建返回的Body

HttpHeaders代表Http協議頭信息

HttpStatus代表Http協議的狀態

SpringMVC攔截器

Interceptor攔截器的主要作用是攔截用戶的請求並進行相應的處理(比如通過攔截器來進行用戶權限驗證,或者用來判斷用戶是否已經登錄等)

1.HandlerInterceptor接口

定義攔截器類需要實現HandlerInterceptor接口或繼承抽象類HandlerInterceptorAdapter

接口中的方法如下:

<code>//該方法在請求處理之前被調用,可以做前置的初始化操作或者是對當前請求的一個預處理,也可以判斷來請求是否要繼續進行下去。當返回值為false,表示請求結束,後續的Interceptor和Controller不會再執行;當返回值為true澤會繼續執行
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
//該方法在controller方法被執行,在視圖返回渲染前被調用。可以在這個方法中對處理後的ModelAndView進行操作
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
//該方法將在整個請求結束後執行,作用是進行資源清理
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)/<code>

實現步驟:

(1)定義攔截器類,實現接口和接口中的方法

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

SpringMVC學習要點--十分鐘幫你快速掌握框架核心

(2)在配置文件中配置攔截器(springmvc-config.xml)

<code> 

    
         
        
         
        
        
/<code>


分享到:


相關文章: