spring-mvc高級技術

来源:https://www.cnblogs.com/shixiemayi/archive/2018/09/01/9569338.html
-Advertisement-
Play Games

Spring MVC高級技術包括但不限於web.xml配置、異常處理、跨重定向請求傳遞數據 1、web.xml文件的配置 ContextLoaderListener是根容器,DispatcherServlet是子容器。父容器中管理的bean可以被子容器引用,反之,不行。它們都從各自的xml文件初始化 ...


Spring MVC高級技術包括但不限於web.xml配置、異常處理、跨重定向請求傳遞數據

1、web.xml文件的配置

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

  ContextLoaderListener是根容器,DispatcherServlet是子容器。父容器中管理的bean可以被子容器引用,反之,不行。它們都從各自的xml文件初始化自己的上下文

  ContextLoaderListener如果未指定contextConfigLocation參數,則預設載入的配置文件為/WEB-INF/applicationContext.xml

  DispatcherServlet如果未指定contextConfigLocation參數,則根據<servlet-name>元素指定的名稱,在/WEB-INF/文件夾下尋找配置文件appServlet-servlet.xml


2、處理異常

Spring提供了多種方式將異常轉換為響應

  • 特定的 Spring異常會自動映射為指定的HTTP狀態碼
  • 異常上可以添加@ResponseStatus註解,將異常映射為某一個HTTP狀態碼
  • 在方法上可以添加@ExceptionHandler註解,使其用來處理異常

 1)特定的 Spring異常會自動映射為指定的HTTP狀態碼

  如果在控制器中拋出了異常,該異常不在列表中,又沒有指定HTTP狀態碼,則預設為狀態碼為500

2)異常上可以添加@ResponseStatus註解,將異常映射為某一個HTTP狀態碼

@Controller
public
class HelloController { @RequestMapping("/home") public String home(){ System.out.println("執行home"); throw new MyException(); // return "home"; //返回一個字元串,即邏輯視圖名 } }
package com.cn.Exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
public class MyException extends RuntimeException{

}

瀏覽器訪問 http://localhost:8080/home

修改自定義異常

package com.cn.Exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "拋出異常的原因")
public class MyException extends RuntimeException{

}

瀏覽器訪問 http://localhost:8080/home

3)在方法上可以添加@ExceptionHandler註解,使其用來處理異常

  • 該方式是按照處理請求的方式處理異常,@ExceptionHandler註解的方法返回值為字元串表示邏輯視圖名
package com.cn.Exception;

public class MyException2 extends RuntimeException{

}
@Controller
public class HelloController {

   @RequestMapping("/home")
   public String home(){
       System.out.println("執行home");
       throw new MyException2();
//       return "home"; //返回一個字元串,即邏輯視圖名
   }

   @ExceptionHandler(MyException2.class)
   public String handleMException(){
       System.out.println("處理異常邏輯");
       return "fail";
   }
}

訪問http://localhost:8080/home,後臺輸出

瀏覽器頁面

@ExceptionHandler註解的方法可以處理同一個控制器中所有處理器方法所拋出的異常(註解指定的異常),註解定義如下

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
    Class<? extends Throwable>[] value() default {};
}
  • spring也支持為控制器添加通知,那麼該通知對於所有的控制器中所有的處理器方法拋出的異常都起作用,實現如下

  @ControllerAdvice 所標註的類會被組件掃描實例化,交給容器管理。最為實用的一個場景是將所有@ExceptionHandler標註的方法收集到一個類中,這樣所有的控制器異常就能在一個地方進行一致處理。以下HandleException類定義表明在控制器中的處理器拋出MyException2類的異常,就會被handleMException方法處理,最終跳轉fail.jsp頁面

package com.cn.advice;

import com.cn.Exception.MyException2;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice  
public class HandleException {

    @ExceptionHandler(MyException2.class)
    public String handleMException(){
        System.out.println("處理異常邏輯");
        return "fail";
    }

}

 3、跨重定向請求傳遞數據

  如果是forward轉發請求,那麼處理器方法業務處理完成後,該方法所指定的模型數據會複製到請求中,作為請求的一部分,轉發到下一個處理器,下一個處理器可以從請求中獲取上一個處理的模型數據;

  如果是redirect重新向,原始請求就結束了,並且會重新發起一個GET請求。因此原始請求中的模型數據也就消失了,在請求到達下一個處理器,沒有任何的模型數據,需要模型數據必須自己處理。

針對重定向傳遞數據,有兩種方案:

  • 使用URL模板以路徑變數和/或查詢參數的形式傳遞數據
  • 使用flash屬性傳遞數據

