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.class,Dept.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註解的值來改變默認值