SpringMVC中的常用註解

SpringMVC中使用 servlet 的對象:(Request,Response,Session,Cookie)

           springmvc已經幫我們封裝好了這些對象,只需在方法參數上使用所需要的對象即可

  1. @Controller
  2. public class ServletController {
  3. /**
  4. * 只要在控制器方法上加入request,response,session類型的參數,springmvc框架會把這些對象準備好作爲方法參數傳入
  5. * 建議不要直接在方法參數上使用 Servlet 的(request,response,session)對象
  6. * @param request
  7. * @param response
  8. * @param session
  9. * @return
  10. */
  11. @RequestMapping("/s1")
  12. public String s1(HttpServletRequest request, HttpServletResponse response, HttpSession session){
  13. System.out.println("獲取實際請求路徑:"+request.getRequestURI());
  14. System.out.println("獲取客戶端的ip:"+request.getRequestURI());
  15. System.out.println("response的對象:"+response);
  16. response.addCookie(new Cookie("user","chen"));
  17. System.out.println("session的對象:"+session);
  18. return "hello";
  19. }
  20. }

  

SpringMVC頁面轉發:

       服務器內部跳轉(forward)和 客戶端重定向(redirect

             1) 轉發

                        (1) 轉發到JSP頁面:  請求處理方法返回字符串,默認使用服務器內部跳轉                                                                                                   (  request.getRequestDispatcher("指定頁面").forward(request,response)  )

                示例: return "hello";  (視圖名: 視圖解析器會根據視圖名拼接成正確的訪問路徑  " /hello.jsp")

                        (2)轉發到服務器內部的請求:在返回的字符串前面加入 “ forward:/ 路徑名

                示例: return " forward:/ main ";( 在服務器內部跳轉到名爲 main 的請求處理方法中)

            2)重定向

                        (1)重定向到 JSP頁面:在返回字符串的前面加上 “ redirect:/xxx.jsp

                 示例:return " redirect:/xxx.jsp "

    ***注意:

              由於客戶端重定向(redirect)相當於在瀏覽器重新發一次請求,所以不能訪問 WEB-INF 下的資源文件,而且資源文件必須寫完整(xxx.jsp),因爲此時的視圖解析器不會將該字符串進行解析,拼接

                         (2)重定向到 Controller 上 :  在返回的字符串前面加上  “ redirect:/路徑名 ”

                  示例: return " redirect:/main "; ( 客戶端重定向到名爲 main 的請求處理方法中 )

 

 Spring MVC 傳值:

            方法一:使用session傳值 :

                 優點:信息相對比較安全,可以傳輸任意類型的數據

                 缺點:每個session都會佔用服務器的內存

              測試代碼:

  1. @Controller
  2. public class RedirectController {
  3. /**
  4. * 方法一: 利用 HttpServletResponse 對象的重定向
  5. * session 傳值:
  6. * 優點: 安全性高,可傳任意類型的數據
  7. * 缺點: 每個session都會佔用服務器的內存
  8. *
  9. * @param response
  10. * @return
  11. * @throws IOException
  12. */
  13. @RequestMapping("/r1")
  14. public String r1(HttpServletResponse response, HttpSession session) throws IOException {
  15. System.out.println("r1");
  16. // 一次會話之內有效
  17. session.setAttribute("name","chen");
  18. //response.sendRedirect("/r2");
  19. // 在視圖名前面添加 `redirect:`,這時候springmvc就會把字符串當做重定向進行跳轉,而不是再通過視圖解析器進行解析
  20. return "redirect:/r2";
  21. }
  22. @RequestMapping("/r2")
  23. public String r2(HttpSession session){
  24. System.out.println("r2");
  25. System.out.println(session.getAttribute("name"));
  26. // 需要手動移除 session 的值
  27. session.removeAttribute("name");
  28. return "hello";
  29. }
  30. }

           方法二: 利用重定向後面跟上請求參數的方法

           優點: 不會佔用服務器的內存,可以向站外地址傳值

           缺點:  信息不安全,暴露在地址欄後面,可以傳輸的數據類型和數據大小有限制

  測試代碼:

  1. @Controller
  2. public class RedirectController {
  3. /**
  4. * 利用重定向地址後跟請求參數的方式
  5. * 優點: 不會佔用服務器內存,可以向站外地址傳參
  6. * 缺點: 安全性不高,數據大小有限制,不能傳 複雜的 數據類型
  7. * @return
  8. */
  9. @RequestMapping("/r3")
  10. public String r3(){
  11. System.out.println("r3");
  12. return "redirect:/r4?username=zhangsan";
  13. }
  14. @RequestMapping("/r4")
  15. public String r4(String username){
  16. System.out.println("r4");
  17. System.out.println("username: "+username);
  18. return "hello";
  19. }
  20. }

           方法三:使用 Spring MVC提供的傳參的對象(RedirectAttributes):專門在重定向時傳參,綜合了上面兩種方法

              RedirectAttributes : 傳參,專門在重定向時傳參

              @ModelAttributes: 接收值

                     方式一(重定向後面跟請求參數的方式): redirect.addAttribute("參數名",參數值);

                     方式二(使用session傳值的方式):redirect.addFlashAttribute("參數名",參數值);

