兄弟萌,這份SpringMVC框架學習筆記真的建議反覆看,寫的太細了

概述

  • 是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}")
        • @PathVariable(「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
    • 映射請求頭信息
    • 將請求報頭的屬性值綁定處處理方法的形參中
    • 請求頭包含若干屬性,服務器可據此獲知客戶端信息
    • 屬性
      • value:請求頭參數的參數名
  • @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 //標註在繼承此類的類上或發生異常的方法上
      • value:狀態碼
      • reason:信息
  • 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相關技術文章或行業資訊,歡迎你們關注和轉發文章!安全

相關文章
相關標籤/搜索