目录
1 通过 HttpServletRequest 获取请求参数
2 通过控制器方法的形参获取请求参数
3 通过 POJO 获取请求参数(重点)
1 通过 HttpServletRequest 获取请求参数
public String handler1(HttpServletRequest request)
<form action="${pageContext.request.contextPath}/login/test1" method="get">
用户名: <input type="text" name="username"/> <br>
密 码: <input type="password" name="password"/> <br>
<input type="submit" />
</form>
@Controller
@RequestMapping("/login")
public class MyController {
@RequestMapping(value = "/?est1")
public String handler1(HttpServletRequest request) {
System.out.println("处理器1");
// 通过 HttpServletRequest 获取请求参数
String username= request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:" + username + " password:" + password);
return "success";
}
}
2 通过控制器方法的形参获取请求参数
public String handler1(String username, String password)
<form action="${pageContext.request.contextPath}/login/test1" method="get">
用户名: <input type="text" name="username"/> <br>
密 码: <input type="password" name="password"/> <br>
<input type="submit" />
</form>
@Controller
@RequestMapping("/login")
public class MyController {
@RequestMapping(value = "/?est1")
// 通过 形参 获取请求参数
public String handler1(String username, String password) {
System.out.println("处理器1");
System.out.println("username:" + username + " password:" + password);
return "success";
}
}
@RequestParam 注解用于将请求参数的数据映射到 Handler 方法(控制器方法)的形参上,相当于给请求参数重命名。如有时有一些特殊情况,前端的 name 属性与后端 Handler 方法中的形参不一致,这个时候就可以通过 @RequestParam 注解来解决。
语法:@RequestParam(value=”参数名”,required=”true|false”,defaultValue=””)
- value:请求中传入参数的名称
- required:该参数是否为必传项,默认为 true,表示该请求路径中必须包含该参数,如果不包含就报错;若设置为 false,则表示该请求路径中不必包含该参数,若没有传输该参数,则注解所标识的形参的值为 null
- defaultValue:设置默认参数值,如果设置了该值,required=true 将失效,自动为 false,如果没有传该参数,就使用默认值
<form action="${pageContext.request.contextPath}/login/test1" method="get">
密 码: <input type="password" name="password"/> <br>
<input type="submit" />
</form>
@Controller
@RequestMapping("/login")
public class MyController {
@RequestMapping(value = "/?est1")
// 通过 形参 获取请求参数
public String handler1(
@RequestParam(value = "name", required = true, defaultValue = "赵飞燕") String username,
String password) {
System.out.println("处理器1");
System.out.println("username:" + username + " password:" + password);
return "success";
}
}
上述代码中,请求路径中没有请求参数 name,但是 @RequestParam(value = "name", required = true, defaultValue = "赵飞燕") String username,会将默认值 "赵飞燕" 赋值给 username,最终输出 username:赵飞燕 password=123
运行结果
补充:
@RequestHeader 注解
- @RequestHeader 注解是将请求头信息和控制器方法的形参创建映射关系
- @RequestHeader 注解一共有三个属性:value、required、defaultValue,用法同 @RequestParam 注v
@CookieValue 注解
- @CookieValue 注解是将 cookie 数据和控制器方法的形参创建映射关系
- @CookieValue 注解一共有三个属性:value、required、defaultValue,用法同 @RequestParam 注解
3 通过 POJO 获取请求参数(重点)
POJO 全称“Plain Old Java Object”,意思是“简单 Java 对象”。POJO 的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的 Java 对象。
可以在控制器方法的形参位置设置一个实体类类型的形参,若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。
测试案例:用请求参数为以下 User 类中的属性赋值,具体用法请看代码
// 普通数据
private String username;
// 对象
private UserInfo userInfo;
// 数组
private String hobbys[];
// 列表
private List<String> titles;
// Map
private Map<String, Company> companys
login.jsp
提示:以下代码中 userInfo 是对象,age、height 是它的属性。 hobbys 可以是 hobbsy[0],指定在数组中存放的位置。同理,titles[0] 可以为 titles,不指定在列表中存放的位置,按照请求参数的顺序来。此外,可以不按照顺序来,如第一个 hobbys[0],下一个为 hobbys[2],中间的 hobbys[1] 没有,默认为 null。对于 companys['公司1'].companyName / values,根据 private Map<String, Company> companys,'公司' 是 key,companys['公司1'] 为 value,也就是 Company 对象,companyName、values 是它的属性。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login/test1" method="get">
用户名: <input type="text" name="username" value="赵飞燕"/> <br>
年龄: <input type="text" name="userInfo.age" value="18"/> <br>
身高: <input type="text" name="userInfo.height" value="168"/> <br>
爱好: <input type="checkbox" name="hobbys" value="追剧" checked="checked">追剧
<input type="checkbox" name="hobbys" value="画画" checked="checked">画画
<input type="checkbox" name="hobbys" value="健身" checked="checked">健身<br>
头衔1: <input type="text" name="titles[0]" value="智慧女神"/> <br>
头衔2: <input type="text" name="titles[1]" value="幸运之神"/> <br>
公司1名称: <input type="text" name="companys['公司1'].companyName" value="肯德基"/> <br>
公司1市值: <input type="text" name="companys['公司1'].values" value="12亿"/> <br>
公司2名称: <input type="text" name="companys['公司2'].companyName" value="黑马"/> <br>
公司2市值: <input type="text" name="companys['公司2'].values" value="15亿"/> <br>
<input type="submit" />
</form>
</body>
User 类
public class User {
// 普通数据
private String username;
// 对象
private UserInfo userInfo;
// 数组
private String hobbys[];
// 列表
private List<String> titles;
// Map
private Map<String, Company> companys;
// setter、getter 方法省略
}
控制器 MyController
@Controller
@RequestMapping("/login")
public class MyController {
@RequestMapping(value = "/?est1")
// 通过 形参 获取请求参数
public String handler1(User user) {
String username = user.getUsername();
int age = user.getUserInfo().getAge();
int height = user.getUserInfo().getHeight();
String hobbys[] = user.getHobbys();
List<String> titles = user.getTitles();
Map<String, Company> companys = user.getCompanys();
// 普通参数
System.out.println("用户姓名:" + username);
// 对象
System.out.println("用户年龄:" + age);
System.out.println("用户身高:" + height);
// 数组
System.out.print("用户爱好:");
for(String hobby : hobbys) {
System.out.print(" " + hobby);
}
System.out.println();
// List
System.out.print("称号:");
for(String title : titles) {
System.out.print(" " + title);
}
System.out.println();
// Map
Set<Map.Entry<String, Company>> entries = companys.entrySet();
for (Map.Entry<String, Company> entry : entries) {
System.out.println(entry.getKey() + ":" + entry.getValue().getCompanyName() + "市值:" + entry.getValue().getValues());
}
return "success";
}
}
company 类
public class Company {
private String companyName;
private String values;
// setter、getter 方法省略
}
Userinfo 类
public class UserInfo {
private int age;
private int height;
// setter、getter 方法省略
}
执行结果