携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
1、通过ServletAPI获取
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求报文的对象。
/**
* @author rop
* @since 2022/7/31 11:36
*/
@Controller
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParameterServletAPI(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "admin".equals(password)){
return "success";
}
return "index";
}
}
这里的success是通过验证则跳转的页面,因为在视图解析器中配置中已经配置了跳转的前缀和后缀,所以这里只需要直接输入文件名即可跳转,index同理也是。上述的例子还只是用的JavaEE的servlet的API,比较简单。
2、通过控制器方法的形参获取请求参数
只要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一样即可。
@RequestMapping("/param")
public String getParameter(String username,String password){
if ("admin".equals(username) && "admin".equals(password)){
return "success";
}
return "index";
}
第二种方式则是SpringMVC中的用法,将前端页面的传递的参数对应的参数名写在方法的形参列表中,在运行的过程中,方法即可通过参数列表来获取前端传递的参数。
3、@RequestParam
将请求参数和控制器方法的形参绑定
三个属性:
- value
- required
- defaultValue
value:设置和形参绑定的请求参数的名字
required:设置是否必须传输value所对应的请求参数。
默认值为true,表示value所对应的请求参数必须传输,否则页面报错。
若设置为false,则表示value所对应的请求参数不是必须传输,若未传输,则形参值为null
defaultValue:设置当没有传输value所对应的请求参数时,为形参设置的默认值,此时和required属性值无关
4、@RequestHeader
将请求头信息和控制器方法的形参绑定
@RequestMapping("/param3")
public String getParameter3(
@RequestParam("userName") String username,
String password,
@RequestHeader("referer") String referer) {
if ("admin".equals(username) && "admin".equals(password)) {
System.out.println("referer = " + referer);
return "success";
}
return "index";
}
这个referer可以获取中header中的referer的信息。
5、@CookieValue
将cookie数据和控制器方法的形参绑定
@RequestMapping("/param4")
public String getParameter4(
@RequestParam("userName") String username,
String password,
@CookieValue("JSESSIONID") String jSessionId) {
if ("admin".equals(username) && "admin".equals(password)) {
System.out.println("jSessionId = " + jSessionId);
return "success";
}
return "index";
}
这个cookie可以看做是JavaEE中的cookie,作用差不多一样。
6、通过POJO获取请求参数
package com.rop.pojo;
/**
* @author rop
* @since 2022/7/31 14:27
*/
public class User {
private Integer id;
private String username;
private String password;
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + ''' +
", password='" + password + ''' +
'}';
}
}
@RequestMapping("/param5/pojo")
public String getParameter5(User user) {
System.out.println("user = " + user);
return "success";
}
<form th:action="@{/param5/pojo}" method="post">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
需要在控制器方法的形参位置设置实体类类型的形参,要保证实体类中的属性的属性名和请求参数的名字一致,可以通过实体类类型的形参获取请求参数。
7、解决获取请求参数的乱码问题
<!--设置字符编码过滤器-->
<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>
<!--设置这个可以使响应的编码也是UTF-8-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这个的源码已通透。