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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...