SpringMvc的常用註解介紹

海浪星空發表於2020-12-26

@RequestMapping 註解

作用:用於建立請求URL和處理請求的方法之間的對應關係(客戶端會傳送請求,伺服器端會有一個方法處理該請求,RequestMapping這個發給發就是建立這兩者之間的關係)

原始碼:
在這裡插入圖片描述

1.出現在類上:可以讓我們的URL按照模組化去管理
在這裡插入圖片描述
例如常見的電子商城網站:有使用者模組,訂單模組,這兩個模組都有對資料庫資料的增刪改查,如果我們只將RequestMapping這個註解寫在每個模組中的方法上,那麼我們就很難去辨認到底是哪個方法.

其中紅色的為寫在類上面的

(就拿兩個模組中的刪除方法來說,都是刪除資料庫資料 如果你用/user/delete 和/order/delete是不是很快的就找到要執行的方法,便於模組化管理,但是如果你寫的是/delete1 和/delete2誰能準確快速的找到請求要執行的方法)

@RequestMapping 註解的屬性

在這裡插入圖片描述

在這裡插入圖片描述

和請求引數繫結相關的註解

請求引數的繫結
       作為一個web層框架,客戶端發請求都會攜帶引數,而我需要將引數(資料)拿到,這就是請求引數的繫結
在早期Servlet中如果需要獲取請求的引數或者說獲取表單的引數,需要用request.getParameter()獲取
在這裡插入圖片描述
在這裡插入圖片描述

基本資料型別和字串型別
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
name和引數的名稱必須一致

實體型別JavaBean



import java.io.Serializable;

public class Account implements Serializable {
    String username;
    String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

在這裡插入圖片描述
在這裡插入圖片描述

JavaBean型別有其他物件的引用
在這裡插入圖片描述
那麼表單的name如何寫才可以封裝成功
在這裡插入圖片描述

集合資料型別
在這裡插入圖片描述

在這裡插入圖片描述

配置解決中文亂碼的過濾器

<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>

自定義型別轉換

在mvc框架中從表單 傳過來的資料都是String ,那麼在JavaBean中的其他型別是如何接受表單的String的呢。在mvc有型別轉換器,將String 轉為 Integer 等其他型別的類,同時也包括了String轉為Date,但是當我們不按照固定的日期型別去書寫的時候呢。比如2020-11-10去寫,這個時候就需要自定義型別轉換器了。

第一步:自定義一個類並實現Conveter<S,T>泛型介面
在這裡插入圖片描述

StringToConveter.java

public class StringToConveter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        Date date=null;
        if(s==null)
            throw new RuntimeException("請輸入日期");
            try {
                DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd");
                date = dateFormat.parse(s);//將YYYY-MM-dd這個字串解析為Date
            } catch (Exception e) {
                e.printStackTrace();
            }
            return date;
    }
}

在配置檔案spring.mvc配置bean
在這裡插入圖片描述

@RequestParam

和從前臺過來的資料封裝有關。例如前臺傳一個屬性名為username的引數 ,那麼Controller層的方法必須提供一個帶引數名為username的引數,否則資料封裝不成功。

如果前臺的傳的資料和Controller方法的引數名稱不一致怎麼辦?

解決方法就是在引數的前面使用@RequestParam(value=" 前臺引數名稱") String name

在這裡插入圖片描述

  <form action ="user/fail" method="post">
      使用者名稱:<input type="text" name="name"><br>
      密碼:<input type="password" name= "password">
      <input type="submit" value="提交">
  </form>
@Controller
@RequestMapping(path = {"/user"})
public class HelloController {


    @RequestMapping(path = "/fail")
    public String sayGood(@RequestParam(name ="name") String username, String password){
        System.out.println("username"+username+"password"+password);
        System.out.println("你很good");
        return "fail";
    }
}

@RequestBody

用於獲取請求體的內容,直接使用獲取得是key=value&key=value…結構得資料,但是他不適用於get請求,get請求沒有請求體

在方法引數中使用@RequestBody

在這裡插入圖片描述
System.out.println(body) 輸出得是前臺輸入得資料 例如 username=張&password=123456 key=value&key=value…

@PathVariable

SpringMVC支援restful風格:restful 程式設計風格
在這裡插入圖片描述

PathVariable 用於繫結URL中佔位符,例如請求URL中 delete/{id} ,這個{id}就是佔位符。url支援佔位符是springmvc支援restful風格的一個重要標誌

<a href="user/fail/10">good</a>
    @RequestMapping(path = "/fail/{one}")
    public String sayGood(@PathVariable(name = "one") String id){
        System.out.println(id);
        return "fail";
    }

HiddentHttpMethodFilter

瀏覽器from表單只支援get和post請求,而delete 、put 等並不 支援,Spring 3.0新增了一個過濾器,可以將瀏覽器的 請求改為指定的請求方式,發給我們的控制器。使得瀏覽器支援get post delete put請求。

@RequestHeader 和@CookieValue

RequestHeader是獲取請求頭資訊的,CookieValue是獲取cookie的值的
(不常用)

@ModelAttribute

在這裡插入圖片描述

註解在方法上,有返回值

  <form action ="user/fail" method="post">
      使用者名稱:<input type="text" name="username"><br>
      密碼:<input type="password" name= "password">
      <input type="submit" value="提交">
  </form>

在這裡插入圖片描述

在這裡插入圖片描述

註解在引數上,無返回值

註解在引數上實現的功能和註解在方法上實現的功能都是一樣的或者說兩種不同的寫法,但是最終目的都是一樣的

在這裡插入圖片描述

@SessionAttributes

@Sessionattributes註解應用到Controller上面,可以將Model中的屬性同步到session當中
如果不使用@SessionAttributes,預設情況下Spring MVC將模型中的資料儲存到request域中。當一個請求結束後,資料就失效了。如果要跨頁面使用。那麼需要使用到session。而@SessionAttributes註解就可以使得模型中的資料儲存一份到session域中。
-------------------------------------它有兩個屬性:
----------------------------------------------------value:用於指定存入的屬性名稱
----------------------------------------------------type:用於指定存入的資料型別

在這裡插入圖片描述

@SessionAttributes的使用

@Controller
@RequestMapping(path = {"/user"})
@SessionAttributes(value = "msg") //等於把msg=美美存入到session中
public class HelloController {

    /*
    *  @RequestMapping:請求對映路徑,物件建立之後,怎麼呼叫這個方法,*/
    @RequestMapping(path = "/hello",method = RequestMethod.POST)
    public String sayHello(){
        System.out.println("HelloWord");
        return "success";//想要跳轉某個頁面就需要一個檢視解析器:xml配置檢視解析器
    }
    @RequestMapping(path = "/fail")
    public String sayGood(Model model){
        /*
        * springmvc預設將模型中的資料儲存在request中*/
        model.addAttribute("msg","美美");
        return "fail";
    }
}

下面是獲取和刪除session中的資料
在這裡插入圖片描述

相關文章