概述
- 是Spring爲展示層提供的基於MVC設計理念的Web框架,經過一套MVC註解,讓POJO成爲處理請求的控制器,而無需實現任何接口
- 支持REST風格的URL請求
- 採用鬆散耦合的可插拔組件結構,比其餘MVC框架更具擴展性和靈活性
- SpringMVC的IOC容器是Spring的IOC容器的子容器,故而可引用Spring的IOC中的bean,反之則不行
運行流程
- 當前端發出請求時,首先進入到DispatcherServlet(中央控制器),把請求的地址傳給HandlerMapping處理器映射器中進行比對(Handler即包含了咱們請求的Controller類和Method方法的對象)
- 未找到則表示靜態資源,進入defaultServlet處理器,返回前端
- 找到則表示動態資源,調用AdapterMap數據適配器,獲取該資源的執行列表(目標方法,攔截器方法),並返回處理器執行鏈(HandlerExecutionChain)給中央控制器
- 中央控制器將結果交給HandlerAdapter處理器適配器,依次執行執行列表的方法,返回邏輯視圖ModelAndView給中央控制器
- 將結果交給ViewResolver視圖解析器,遍歷生成具體的View物理視圖
- 中央控制器調用render方法渲染視圖,即將數據文件轉化成可視化界面返回前端
步驟
- 導入jar包,在web.xml中配置中央控制器DispatcherServlet,加入SpringMVC配置文件
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置中央控制器的初始化參數:配置文件的位置和名稱 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 默認爲WEB-INF/<servlet-name>-servlet.xml -->
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<!-- 配置servlet被加載的前後順序 -->
<!-- 爲負數或者沒有設置,則容器會當Servlet被請求時再加載 -->
<!-- 爲正整數或者0時,表示容器在應用啓動時就加載並初始化這個servlet -->
<!-- 值越小,servlet的優先級越高,就越先被加載。值相同時,容器就會本身選擇順序來加載 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 編寫處理請求的處理器並標識@Controller,編寫視圖
- 使用@RequestMapping("/地址") //映射請求的URL,可放在類與方法上,方法返回值進入視圖解析器(使用@GetMapping("/地址")響應get請求,@PostMapping("/地址")響應post請求)
<!--註解驅動,以使得訪問路徑與方法的匹配能夠經過註解配置-->
<mvc:annotation-driven />
<!-- 在配置dispatchServlet時配置<url-pattern>/</url-pattern>攔截全部請求,這時候dispatchServlet徹底取代了default servlet,將不會再訪問容器中原始默認的servlet,而對靜態資源的訪問就是經過容器默認servlet處理的,故而這時候靜態資源將不可訪問,使用下列標籤訪問靜態資源 -->
<mvc:default-servlet-handler/>
- 在SpringMVC配置文件中配置要掃描的包,配置視圖解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/響應地址前綴/"></property>
<property name="suffix" value=".後綴"></property>
</bean>
REST
- 資源表現層狀態轉換,是一種互聯網軟件架構
- 資源:網絡上的一個實體即一個具體信息,可爲一段文字,一張圖片,一種服務,總之是一個具體的存在,能夠用URI指向它,每種資源對應一個特定的URI,訪問URI可獲取這個資源
- 表現層:把資源具體呈現出來的形式,就爲表現層,如txt、json、html、二進制等
- 狀態轉化:每發出一次請求,就表明客戶端和服務器的一次交互過程,http爲無狀態協議,全部的狀態保存在服務器中,所以要想操做服務器,必須經過某種手段,讓服務器發生狀態轉化。Http協議裏有四種基本操做:GET用來獲取資源,POST用來新建資源,PUT用來更新資源,DELETE用來刪除資源
註解
-
@RequestMappinghtml
- 爲控制器指定可處理那些請求,進而肯定執行那個方法
- 定義類上:提供初步的請求映射信息
- 定義方法上:提供細分的映射信息
- 屬性
- value:請求url
- method:請求方法(RequestMethod.get,RequestMethod.post)多值用數組
- params:請求參數
- 值可以使用簡單表達式,例!p表示請求參數不能包含p
- params={「name」,「age!=10」} 參數age不爲10
- heads:請求頭
- 值可以使用簡單表達式,heads={「Accept-Language=en-US,zh」}
- 可聯合使用,使請求更加精確化
- 支持Ant風格匹配符
- 匹配文件名中的一個字符 ?
- 匹配文件名中的任意字符 *
- 匹配多層路徑 **
- @PathVariable 用來將URL中的佔位符參數綁定到目標方法的參數中
- @RequestMapping("/a/{id}")
- HiddenHttpMethodFilter 過濾器將請求轉換爲標準的http方法,使瀏覽器form表單支持put,delete請求
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- CharacterEncodingFilter 過濾器用於處理中文
<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>
- @RequestParam
- 用來映射url中請求參數
- 定義在方法形參前,給形參賦值
- 屬性
- value:請求參數的參數名
- required:該參數是否必須,默認爲true
- defaultValue:請求參數默認值
- @RequestHeader
- 映射請求頭信息
- 將請求報頭的屬性值綁定處處理方法的形參中
- 請求頭包含若干屬性,服務器可據此獲知客戶端信息
- 屬性
- @CookieValue
- 映射Cookie信息
- 屬性與RequestParam相同
- @ResponseBody
- 標註在方法上
- 將java對象轉爲json格式的數據
- 將controller的方法返回的對象經過適當的轉換器轉換爲指定的格式以後,寫入到response對象的body區,一般用來返回JSON或XML數據(用於異步獲取數據)
- 在使用此註解以後不會再走視圖處理器,而是直接將數據寫入到輸入流中,他的效果等同於經過response對象輸出指定格式的數據
- 所需jar包:jackson-annotations-2.9.0.pr2.jar,jackson-core-2.9.0.pr2.jar,jackson-databind-2.9.0.pr2.jar
- 使用fastJSON.jar 對象轉json:JSON.toJSONString(對象)
- 使用fastJSON.jar json轉對象:JSON.parseObject(json,對象.class)
- @RequestBody
- 標註在形參上
- 將前臺發送過來的JSON或XML數據封裝爲對應的 JavaBean 對象,封裝時使用到的一個對象是系統默認配置的 HttpMessageConverter 進行解析,而後封裝到形參上
- GET、POST方式提交
- 表單屬性 enctype
- 可選 application/x-www-form-urlencoded
- 不能處理 multipart/form-data 格式的數據
- 必須 application/json,application/xml 格式的數據
- PUT方式提交
- 表單屬性 enctype
- 必須 application/x-www-form-urlencoded
- 不能處理 multipart/form-data 格式的數據
- @initBinder
- 提供數據綁定,可對WebDataBinder對象進行初始化
- 標註方法不能有返回值
- @NumberFormat
- @DateTimeFormat
- 對日期類型屬性格式化
- pattern屬性:yyyy-MM-dd hh:mm:ss
處理器參數
POJO
- 普通Java類,具備一部分getter/setter方法的那種類就能夠稱做POJO,實際意義就是普通的JavaBeans(簡單的實體類),特色就是支持業務邏輯的協助類
- SpringMVC會按請求參數名與pojo屬性名進行自動匹配,自動填充屬性值。且支持級聯屬性
servlet原生API
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader
- Writer
處理器處理模型數據
Map,Model或ModelMap類型
- 使用org.springframework.ui.Model接口存儲模型數據
- 過程:在調用方法前會建立一個隱含的模型對象做爲存儲容器,若是參數是Map或Model類型,則將模型的引用傳遞給參數,從而經過參數對象訪問模型中的數據或向模型中添加新屬性數據
- 添加Map.put(「對象名」,對象值)、Model.addAttribute(「對象名」,對象值)
- 返回String類型
ModelAndView類型
- 包含視圖與模型信息
- ModelAndView ret = new ModelAndView(); //實例化
- ret.add(「對象名」,對象值) //添加數據到ModelAndView中
- SpringMVC會把ModelAndView的Model中的數據放到request域對象中
- 返回ModelAndView類型
@SessionAttributes
- 用於在多個請求之間公用某個模型屬性數據
- 標註在控制器類上,使屬性暫存在HttpSession中,屬性就可在session中獲取
- 屬性
- value={屬性名}
- types={屬性類型.class}
@ModelAttribute
- 標註在方法上,使每一個目標方法執行以前被SpringMVC調用將標註方法的屬性賦值給對應參數
- 標註在pojo類型形參前,使形參爲被@ModelAttribute標註的方法的屬性
- 注:在標註方法中放入map中的鍵與目標方法形參一致(首字母小寫)
視圖解析器
- 對於返回String,View,ModeMap等類型,SpringMVC會在內部將它們裝配成一個ModelAndView對象,包含邏輯名和模型對象的視圖,藉助視圖解析器最終獲得視圖對象View
- 視圖的做用是渲染模型數據,將模型裏的數據以某種形式呈現給客戶
- 視圖對象由視圖解析器負責實例化。因爲視圖是無狀態的,因此他們不會有線程安全的問題。所謂視圖是無狀態的,是指對於每個請求,都會建立一個View對象
- JSP是最多見的視圖技術,結合JSTL使用
- 經常使用視圖解析器實現類
- BeanNameViewResolver:將邏輯視圖解析爲一個bean,bean的id等於邏輯視圖名,自動根據咱們的視圖名找到對應的視圖Bean進行解析
- InternalResourceViewResolver:將視圖名解析爲一個url文件,會把 Controller 處理器方法返回的模型屬性都存放到對應的 request 屬性中,而後經過 RequestDispatcher 在服務器端把請求 forword 重定向到目標 URL
- 多個解析器可經過order屬性來指定優先級,越小優先級越高
轉向與重定向
- 通常狀況下控制器方法返回字符串類型的值會被視圖解析器處理
- 若返回字符串帶有前綴,則作特殊處理,把其後字符串做爲url
- 重定向:在返回值前加redirect:
- 轉向:在返回值前加forward:
配置文件標籤
- <mvc:annotation-driven/> //註解驅動
- 自動註冊 RequestMappingHandlerMapping,RequestMappingHandlerAdapter 與 ExceptionHandlerExceptionResolver 三個bean(3.1以上)
- 自動爲咱們將掃描到的@Component,@Controller,@Service,@Repository等註解標記的組件註冊到工廠中,來處理咱們的請求,而<context:component-scan/>標籤是告訴Spring 來掃描指定包下的類,並註冊被上述註解標記的組件
- <mvc:default-servlet-handler/>
- 會在Spring MVC上下文中定義一個org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它會像一個檢查員,對進入DispatcherServlet的URL進行篩查,若是發現是靜態資源的請求,就將該請求轉由Web應用服務器默認的Servlet處理,若是不是靜態資源的請求,才由DispatcherServlet繼續處理
- 通常Web應用服務器默認的Servlet名稱是"default",所以DefaultServletHttpRequestHandler能夠找到它。若是你全部的Web應用服務器的默認Servlet名稱不是"default",則須要經過default-servlet-name屬性顯示指定
- <mvc:view-controller>
- 發送的請求不想經過controller,只想直接地跳轉到目標頁面
- path=「訪問的路徑」(至關於RequestMapping(「訪問的路徑」))
- view-name=「跳轉的視圖」 (至關於return 「跳轉的視圖」)
- 必須配置 <mvc:annotation-driven />
- 與處理器相同則失效
文件上傳
-
所需jar包:commons-fileupload-1.3.2.jar,commons-io-2.5.jar前端
-
SpringMVC經過即插即用的MultipartResolver接口實現,實現類爲CommonsMultipartResolverjava
-
CommonsMultipartResolver配置web
- defaultEncoding必須與jsp頁面pageEncoding屬性一致
- jsp頁面表單屬性enctype 必須 enctype=「multipart/form-data」
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!--文件大小限定-->
<property name="maxUploadSize" value="5242880"></property>
</bean>
-
controller層形參類型爲MultipartResolverspring
-
獲取上傳文件名方法:getOriginalFilename()sql
-
獲取文件輸入流:getInputStream()json
-
將文件寫入磁盤:transferTo(路徑)數組
-
獲取隨機數 UUID uuid=UUID.randomUUID()瀏覽器
- 定義爲上傳文件名String filePreName=uuid.toString().replaceAll("-", 「」)
文件下載
- 1.可經過連接直接下載特定的後綴的文件
- 2.經過附件方式
- 建立一個文件輸入流 InputStream is=new FileInputStream(文件路徑)
- 轉成字符數組 byte[] data=new byte[is.available()]
- 寫入流 is.read(data);
- 實例化頭部對象 HttpHeaders headers=new HttpHeaders()
- 轉碼 String name=new String(readFileName.getBytes(「UTF-8」),「ISO8859-1」)
- 設置附件 headers.setContentDispositionFormData(「attachment」, name)
- 設置資源類型headers.setContentType(MediaType.APPLICATION_OCTET_STREAM)
- 數據加入到附件中 ResponseEntity<byte[]> entity=new ResponseEntity<byte[]>(data, headers, HttpStatus.OK)
攔截器
- 與過濾器不一樣的是攔截器攔截動態資源,即全部被@RequestMapping,@GetMapping ,@PostMapping標註的資源
- 實現HandlerInterceptor接口
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) //目標方法以前執行,返回true表示放行
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) //目標方法執行結束以後執行
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) //頁面銷燬時執行
- 攔截器配置
<mvc:interceptors>
<!--自定義攔截器-->
<bean class="攔截器類路徑"></bean>
<!--選擇攔截-->
<mvc:interceptor>
<!--攔截路徑,**表明路徑及子路徑-->
<mvc:mapping path="/**"/>
<!--不攔截路徑-->
<mvc:exclude-mapping path="/路徑"/>
<bean class="攔截器類路徑"></bean>
</mvc:interceptor>
</mvc:interceptors>
異常處理
- 經過HandlerExceptionResolver接口處理異常,包括Handler映射,數據綁定以及目標方法執行發生的異常
- ExceptionHandlerExceptionResolver實現類經過<mvc:annotation-driven/>加載
- @ControllerAdvice //標註在自定義處理異常類上
- 先找當前Handler中的@ExceptionHandler,若未找到匹配的異常類,則去ControllerAdvice標記的類中查找
- @ExceptionHandler({異常類.class}) //標註在異常方法上發生此異常類自動執行方法處理異常,處理內部異常
- ResponseStatusExceptionResolver實現類
- @ResponseStatus //標註在繼承此類的類上或發生異常的方法上
- DefaultHandlerExceptionResolver實現類處理特殊異常,例請求方法異常
- SimpleMappingExceptionResolver實現類
- 可將不一樣的異常映射到不一樣的jsp頁面(經過exceptionMappings屬性的配置),同時咱們也能夠爲全部的異常指定一個默認的異常
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定義默認的異常處理頁面,當該異常類型的註冊時使用 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定義異常處理頁面用來獲取異常信息的變量名,默認名爲exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定義須要特殊處理的異常,用類名或徹底路徑名做爲key,異常也頁名做爲值 -->
<property name="exceptionMappings">
<props>
<prop key="IOException">error/ioexp</prop>
<prop key="java.sql.SQLException">error/sqlexp</prop>
</props>
</property>
</bean>
導入其餘配置文件
- 1.經過<import resource=「文件」/>導入
- 2.在web.xml中引入
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:文件路徑</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
最後
感謝你看到這裏,看完有什麼的不懂的能夠在評論區問我,以爲文章對你有幫助的話記得給我點個贊,天天都會分享java相關技術文章或行業資訊,歡迎你們關注和轉發文章!安全