文章目录
本篇基于第一个SpringMVC程序,本篇将介绍:
- 通过Servlet API获取请求参数。
- 通过控制器方法形参获取请求参数。
- 通过控制器方法形参获取请求头信息。
- 通过控制器方法形参获取cookie数据。
通过Servlet API获取请求参数
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping("/test")
public String test(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username="+username+",password="+password);
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<a th:href="@{/test(username='tom',password=123456)}">测试</a>
</body>
</html>
<!-- success.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" >
<title>success</title>
</head>
<body>
<h1>here is success</h1>
</body>
</html>
使用Servlet API getParameter("username")
获取请求参数username的值。
使用Servlet API getParameter("password")
获取请求参数password的值。
如果同一个请求参数有多个值呢?
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping("/test")
public String test(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
String hobby = request.getParameter("hobby");
System.out.println("username="+username+" password="+password+" hobby="+hobby);
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<form th:action="@{/test}" method="get">
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
爱好:<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
如果仍使用getParameter("hobby")
,获取的hobby的值仅为football
,这显然是不对的。这时,应该使用Servlet API getParameterValues()
,如下所示,
@GetMapping("/test")
public String test(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("username="+username+" password="+password+" hobby="+hobby);
System.out.println("username="+username+" password="+password+" hobby="+Arrays.toString(hobby));
return "success";
}
hobby
值为[Ljava.lang.String;@6744520c
,其中,
[
,表示一维数组([[
,表示二维数组)。L
,表示一个对象。java.lang.String
,表示对象类型。@6744520c
,@
后面表示该对象的HashCode。
Arrays.toString(hobby)
,将数组转换为字符串,最后输出的值为[football, basketball, ping-pong]
。
通过控制器方法的形参获取请求参数
控制器方法形参名与请求参数名一致
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping("/test")
public String test(String username,String password){
System.out.println("username="+username+",password="+password);
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<a th:href="@{/test(username='tom',password=123456)}">测试</a>
</body>
</html>
请求参数为username=tom&password=123456
。
控制器方法形参为(String username,String password)
。
只要控制器方法形参的名字与请求参数的名字一致,就可以通过控制器方法形参获取请求参数的值。
本例,从http://localhost:8080/demo1/test?username=tom&password=123456
中,获取了请求参数username
和password
的值,分别为tom
和123456
。
如果同一个请求参数有多个值呢?如,hobby=football&hobby=basketball&hobby=ping-pong
。
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@GetMapping("/test")
public String test(String username,String password,String hobby){
System.out.println("username="+username+",password="+password+",hobby="+hobby);
return "success";
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<form th:action="@{/test}" method="get">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password" /><br/>
爱好:<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
同样地,只要保证控制器方法形参的名字与请求参数的名字一致即可。
请求参数为username=admin&password=123456&hobby=football&hobby=basketball&hobby=ping-pong
。
控制器方法形参为(String username,String password,String hobby)
。
String hobby
,控制器方法中以字符串类型的形参接收该请求参数hobby
,得到的值为football,basketball,ping-pong
。
控制器方法的形参也可以是一个字符串数组,即(String username,String password,String[] hobby)
,这样得到的hobby
是数组对象[Ljava.lang.String;@20126552
,将该数组转换为字符串,结果为[football, basketball, ping-pong]
。
使用注解@RequestParam建立控制器方法形参与请求参数的映射关系
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class TestController {
@RequestMapping("/")
public String index() {
return "index";
}
@GetMapping("/test")
public String test(
@RequestParam("username") String name,
@RequestParam("password") String passwd,
String hobby
) {
System.out.println("name="+name);
System.out.println("passwd="+passwd);
System.out.println("hobby="+hobby);
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<form th:action="@{/test}" method="get">
用户名:<input type="text" name="username" autocomplete="off"/><br/>
密码:<input type="password" name="password" /><br/>
爱好:<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
请求参数为username=admin&password=123456&hobby=football&hobby=basketball&hobby=ping-pong
。
控制器方法形参为(String name,String passwd,String hobby)
。
@RequestParam("username") String name
请求参数名为username
,控制器方法形参名为name
,使用注解@RequestParam
建立控制器方法形参与请求参数之间的映射关系。@RequestParam("password") String passwd
请求参数名为password
,控制器方法形参名为passwd
,使用注解@RequestParam
建立控制器方法形参与请求参数之间的映射关系。
@RequestParam
注解用来建立请求参数与控制器方法形参的映射关系,它有四个属性,分别是
value():String
,value属性同name属性。name():String
,name属性同value属性。required():boolean
,是否必需,布尔值,默认为true
。defaultValue:String
,默认值。
@GetMapping("/test")
public String test(
@RequestParam(value = "username",required = false,defaultValue = "somebody") String name,
@RequestParam("password") String passwd,
String hobby
) {
System.out.println("name="+name);
System.out.println("passwd="+passwd);
System.out.println("hobby="+hobby);
return "success";
}
使用实体类接收请求参数
控制器方法的形参是一个实体类,且实体类的属性名与请求参数的参数名一致。
package com.example.mvc.controller;
import com.example.mvc.controller.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("/")
public String index() {
return "index";
}
@PostMapping("/test")
public String test(User user) {
System.out.println(user);
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<form th:action="@{/test}" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password" /><br/>
性别:<input type="radio" name="gender" value="男"/>男
<input type="radio" name="gender" value="女" />女<br/>
邮箱:<input type="text" name="email" /><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
package com.example.mvc.controller.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String gender;
private String email;
}
本例中,浏览器向服务器发送post请求,请求体中包含如下表单数据。
服务器端的控制器方法test(User user)
,该方法接收User
类型的形参,User
类中包含username
、password
、gender
、email
,与上述表单数据名称一致。
通过控制器方法形参的实体类参数获取得到请求参数,idea控制台打印出如下信息:
User(id=null, username=张三, password=1234, gender=男, email=test@123.com)
通过控制器方法形参获取请求头信息
使用注解@RequestHeader建立请求头与控制器方法形参的映射关系
@GetMapping("/test")
public String test(
@RequestParam(value = "username",required = false,defaultValue = "somebody") String name,
@RequestParam("password") String passwd,
String hobby,
@RequestHeader("Host") String host,
@RequestHeader(value = "test",required = true,defaultValue = "helloworld") String test
) {
System.out.println("name="+name);
System.out.println("passwd="+passwd);
System.out.println("hobby="+hobby);
System.out.println("host="+host);
System.out.println("test="+test);
return "success";
}
@RequestHeader
注解用来建立请求头与控制器方法形参的映射关系,它也有四个属性,分别是,
value():String
,value属性同name属性。name():String
,name属性同value属性。required():boolean
,是否必需,布尔值,默认为true
。defaultValue:String
,默认值。
通过控制器方法形参获取cookie数据
使用注解@CookieValue建立cookie数据与控制器方法形参的映射关系
package com.example.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
@Controller
public class TestController {
@RequestMapping("/")
public String index(HttpServletRequest request) {
return "index";
}
@GetMapping("/test/api")
public String testAPI(HttpServletRequest request){
HttpSession session = request.getSession();
return "success";
}
@GetMapping("/test")
public String test(
@RequestParam(value = "username",required = false,defaultValue = "somebody") String name,
@RequestParam("password") String passwd,
String hobby,
@RequestHeader("Host") String host,
@RequestHeader(value = "test",required = true,defaultValue = "helloworld") String test,
@CookieValue(value = "JSESSIONID") String JSESSIONID
) {
System.out.println("name="+name);
System.out.println("passwd="+passwd);
System.out.println("hobby="+hobby);
System.out.println("host="+host);
System.out.println("test="+test);
System.out.println("JSESSIONID="+JSESSIONID);
return "success";
}
}
<!-- index.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello World!</h1>
<a th:href="@{/test/api}">test api</a>
<form th:action="@{/test}" method="get">
用户名:<input type="text" name="username" autocomplete="off"/><br/>
密码:<input type="password" name="password" /><br/>
爱好:<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
首次点击链接"test_api"访问接口/test/api
时,会调用request.getSession()
,此时得到一个HttpSession
类型的对象session,session的id值(一个随机序列)会保存至cookie(键名为JSESSIONID
,键值为id值),且该cookie会被回写至响应头(Response Headers)。
再次访问接口/test/api
时,请求的请求头(Request Headers)会默认携带上述cookie,但响应头(Response Headers)中则不会再有cookie了。
服务器就是根据JSESSIONID
这个字段值找到对应的session的。
@CookieValue
注解用来建立cookie数据与控制器方法形参的映射关系,它也有四个属性,分别是,
value():String
,value属性同name属性。name():String
,name属性同value属性。required():boolean
,是否必需,布尔值,默认为true
。defaultValue:String
,默认值。