Spring MVC 請求參數封裝

Spring MVC 請求參數封裝

使用request封裝形式

String username=request.getParameter("username");

自動封裝

  • 1、直接在方法的參數列表裏出現表單彙總提交的同名參數
package com.bamzhy.controller;

import com.bamzhy.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class registerController {
    @RequestMapping(path = "/register",method = {RequestMethod.GET,RequestMethod.POST})
    public String register(String username,String password,int age,Model model){
        User user = new User(username, password, age,null);
        model.addAttribute("user",user);
        return "/WEB-INF/haha/user.jsp";
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/register.html" method="post">
    用戶名: <input type="text" name="username"/><br>
    密碼:: <input type="text" name="password"/><br>
    年齡:: <input type="text" name="age"/><br>
    生日:: <input type="text" name="birthday"/><br>
    <input type="submit" value="提交">
  </form>
  </body>
</html>
  • 2、Bean中還有其他對象引用
    請求參數封裝到嵌套JavaBean中
public class User{
    String username;
    String password;
    int age;
    Teacher teacher;
}

public class Teacher{
    int id;
    String name;
}
teacher Id<input type="text" name="teacher.id">
teacher Name<input type="text" name="teacher.name">

請求參數接收數組類型

  • 可以直接放在SpringMVC執行的方法參數上
  • 也可以放在一個JavaBean裏,作爲成員接收。要求名字一致,有getter和setter

通過PathVariable來獲取路徑中的參數

    @RequestMapping(value="/haha7/{username}/{password}",method=RequestMethod.GET)
    public String test5(@PathVariable String username, @PathVariable String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "/index.jsp";
    }
}

比如http://localhost:8080/haha7/gouliguojiashengsiyi/12345,username被置爲gouliguojiashengsiyi,password被置爲12345

@ RequestHeader 將請求頭中符合要求的值賦給帶有註解的參數

    @RequestMapping("/haha123")
    public String test12(@RequestHeader(value="User-Agent") String userAgent){
        System.out.println("userAgent: "+userAgent);
        return "/WEB-INF/haha/user.jsp";
    }

@ CookieValues 將JSESSIONID賦值給帶有此參數的註解(代碼中的sessionId)

    @RequestMapping("/haha12")
    public String test11(@CookieValue(value="JSESSIONID",defaultValue = "") String sessionId){
        System.out.println("sessionId: "+sessionId);
        return "/WEB-INF/haha/user.jsp";
    }

@ SessionAttributes

SessionAttributes允許我們有選擇地指定Model中的哪些屬性需要轉存到HTTPSession對象中
SessionAttributes 只能聲明在類上而不能聲明在方法上
- 將Model中的屬性名爲user的屬性放入HttpSession對象中

@ SessionAttributes("user")
public String test{
}
  • 不同的寫法
@SessionAttributes(types={User.class},value="user")
  • 可以設置多個對象到HTTPSession中
@SessionAttributes(types={User.classDept.class},value={"user","dept"})

types屬性用來指定放入HTTPSession當中的對象類型

@ SessionAttribute

  • 該方法放置在參數列表中
  • 作用是從Session裏取出對應的值賦給參數user
public String test(@SessionAttribute("user") User user){
}

@ ModelAttribute

ModelAttribute註解類型將請求參數綁定到Model對象
被@ ModelAttribute註釋的方法會在Contoll而每個方法執行前被執行,因此在一個Contoller映射到多個URL時候要謹慎使用
- 在方法上使用@ ModelAttribute
SpringMVC在調用目標方法前,將@ ModelAttribute註解的value屬性值作爲key,返回值作爲value存入到model中
結果是想Model中添加一個鍵值對,key是“user”,value是方法的返回值

  • 在方法參數上使用
    1、只出現註解,不指定名字
    public String test(@ ModelAttribute User user){}

說明了該方法參數的值將由model中取得,如果model中找不到,那麼該參數會被先實例化,然後被添加到model中。
在model存在以後,請求中所有名稱匹配的參數都會填充到該參數中。這在SpringMVC中被稱爲數據綁定。

以下代碼等價

@RequestMapping(/haha)
public String test(@ ModelAttribute User user){
    return "/index.jsp";
}

@RequestMapping(/haha)
public String test(Model model , User user){
    model.addAttribute("user",user);
    return "/index.jsp";
}
  • 方法和方法參數都出現:去model中取出名字叫user的對象賦值給方法裏的user

  • 如果存在多個ModelAttribute標註的方法,返回值爲同一個類型User,且@ ModelAttribute的user屬性值不同。那麼在目標方法處,需要以User實體作爲參數

    @ModelAttribute("user")
    public User getUser1(){
        return new User("zhangsan","zhangsan",23,null);
    }
    @ModelAttribute("user")
    public User getUser2(){
        return new User("lisi","lisi",25,null);
    }

//不標註
    @RequestMapping("/haha")
    public String test8(User user){
        return "/WEB-INF/haha/user.jsp";
    }
//User: User{username='zhangsan', password='zhangsan', id=23}
        @RequestMapping("/nidaye")

//在形參這裏標註具體名字
    public String test9(@ModelAttribute("user2") User user){
        System.out.println("User: "+user);
        return "/WEB-INF/haha/user.jsp";
    }
// User: User{username='lisi', password='lisi', id=25}

//在形參這裏不標註具體名字
    public String test10(@ModelAttribute User user){
        System.out.println("User: "+user);
        return "/WEB-INF/haha/user.jsp";
    }
// User: User{username='null', password='null', id=0}
//會根據當前參數類型比如User,使用User首字母小寫 user作爲key去model裏取對應的值。如果沒有,則新建一個空的model.

TIP

屬性名沒有被顯式的指定時,框架將會根據屬性的類型給與一個默認名稱
例如:我們返回一個User類型的對象,則默認的屬性名爲user
我們可以通過設置@ ModelAttribute註解的值來改變默認值

發佈了85 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章