測試代碼:

  1. @Controller
  2. public class RedirectController {
  3. /**
  4. * SpringMVC提供的重定向方法:結合了上面兩種方式的傳參方式
  5. * RedirectAttributes : 傳參,專門在重定向時傳參
  6. * @ModelAttributes: 接收值
  7. * 方式一(重定向後面跟請求參數的方式): redirect.addAttribute("username","chen");
  8. * 方式二(使用session傳值的方式):redirect.addFlashAttribute("username","kobe");
  9. *
  10. * @param redirect
  11. * @return
  12. */
  13. @RequestMapping("/r5")
  14. public String r5(RedirectAttributes redirect){
  15. System.out.println("r5");
  16. // 採用的是 重定向後面跟請求參數的方式
  17. redirect.addAttribute("username","chen");
  18. // 採用的是 session 的傳值方式
  19. redirect.addFlashAttribute("username","kobe");
  20. return "redirect:/r6";
  21. }
  22. @RequestMapping("/r6")
  23. public String r6(@ModelAttribute("username")String name){
  24. System.out.println("r6");
  25. System.out.println("username: "+name);
  26. return "hello";
  27. }
  28. }

 

Spring MVC中的異常處理:

      SpringMVC提供了兩種方式

         1)使用 SpringMVC提供的簡單異常處理器 SimpleMapperingExceptionResolver (需要配合 .xml 文件來配置)

         2)使用註解@ExceptionHandler用在方法上) 實現局部異常處理使用註解@ControllerAdvice(類)實現全局統一處理異常

***注意:不建議在請求處理方法中寫異常處理塊(catch),因爲這種處理方式非常繁瑣,而且一旦改變異常處理方式,                       需要修改大量的代碼,耦合性較高

      

方式一: 使用 SimpleMapperingExceptionResolver  進行異常處理

           1)在 spring.xml 文件中配置:

  1. <!-- 
  2. p:defaultErrorView="error":表示所有沒有指定的異常,都跳轉到默認異常處理頁面 error.jsp 
  3. p:exceptionAttribute="ex" :表示異常處理頁面中訪問的異常對象變量名是 ex
  4. exceptionMappings: 表示映射的異常,接受參數是一個 Properties
  5. key:是異常類名, values:處理異常的頁面
  6. -->
  7. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
  8. p:defaultErrorView="error"
  9. p:exceptionAttribute="ex"
  10. >
  11. <property name="exceptionMappings">
  12. <props>
  13. <prop key="java.lang.ArrayIndexOutOfBoundsException">error1</prop>
  14. <prop key="java.lang.ArithmeticException">error2</prop>
  15. </props>
  16. </property>
  17. </bean>

         2)模擬異常的處理方法:

  1. @RequestMapping("/testSimpleMapingExceptionResolver")
  2. public String testSimpleMapingExceptionResolver(@RequestParam("i") int i){
  3. String[] values=new String[10];
  4. System.out.println(values[i]);
  5. return "success";
  6. }

          3)error.jsp頁面:

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ page isELIgnored="false" %>
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. 錯誤頁面!
  9. <br>
  10. ${requestScope.ex.message}
  11. </body>
  12. </html>

 

