本文詳細歸納了SpringMVC中控制器可以接收的參數,下面會逐個列出,並給出代碼示例
1. Web開發相關對象
- request對象
- response對象
- session對象
- WebRequest對象 - request對象和session對象的合體,同時提供了request和session相關的方法
@RequestMapping("/test01.action")
public void test01(HttpServletRequest request, HttpServletResponse response, HttpSession session, WebRequest wreq){
//--request
request.getParameter("username");
request.getHeader("Host");
//--response
response.setContentType("text/html;charset=utf-8");
//--session
session.setAttribute("k1","v1");
//--WebRequest
wreq.getParameter("username");
wreq.getHeader("Host");
wreq.getSessionId();
}
2. web流對象
- InputStream - request.getInputStream()
- OutputStream - response.getOutputStream()
- Reader - request.getReader()
- Writer - response.getWriter()
注意!
不能同時獲取InputStream和Reader
不能同時獲取OutputStream和Writer
@RequestMapping("/test02.action")
public void test02(OutputStream out) throws IOException {
out.write("abcdef".getBytes());
}
測試結果如下
3.模型對象
- Model
- Map
- ModelMap
此三類對象都是模型對象,用來封裝模型數據,唯一的不同在其api有所區別
@RequestMapping("/test03.action")
public String test03(Model model, Map map, ModelMap modelMap){
model.addAttribute("k1","v1");
model.addAttribute("k2","v2");
map.put("k3","v3");
map.get("k3");
modelMap.addAttribute("k4","v4");
modelMap.put("k5","v5");
modelMap.get("k5");
return "my01test03";
}
4.請求參數
41.傳統方式獲取
@RequestMapping("/test01.action")
public void test01(HttpServletRequest request){
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
System.out.println(username);
System.out.println(age);
}
可以通過瀏覽器地址欄傳參獲取,測試結果如下
如:http://localhost/SpringMVCDay02_01_accpetParam_Web_exploded/my02/test01.action?username=zs&age=18
4.2直接獲取方式一
SpringMVC中可以直接獲取,但是要注意:請求參數名和方法參數名一致
測試方法同上,這裏不再給出
@RequestMapping("/test02.action")
public void test02(String username,int age){
System.out.println(username);
System.out.println(age);
}
4.3直接獲取方式二
上面4.2方式要求參數名和方法參數名必須一致,如果請求參數名和方法參數名不一致時可以通過@RequestParam註解指定參數即可獲取
@RequestMapping("/test03.action")
public void test03(@RequestParam("username") String uname,@RequestParam("age") int uage){
System.out.println(uname);
System.out.println(uage);
}
4.4多個同名請求參數
4.4.1方式一:用字符串接收,則,獲取到多個值用逗號拼接的結果
@RequestMapping("/test04.action")
public void test04(String username,int age,String like){
System.out.println(like);
}
測試通過地址欄拼接多個同名請求參數
測試結果如下
4.4.2方式二:用字符串數組接受,則,獲取到多個值組成的數組
@RequestMapping("/test04.action")
public void test04(String username,int age,String [] like){
System.out.println(Arrays.asList(like));
}
測試結果爲
4.5封裝請求參數到bean
可以直接在控制器方法上接收一個bean,springmvc自動將請求參數封裝到bean的同名屬性中
4.5.1情況一:
User實體類如下:
public class User {
private String username;
private int age;
private String addr;
public User() {
}
public User(String username, int age, String addr) {
this.username = username;
this.age = age;
this.addr = addr;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", addr='" + addr + '\'' +
'}';
}
}
控制器中直接獲取User對象
@RequestMapping("/test05.action")
public void test05(User user){
System.out.println(user);
}
通過地址欄傳參測試
測試結果如下:
4.5.2情況二
複雜類型封裝請求參數到bean,如下User2中除了基本的數據類型,還有引用數據類型Dog
public class User2 {
private String username;
private int age;
private String addr;
private Dog dog;
public User2() {
}
public User2(String username, int age, String addr, Dog dog) {
this.username = username;
this.age = age;
this.addr = addr;
this.dog = dog;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "User2{" +
"username='" + username + '\'' +
", age=" + age +
", addr='" + addr + '\'' +
", dog=" + dog +
'}';
}
}
控制器中的代碼:
@RequestMapping("/test06.action")
public void test06(User2 user2){
System.out.println(user2);
}
通過地址欄傳參測試
測試結果如下:
5.域屬性
四大域屬性中:
- page(pageContext)域SpringMVC中Controller沒什麼關聯,因爲它只是在jsp頁面起作用
- ServletContext 在SpringMvc中沒有便捷方式
5.1Request域屬性 - 傳統方式
//先執行下面,設置好值,然後在通過傳統的方式獲取
@RequestMapping("/test01.action")
public void test01(HttpServletRequest request){
String v1 = (String) request.getAttribute("k1");
String v2 = (String) request.getAttribute("k2");
System.out.println(v1);
System.out.println(v2);
}
///////////////////////////////////////////////
@RequestMapping("/test00.action")
public void test00(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
// request.setAttribute("k1","v1");
// request.setAttribute("k2","v2");
// request.getRequestDispatcher("/my03/test01.action").forward(request,response);
// request.setAttribute("k1","v1");
// request.setAttribute("k2","v2");
// request.getRequestDispatcher("/my03/test02.action").forward(request,response);
// session.setAttribute("sk1","sv1");
// session.setAttribute("sk2","sv2");
// request.getRequestDispatcher("/my03/test03.action").forward(request,response);
session.setAttribute("sk1","sv1");
session.setAttribute("sk2","sv2");
request.getRequestDispatcher("/my03/test04.action").forward(request,response);
}
5.2通過SpringMVC方式獲取Request域屬性
@RequestMapping("/test02.action")
public void test02(@RequestAttribute("k1") String k1,@RequestAttribute("k2") String k2){
System.out.println(k1);
System.out.println(k2);
}
5.3Session域屬性 - 傳統方式獲取
@RequestMapping("/test03.action")
public void test03(HttpSession session){
String sk1 = (String) session.getAttribute("sk1");
String sk2 = (String) session.getAttribute("sk2");
System.out.println(sk1);
System.out.println(sk2);
}
5.4Session域屬性 - SpringMVC方式獲取
@RequestMapping("/test04.action")
public void test04(@SessionAttribute("sk1") String sk1,@SessionAttribute("sk2") String sk2){
System.out.println(sk1);
System.out.println(sk2);
}
6.SpringMVC獲取模型中的數據
獲取的方式有兩種,獲取前可以通過@ModelAttribute將值存入到model
import org.springframework.stereotype.Component;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@Component
@RequestMapping("/my04")
public class MyController04 {
@ModelAttribute("mk1")
public String mx(){
System.out.println("mx...");
return "abc";
}
/**
* 控制器方法可以接受的參數6 - 模型數據
* http://localhost/SpringMVCDay02_01_accpetParam/my04/test02.action
*/
@RequestMapping("/test02.action")
public void test02(@ModelAttribute("mk1") String mk1){
System.out.println(mk1);
}
/**
* 控制器方法可以接受的參數6 - 模型數據
* http://localhost/SpringMVCDay02_01_accpetParam/my04/test01.action
*/
@RequestMapping("/test01.action")
public void test01(Model model){
System.out.println(model.asMap());
}
}
測試結果如下
7.其他可接收的請求參數
7.1Cookie值 - 傳統方式
@RequestMapping("/test01.action")
public void test01(HttpServletRequest request){
Cookie[] cs = request.getCookies();
Cookie findC = null;
if(cs!=null){
for(Cookie c : cs){
if("JSESSIONID".equals(c.getName())){
findC = c;
break;
}
}
}
if(findC!=null){
String v = findC.getValue();
System.out.println(v);
}
}
7.2Cookie值 - SpringMVC方式
@RequestMapping("/test02.action")
public void test02(@CookieValue("JSESSIONID") String JSESSIONID){
System.out.println(JSESSIONID);
}
7.3Header值 - 傳統方式
@RequestMapping("/test03.action")
public void test03(HttpServletRequest request){
String value = request.getHeader("User-Agent");
System.out.println(value);
}
7.4Header值 - SpringMVC方式
@RequestMapping("/test04.action")
public void test04(@RequestHeader("User-Agent") String userAgent){
System.out.println(userAgent);
}
7.5路徑參數獲取
RESTFul風格的請求
/**
* 控制器方法可以接受的參數9 - 路徑參數獲取
* http://localhost/SpringMVCDay02_01_accpetParam/my05/test05/zs/19.action
* http://localhost/SpringMVCDay02_01_accpetParam/my05/test05/ls/23.action
* http://localhost/SpringMVCDay02_01_accpetParam/my05/test05/ww/31.action
*/
@RequestMapping("/test05/{uname}/{uage}.action")
public void test05(@PathVariable("uname") String uname,@PathVariable("uage") int uage){
System.out.println(uname);
System.out.println(uage);
}
測試結果如下:
7.6獲取請求體
/**
* 控制器方法可以接受的參數10 - 獲取請求體
* 用字符串接收可以將請求體以一個字符串來接收
* 如果請求體中是一個json數據,則可以用一個bean來接收,SpringMVC會自動將json中的數據設置到bean的對應屬性上
* http://localhost/SpringMVCDay02_01_accpetParam/my05test06.jsp
*/
@RequestMapping("/test06.action")
public void test06(@RequestBody User user){
System.out.println(user);
}
前端頁面,數據通過ajax 發送
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>my05test06.jsp</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.2.6.js"></script>
<script type="text/javascript">
function sendData(){
$.ajax({
url: "${pageContext.request.contextPath}/my05/test06.action",
type: "post",
data: JSON.stringify({'username':'zs','age':19,'addr':'bj'}),
contentType: "application/json",
success: function(flag){
if (flag) {
console.log("添加成功");
} else {
console.log("添加失敗");
}
}
});
}
</script>
</head>
<body>
<input type="button" onclick="sendData()" value="發送"/>
</body>
</html>
測試結果: