文章目录
一、通过servletAPI获取
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求报文的对象。
<form th:action="@{/testHttpServletRequest}" method="post">
username:<input type="text" name="username"><br>
password:<input type="text" name ="password"><br>
a<input type="checkbox" name="hobby" value="a">
b<input type="checkbox" name="hobby" value="b">
c<input type="checkbox" name="hobby" value="c"><br>
<input type="submit">
</form><br/>
package com.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
@Controller
public class RequestController {
@PostMapping("/testHttpServletRequest")
public String testHttpServletRequest(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
//HttpServletRequest获取多个同名的值
String[] hobbies = request.getParameterValues("hobby");
System.out.println("username:"+username);
System.out.println("password:"+password);
System.out.println("hobby"+ Arrays.toString(hobbies));
/* username:username
password:password
hobby[a, b, c]
*/
return "success";
}
}
二、 通过控制器方式的形参获取请求参数
1. 参数名与形参名一致时
请求参数名与形参名字一致时可以直接接收此参数,如果有多个值可以把类型改为数组,如果不改会将多个值用逗号拼接
<form th:action="@{/testParameter}" method="post">
username:<input type="text" name="username"><br>
password:<input type="text" name ="password"><br>
a<input type="checkbox" name="hobby" value="a">
b<input type="checkbox" name="hobby" value="b">
c<input type="checkbox" name="hobby" value="c"><br>
<input type="submit">
</form><br/>
@PostMapping("/testParameter")
//用与参数同名的形参接受值,如果有多个值则改为数组形式
public String testParameter(String username,String password,String[] hobby){
System.out.println("username:"+username);
System.out.println("password:"+password);
System.out.println("hobby"+ Arrays.toString(hobby));
/*
* username:username
password:password
hobby[a, b, c]*/
return "success";
}
@PostMapping("/testParameter2")
public String testParameter2(String username,String password,String hobby){
System.out.println("username:"+username);
System.out.println("password:"+password);
System.out.println("hobby"+ hobby);
/*
* username:username
password:password
hobby[a, b, c]*/
return "success";
}
2. 参数名与形参名不可以一致时,用@RequestParam注解
比如我们的请求名为user_name,这与java的命名规范不一致,可以用到下面的注解:
@RequestParam注解:将请求参数和控制器方法形参创建映射关系,其中属性如下:
- value:请求参数名对应形参名
- required:是否是必须的
- defaultValue:默认值
<form th:action="@{/testParameter3}" method="post">
username:<input type="text" name="user_name"><br>
password:<input type="text" name ="password"><br>
a<input type="checkbox" name="hobby" value="a">
b<input type="checkbox" name="hobby" value="b">
c<input type="checkbox" name="hobby" value="c"><br>
<input type="submit" value="请求参数名与形参名不一致时">
</form><br/>
@PostMapping("/testParameter3")
public String testParameter3(
//defaultValue表示默认值,在没有此请求参数传递过来或该请求参数没有值时,会将其赋值为123
//required表示是否是必要存在的,如果为true,且defaultValue没有设置时,则报400错误,如果为false,则赋值为null
@RequestParam(value = "user_name", required = false, defaultValue = "123") String username,
String password,
String[] hobby
) {
System.out.println("username:" + username);
System.out.println("password:" + password);
System.out.println("hobby" + Arrays.toString(hobby));
/*
username:username
password:password
hobby[a, b, c]
*/
return "success";
}
三、获取请求头信息
通过**@RequestHeader**注解获取请求头里面的值。
<form th:action="@{/testHeads}" method="post">
username:<input type="text" name="user_name"><br>
password:<input type="text" name ="password"><br>
a<input type="checkbox" name="hobby" value="a">
b<input type="checkbox" name="hobby" value="b">
c<input type="checkbox" name="hobby" value="c"><br>
<input type="submit" value="请求头信息">
</form><br/>
@PostMapping("/testHeads")
//defaultValue表示默认值,在没有此请求参数传递过来或该请求参数没有值时,会将其赋值为test
//required表示是否是必要存在的,如果为true,且defaultValue没有设置时,则报400错误,如果为false,则赋值为null
public String testHeads(@RequestHeader(value = "host", required = true, defaultValue = "test") String host) {
System.out.println(host);//localhost:8080
return "success";
}
四、获取cookie信息
通过**@CookieVlaue**注解获取cookie里面的值,用法与@RequestHeader、@RequestParam相同。
<form th:action="@{/testCookie}" method="post">
username:<input type="text" name="user_name"><br>
password:<input type="text" name ="password"><br>
a<input type="checkbox" name="hobby" value="a">
b<input type="checkbox" name="hobby" value="b">
c<input type="checkbox" name="hobby" value="c"><br>
<input type="submit" value="testCookie">
</form><br/>
@PostMapping("/testCookie")
public String testCookie(@CookieValue("Webstorm-47ce7496") String webStorm) {
System.out.println(webStorm);
return "success";
}
五、通过pojo获取请求参数
可以在控制器方法的形参位置设置一个试实体类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。
- 创建实体类
package com.springmvc.pojo;
import java.util.List;
public class User {
private int id;
private String username;
private String password;
private List<String> hobby;
public User() {
}
public User(int id, String username, String password, List<String> hobby) {
this.id = id;
this.username = username;
this.password = password;
this.hobby = hobby;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", hobby=" + hobby +
'}';
}
}
- 前端发送参数
<form th:action="@{/testPojo}" method="post">
username:<input type="text" name="username"><br>
password:<input type="text" name ="password"><br>
篮球<input type="checkbox" name="hobby" value="篮球">
足球<input type="checkbox" name="hobby" value="足球">
乒乓球<input type="checkbox" name="hobby" value="乒乓球"><br>
<input type="submit" value="testPojo">
</form><br/>
- 后端接收参数并自动给实体类中的属性赋值,如果参数名与属性的名字一致,则将参数赋给这个实例类对应的属性
@PostMapping("/testPojo")
public String testPojo( User user) {
System.out.println(user);
return "success";
}
六、解决乱码问题
1. get请求乱码
get请求的乱码需要在tomcat中的配置文件server.xml中配置如下信息:
<Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2. post请求乱码
post请求的乱码需要在web.xml中加入如下代码:
<!--解决post乱码问题-->
<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>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>