方式二: 使用註解 @ExceptionHandler用在方法上)  或 @ControllerAdvice(類) 實現處理異常

       1)@ExceptionHandler: 加在方法上,並且在運行時有效( 只能捕獲 本Controller 中發生的異常)

  1. @Controller
  2. public class ExceptionController {
  3. /**
  4. * springmvc 幫我們自動捕獲異常
  5. * @ExceptionHandler(ArithmeticException.class): 只能精確匹配異常類型,匹配到了,則執行該方法,若不匹配,則繼續報錯
  6. * @ExceptionHandler(Exception.class): 若沒匹配到該精確類型,則執行該異常的方法
  7. *
  8. * ***注意***: 以上自動捕獲異常值捕獲 ***本Controller*** 發生的異常,別的 Controller 若發生異常,則無法捕獲
  9. * @return
  10. */
  11. @RequestMapping("/e2")
  12. public String e2(){
  13. System.out.println("e2");
  14. int i = 1/0;
  15. int[] arr = new int[5];
  16. System.out.println(arr[6]);
  17. return "hello";
  18. }
  19. @ExceptionHandler(ArithmeticException.class)
  20. public String exception1(ArithmeticException e){
  21. System.out.println("錯誤信息:"+e.getMessage());
  22. return "error";
  23. }
  24. @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
  25. public String exception2(ArithmeticException e){
  26. System.out.println("錯誤信息:"+e.getMessage());
  27. return "error";
  28. }
  29. }

      2)使用 @ControllerAdvice : 它是一個控制器增強功能註解,加在上,                                                                                                                                       會將該類中所有使用了 @ExceptionHandler 註解的方法都應用到請求處理方法上

 測試代碼:先精確匹配異常類型,若匹配不到,則最後再匹配 Exception 類

  1. // 告知spring容器這是個 **全局捕獲異常類**
  2. @ControllerAdvice
  3. public class GlobalExceptionAdvice {
  4. @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
  5. public String exception1(ArrayIndexOutOfBoundsException e){
  6. System.out.println("數組越界:"+e.getMessage());
  7. return "error";
  8. }
  9. @ExceptionHandler(Exception.class)
  10. public String exception2(Exception e){
  11. System.out.println(e.getMessage());
  12. return "error";
  13. }
  14. @ExceptionHandler(ArithmeticException.class)
  15. public String exception3(ArithmeticException e){
  16. System.out.println(e.getMessage());
  17. return "error";
  18. }
  19. }

***注意:   

       1) @EceptionHandler 該方法只能捕獲本控制器類出現的異常
       2) 匹配異常類型時,會匹配一個最接近的異常類型
       3) @ControllerAdvice : 全局控制器的通知類, 加在通知類上,這樣當某個控制器出現異常時,                                                                                    先找本類的異常處理器,如果找不到,那麼再到通知類中找全局的異常處理器

 

SpringMVC文件上傳:

            SpringMVC對本間上傳提供了直接的支持,使用 MultipartResolver(文件解析器) 實現的,                                                  爲了來解決表單提交的數據格式是 enctype = "Multipart/form-data", 瀏覽器就會採用二進制的方式來處理表單數據

     1)在 pom.xml 中導入文件上傳所需的 commons-fileupload-1.3.3.jar 和 commons-io-2.2.jar 兩個jar 包

  1. <!-- 文件上傳(可選) -->
  2. <dependency>
  3. <groupId>commons-fileupload</groupId>
  4. <artifactId>commons-fileupload</artifactId>
  5. <version>1.3.3</version>
  6. </dependency>

     2)在 spring.xml 中配置文件解析器

  1. <!-- 配合文件上傳而使用的 文件解析器-->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!-- 設置文件上傳大小,單位:字節-->
  4. <property name="maxUploadSize" value="100000"/>
  5. <!-- 請求的編碼格式,必須與JSP的 pageEncoding 的屬性一致,默認爲 ISO-8859-1 -->
  6. <property name="defaultEncoding" value="UTF-8">
  7. </bean>

     3)編寫 文件 上傳 的 jsp 頁面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <form action="/upload" method="post" enctype="multipart/form-data">
  8. <input type="file" name="file">
  9. <input type="submit" value="提交">
  10. </form>
  11. </body>

   4)編寫文件上傳的控制器類: springmvc會將上傳的文件綁定到 MultipartFile 對象中

     MultipartFile 對象: 可以獲取上傳文件的內容,文件名,大小等數據

  •     byte[] getBytes(): 獲取文件數據
  •     String getContentType(): 獲取文件MIME類型,如 image/jpeg 
  •     InputStream getInputStream(): 獲取文件流
  •     String getName(): 獲得表單中文件組件的名稱
  •     String getOriginalFilename(): 獲得上傳文件的名稱
  •     long getSize(): 獲得文件的字節大小,單位:byte
  •     boolean isEmpty(): 判斷是否有上傳的文件
  •     void transerTo(File dest): 將上傳的文件保存到一個目標文件中
  1. @Controller
  2. public class FileUploadController {
  3. @RequestMapping("/upload")
  4. public String upload(MultipartFile file) throws IOException {
  5. System.out.println("上傳的文件類型:"+file.getContentType());
  6. System.out.println("上傳的文件名:"+file.getOriginalFilename());
  7. System.out.println("上傳的文件大小:"+file.getSize());
  8. System.out.println("上傳的文件是否爲空:"+file.isEmpty());
  9. // 將上傳的文件保存到本地
  10. file.transferTo(new File("G:\\"+file.getOriginalFilename()));
  11. return "hello";
  12. }
  13. }

 

SpringMVC中緩存的配置:

         @Cacheable( cacheNames="緩存的名字"): 加在方法

    ***工作原理

               在執行該方法之前,先檢查緩存中是否有這條記錄,如果,則直接返回緩存中的記錄,不執行該方法,

               若該緩存中沒有存儲該條記錄,則執行該方法,將該方法的返回值存入該緩存中,以便於下一次的查找;

        @CacheEvict( cacheNames = "緩存名字",allEntries = true) : 加在方法上 (allEntries: 該緩存中的所有記錄)

   *** 工作原理

               將該緩存下的所有記錄都清空

      @CachePut( cacheNames="緩存名字"):加在方法

    *** 工作原理

               總是會執行該方法,每次都把返回結果更新進該緩存中

測試代碼:

   在 sprin.xml 中添加緩存配置:

  1. <!-- 緩存的管理器 -->
  2. <bean id="cacheManager" class="org.springframework.cache.concurrent.ConcurrentMapCacheManager">
  3. <!-- 管理緩存區域 -->
  4. <property name="cacheNames">
  5. <list>
  6. <value>user</value>
  7. <value>order</value>
  8. <value>product</value>
  9. </list>
  10. </property>
  11. </bean>
  12. <!-- 啓用緩存相關的註解及支持
  13. @Cacheable
  14. @CacheEvict
  15. @CachePut
  16. -->
  17. <cache:annotation-driven/>
  1. @Controller
  2. public class CacheController {
  3. @Autowired
  4. private UserService userService;
  5. @RequestMapping("/cache1")
  6. @ResponseBody
  7. @Cacheable(cacheNames = "user")
  8. /**
  9. * 找到user的緩存
  10. * Cache userCache = ;
  11. * User user = userCache.get(key#id);
  12. * if(user == null) {
  13. * user = 調用findById方法查詢數據庫;
  14. * userCache.put("key#id", user);
  15. * }
  16. */
  17. public User findById(int id) {
  18. return userService.findById(id);
  19. }
  20. @RequestMapping("/update")
  21. @ResponseBody
  22. @CacheEvict(cacheNames = "user", allEntries = true) // 讓緩存的內容失效
  23. public String update() {
  24. System.out.println("執行了修改方法");
  25. return "update successful..";
  26. }
  27. @RequestMapping("/update2")
  28. @ResponseBody
  29. @CachePut(cacheNames = "user") // 思路將方法的執行結果替換緩存的內容
  30. public User update2(int id) {
  31. System.out.println("執行了Update2");
  32. User user = userService.findById(id);
  33. return user;
  34. }
  35. }

 

 

Ajax: (Asynchronous JavaScript And XML )異步的 JavaScript 和 XML                                      不是一種新的編程語言, 是一種頁面無刷新技術,在頁面不刷新的情況下與服務器進行交互,是一種創建更好,更快以及交互性更強的 web技術,基於 JavaScript ,html,css ,xml 的新用法

 

 Ajax的工作原理: 只刷新局部頁面

        相當於在用戶和服務器之間加了—個中間層,使用戶操作與服務器響應異步化。並不是所有的用戶請求都提交給服務器,像—些數據驗證和數據處理等都交給Ajax引擎自己來做, 只有確定需要從服務器讀取新數據時再由Ajax引擎代爲向服務器提交請求

  • JavaScript:更新局部的網頁
  • XML:一般用於請求數據和響應數據的封裝
  • XMLHttpRequest對象:發送請求到服務器並獲得返回結果
  • CSS:美化頁面樣式
  • 異步:發送請求後不等返回結果,由回調函數處理結果

   原理圖: 

                

 

同步提交請求: 提交請求後,只有等到返回響應,纔會繼續執行下面的操作,                                                  否則將會一直等待下去

               

 

異步提交請求:提交請求後,無需等待返回響應,就可以繼續執行下面的操作

                  

 

 

XHRHttpRequest: 整個Ajax技術的核心,它提供了異步發送請求的能力

     屬性

             readyState:類型short;只讀:                     響應狀態

             responseText:類型String;只讀 :               獲得字符串(JSON )形式的響應數據。

             responseXML:類型Document;只讀            獲得 XML 形式的響應數據。

             status:類型short;只讀                                 返回狀態碼, 200: ok, 404:錯誤…

     方法:

            open(method,URL,async) :建立與服務器的連接

                           參數1: method參數指定請求的HTTP方法,典型的值是GET或POST

                           參數2: URL參數指請求的地址

                           參數3: async參數指定是否使用異步請求,其值爲true或false

            send(content) : 發送請求

                            content參數指定請求的參數

            setRequestHeader(header,value):設置請求的頭信息

 

Ajax同步發送請求:

          1. 創建xhr對象   

          2. 發送請求

          3. 接收響應

          4. 將返回的 json結果 轉換 js對象

  1. <html>
  2. <head>
  3. <title>Title</title>
  4. </head>
  5. <body>
  6. <video src="video/tomcatcluster.mp4" controls width="500"></video>
  7. <input type="text" name="content" id="c">
  8. <input type="button" value="提交評論" οnclick="sendRequest()">
  9. <hr>
  10. <div style="width:100%; height: 100px; border: 1px solid black;" id="d1"></div>
  11. <script>
  12. //同步方式接收響應
  13. function sendRequest() {
  14. // 1. 創建xhr對象
  15. var xhr = new XMLHttpRequest();
  16. // 2. 發送請求
  17. // 獲取文本框評論的內容
  18. var c = document.getElementById("c").value;
  19. xhr.open("get","/pinglun?content="+c, false);
  20. xhr.send();
  21. // 3. 接收響應
  22. var text = xhr.responseText; // "" // 拿到的responseText是json格式的 , 例如: {"content":"分階段"}
  23. // 4. 將json結果轉換js對象
  24. var obj = JSON.parse(text);
  25. document.getElementById("d1").innerText = obj.content;
  26. }
  27. </script>
  28. </body>
  29. </html>

 