1)使用URL模板以路徑變數和/或查詢參數的形式傳遞數據

@Controller
public class HelloController {

    @RequestMapping("/home2")
    public String home2(Model model){
       model.addAttribute("id","12324131343256");
       model.addAttribute("name","pick");
       return "redirect:home3/{id}"; //含有redirect的字元串,表示重定向到另一個處理器;
                                 //如果含有forward的字元串,表示轉向到另一個處理器
    }

    @RequestMapping("/home3/{id}")
    public String home3(@PathVariable String id, Model model){
        System.out.println("傳遞的ID="+id);
        model.addAttribute(new User());
        return "home";
    }
}

  瀏覽器訪問localhost:8080/home2,抓包得訪問的url。從以下可以看出,處理器完成後重定向時,模型中的數據填充到了路徑變數中,路徑變數中沒有的key,則以查詢參數的形式賦在url之後,組成了新的url訪問。

 2)使用flash屬性傳遞數據

  重定向時候,採用1)中的方式傳遞數據,僅僅能夠傳遞簡單的數據,不能傳遞對象。如何將對象也能傳遞到下一個處理器呢?可以將要傳遞到下一個處理器的數據放入用戶會話中,然後在下一個處理器從會話的取出來,並刪除會話中的該數據。然而,spring提供了將數據發送為flash屬性的功能,不需要我們管理這些數據,flash屬性會一致攜帶這些數據直到下一次請求才消失。

  Spring提供RedirectAttributes是Model介面的子介面,除了提供Model的所有功能,還提供了幾個方法用來設置flash屬性。

@Controller
public class HelloController {

    @RequestMapping("/home2")
    public String home2(RedirectAttributes model){
       model.addAttribute("id","12324131343256");
       model.addFlashAttribute("user",new User("liming","123456"));//設置flash屬性,也可以 model.addFlashAttribute(new User("liming","123456")) 
                                       //則通過值得類型自行推斷出key為user
return "redirect:home3/{id}"; } @RequestMapping("/home3/{id}") public String home3(@PathVariable String id, RedirectAttributes model){ System.out.println("傳遞的ID="+id); if (model.containsAttribute("user")) { System.out.println("傳遞的對象:" + model.getFlashAttributes().get("user")); } return "home"; }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用java中socket實現socket聊天 1, 什麼是socket Socket 是指網路套接字,什麼是套接字呢? 這是網路上一種端對端的網路協議,埠就是進程號,socket在網路中讓這兩個端通信形成埠直接通信,所以socket的參數可想而知就是兩端ip和埠號了; 再說在網路中,總要有人付 ...
  • 實例19:判斷正整數n的d進位表示形式是否是迴文數(順著看和倒著看相同的數)。 主要思路: 一種方法:將正整數n數轉換成d進位的數,逐個比較首尾對應數字,判斷是否為迴文數。 另一種方法:將正整數n數轉換成d進位的數,將低位數當做高位數,轉換成正整數判斷與原來的數是否相等。 書中採用的是第二種方法,下 ...
  • springboot 項目使用多線程處理任務時,線上程中無法通過 @Autowired 註入所需的bean ...
  • 安裝小白_Shawshank_之安裝pycharm2017教程 一、準備工作 01、大家可以自行在Jetbrains官網中下載各種版本,推薦最新的版本(免費) 官網網址:https://www.jetbrains.com/pycharm/download/#section=windows 02、或者 ...
  • 指出了《Python游戲編程入門》[美] Jonathan S·Harbour 著 一書中第四章測試打字速度程式原書代碼的錯誤。 ...
  • 一、對象與類 類:類是一個模版,它描述了一類對象的行為和狀態。 <!--?xml version="1.0" encoding="UTF-8"?--> 上面一段代碼就定義了一個animal類,它在內部規定了一類對象段狀態/屬性(color,size)等。同時還規定了它可以進行什麼樣的動作(eat,s ...
  • 上一篇博文談了談股票預測方面的問題,這一篇就談談外匯交易吧。 對沖是金融領域的常見操作之一,即利用市場的不對稱性,在不同市場進行方向相反的交易來保證穩定收益。我是在觀看了李永樂老師對足彩對沖的原理講解之後(http://www.iqiyi.com/w_19rz0551xx.html),才有了這個想法 ...
  • 題意 給出一個$k$,構造一個無向圖,使得每個點的度數為$k$,且存在一個橋 Sol 神仙題 一篇寫的非常好的博客:http://www.cnblogs.com/mangoyang/p/9302269.html 我簡單的來說一下構造過程 首先$n$是偶數的時候無解 奇數的時候:我們拿出兩個點作為橋 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...