Ajax異步發送請求:

       1. 創建xhr對象

       2. 定義響應事件

       3. 發送請求

       4. 接收響應

       5. 將json結果轉換js對象

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <video src="video/tomcatcluster.mp4" controls width="500"></video>
  8. <input type="text" name="content" id="c">
  9. <input type="button" value="提交評論" οnclick="sendRequest()">
  10. <hr>
  11. <div style="width:100%; height: 100px; border: 1px solid black;" id="d1"></div>
  12. <script>
  13. // 異步方式接收響應
  14. function sendRequest() {
  15. // 1. 創建xhr對象
  16. var xhr = new XMLHttpRequest();
  17. // 2. 定義響應事件
  18. xhr.onload = function(){
  19. // 4. 接收響應
  20. var text = xhr.responseText; // "" // 拿到的responseText是json格式的 , 例如: {"content":"分階段"}
  21. // 5. 將json結果轉換js對象
  22. var obj = JSON.parse(text);
  23. document.getElementById("d1").innerText = obj.content;
  24. };
  25. // 3. 發送請求
  26. // 獲取文本框評論的內容
  27. var c = document.getElementById("c").value;
  28. xhr.open("get","/pinglun?content="+c, true);
  29. xhr.send();
  30. }
  31. </script>
  32. </body>
  33. </html>

 

註解:在spring.xml 中 啓用 mvc相關的註解功能 <mvc:annotation-driven/>

SpringMVC中的註解有很多,都在 org.springframework.web.bind.annotation 包下

      主要分爲六大類:(根據處理 request 的內容不同劃分)

                1)處理請求參數和內容部分的註解:

                        (1)@Controller:   加在上,用來指示該類是一個控制器類,使用註解可以使得該控制器支持                                                                                     同時處理多個請求動作,更加靈活

      工作原理: 使用了 @Controller 的註解會被Spring的掃描機制查找到,並檢測該類中的方法是否使用了                                                   @RequestMapper 註解,使用了該註解的方法纔是真正處理請求的處理器,匹配對應的路徑進行處理請求

                       (2)@RequestMapper: 加在 方法上,指示哪一個類或者方法來處理相對應的請求動作

                           測試代碼:

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping("/findById")
  7. public User findById(int id) {
  8. return userService.findById(id);
  9. }
  10. @RequestMapping("/a")
  11. public User a(int id) {
  12. return userService.findById(id);
  13. }
  14. }

                         (3)@ResponseBody:  加在方法上,將方法返回的對象,通過適當的 HttpMessageConverter 轉換爲指定格式                                                                   寫入到 Response 對象的 body 數據區域中,一般用於返回 JSON XML 數據

測試代碼: 返回 JSON格式的數據

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping("/exists")
  7. @ResponseBody // {"exists", true}
  8. public Map<String,Object> exists(String username) throws InterruptedException {
  9. boolean exists = userService.exists(username);
  10. Thread.sleep(2000);
  11. Map<String, Object> map = new HashMap<>();
  12. map.put("exists", exists);
  13. return map;
  14. }
  15. }

                          (4) @RequestBody: 加在方法參數上,用來處理 Content-type: 不是 application/x-www-form-urlencoded編碼                                                                 的內容,而是例如: application/xml ,application/json 等數據格式時,使用該註解,                                                                       通過使用 HandlerAdapter 配置的 HttpMessageConverters 來解析 JSON 或 XML數據,                                                                 讓後綁定到相對應的 bean 上(把請求體中的json字符串再還原爲java對象

       測試代碼: jsp頁面

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <input type="button" value="發送表單格式請求" οnclick="sendRequest()">
  8. <input type="button" value="發送json格式請求" οnclick="sendJsonRequest()">
  9. <script>
  10. function sendRequest() {
  11. var xhr = new XMLHttpRequest();
  12. xhr.onload = function(){...};
  13. xhr.open("post", "/post", true);
  14. // 告訴服務器,請求體的格式是:表單格式
  15. xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
  16. xhr.send("username=zhangsan"); // 包含的是請求體的內容
  17. }
  18. function sendJsonRequest() {
  19. var xhr = new XMLHttpRequest();
  20. xhr.onload = function(){...};
  21. xhr.open("post", "/post2", true);
  22. xhr.setRequestHeader("content-type", "application/json");
  23. var user = {"id":1, "name":"李四"}; // [object Object]
  24. // 要把js對象轉爲json字符串才能發送
  25. xhr.send(JSON.stringify(user))
  26. }
  27. </script>
  28. </body>
  29. </html>

    Controller 處理:

  1. @Controller
  2. public class PostController {
  3. @ResponseBody
  4. @RequestMapping("/post")
  5. public String post(String username) {
  6. System.out.println("username:" +username);
  7. return "ok";
  8. }
  9. @ResponseBody
  10. @RequestMapping("/post2") // @RequestBody的作用就是把請求體中的json字符串再還原爲java對象
  11. public String post2(@RequestBody User user) {
  12. System.out.println("user對象是:"+user);
  13. return "ok";
  14. }
  15. }

                             其他註解: @RequestParam,@GetMapping,@PostMapping,@PutMapping,@DeleteMapping,

                                                @PatchMapping,@RequestPart,@RestController                                                  

                                                                                                                                                     

               2)處理請求 URL 部分的註解:@PathVariable, @MatrixVariable,@CrossOrigin

                            (1)@PathVariable: 加在方法參數上,可以非常方便的獲取請求 URL 中的動態參數(路徑參數)                   

  1. @RequestMapping("/test4/{id}/{name}")
  2. public String test4(@PathVariable("id")int x,@PathVariable("name")String n){
  3. System.out.println("name: "+n+" id: "+x);
  4. return "hello";
  5. }

                             (2)@MatrixVariable: 加在方法參數上,拓展了URL請求地址的功能,多個請求參數可用 “ , ”分開                                                                                     一般用於進行多條件的組合查詢

***注意:

          springMVC默認是不開啓 @MatrixVariables 註解功能的

         需要使用時,在 spring.xml 中更改爲 < mvc:annotation-driven enable-matrix-variables="true" /> 開啓註解功能

  1. // 查詢的URL : http://loaclhost/test4/1;name=chen;age=18
  2. @RequestMapping("/test4/{id}")
  3. public String test4(
  4. @PathVariable("id")int x,
  5. @MatrixVariable(vaule = "name",pathVar="id") String name,
  6. @MatrixVariable(vaule = "age",pathVar="id")int age,
  7. ){
  8. System.out.println("name: "+name+" id: "+id+" age:"+age);
  9. return "hello";
  10. }

               3)處理請求頭部分的註解: @RequestHeader, @CookieValue

                           (1)@CookieValues(" 參數名") : 加在方法參數上,用於將請求的 cookie 數據映射到功能處理方法的參數上   

           支持屬性: 

                  name :請求參數綁定的名稱

                  value: name屬性的別名

                  required:指定參數是否必須綁定

                  defaultValues: 如果沒有傳遞參數而使用默認值

      測試代碼:

  1. @Controller
  2. public class ServletController {
  3. /**
  4. * @CookieValue("user"): 在請求紅找到一個名爲 user 的cookie的值
  5. *
  6. * @param username
  7. * @return
  8. */
  9. @RequestMapping("/s2")
  10. public String s2(@CookieValue("user")String username){
  11. System.out.println("獲取到請求cookie的值:"+username);
  12. return "hello";
  13. }
  14. }

                            (2) @RequestHeader: 加在方法參數上,將請求頭的信息數據映射到方法參數上      

         

            4)處理屬性類型的註解:@RequestAttribute,@SessionAttribute,@SessionAttributes,@ModelAttribute

                            (1)  @RequestAttribute: 加在方法參數上,用於獲取 request作用域 中的數據

                          (2)@SessionAttribute: 加在方法參數上,用於獲取 session作用域中的數據

                          (3)@SessionAttributes: 加在上,允許我們有選擇的指定Model中的哪些屬性轉存入 session 作用域

                          (4) @ModelAttribute:加在方法上,用於將請求參數綁定到對象,然後存入request作用域

                     ***注意: 使用了 @ModelAttribute 註解的方法會在Controller每個方法執行被執行

         5)處理異常類型的註解:@ExceptionHandler , @ControllerAdvice, @RestControllerAdvice, @ResponseStatus

                            (1)   @ExceptionHandler: 加在方法上,運行時有效,參數:value=異常類型名.class

                          (2) @ControllerAdvice: 加在上,經常配合@ExceptionHandler做全局異常處理

                            (3)    @ResponseStatus: 加在方法上,處理異常最簡單的方式,一般用於自定義的異常類

         6)綁定表單數據的註解: @InitBinder

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章