3.3 @RequestParam注解

3.3 @RequestParam注解

@RequestParam注解用途

org.springframework.web.bind.annotation.RequestParam注解用于**将指定的请求参数赋值给方法中的形参**。

@RequestParam注解属性

使用@RequestParam注解可指定如下表所示的属性。

属性 类型 是否必要 说明
name String 指定请求参数绑定的名称
value String name属性的别名
required boolean 指定参数是否必须绑定
dafaultValue String 如果没有传递参数而使用的默认值

请求方法的参数可以为 基本类型或String

请求处理方法参数的可选类型为Java基本数据类型String
示例代码如下:

1
2
3
4
5
6
7
@RequestMapping(value="/login")
public ModelAndView login(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password
){
return ......;
}

假设请求如下:

1
http://localhost:8080/context/login?loginname=jack&password=123456

以上代码会将请求中的loginname参数的值"jack"赋给loginname变量, password参数的值"123456"赋给password变量。
需要注意的是,如果请求中不包含"loginname"参数,则将产生异常!因此,如果不能保证存在"loginname"参数,建议使用:
@RequestParam(value="loginname", required= false)
@RequestParam注解还有如下写法:
@RequestParam(value="loginname", required=true, defaultValue="admin");
其中required参数默认值为true,所以这里可以省略required=true这个参数。

示例 @RequestMapping和@RequestParam注解的使用

新建一个项目RequestMappingTest,加入所需的jar文件。

项目结构

展开/折叠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\03\RequestMappingTest
├─src\
│ └─org\
│ └─fkit\
│ ├─controller\
│ │ └─UserController.java
│ └─domain\
│ └─User.java
└─WebContent\
├─META-INF\
│ └─MANIFEST.MF
└─WEB-INF\
├─content\
│ ├─loginForm.jsp
│ ├─registerForm.jsp
│ └─welcome.jsp
├─lib\
│ ├─commons-logging-1.2.jar
│ ├─spring-aop-5.0.1.RELEASE.jar
│ ├─spring-aspects-5.0.1.RELEASE.jar
│ ├─spring-beans-5.0.1.RELEASE.jar
│ ├─spring-context-5.0.1.RELEASE.jar
│ ├─spring-context-indexer-5.0.1.RELEASE.jar
│ ├─spring-context-support-5.0.1.RELEASE.jar
│ ├─spring-core-5.0.1.RELEASE.jar
│ ├─spring-expression-5.0.1.RELEASE.jar
│ ├─spring-instrument-5.0.1.RELEASE.jar
│ ├─spring-jcl-5.0.1.RELEASE.jar
│ ├─spring-jdbc-5.0.1.RELEASE.jar
│ ├─spring-jms-5.0.1.RELEASE.jar
│ ├─spring-messaging-5.0.1.RELEASE.jar
│ ├─spring-orm-5.0.1.RELEASE.jar
│ ├─spring-oxm-5.0.1.RELEASE.jar
│ ├─spring-test-5.0.1.RELEASE.jar
│ ├─spring-tx-5.0.1.RELEASE.jar
│ ├─spring-web-5.0.1.RELEASE.jar
│ ├─spring-webflux-5.0.1.RELEASE.jar
│ ├─spring-webmvc-5.0.1.RELEASE.jar
│ └─spring-websocket-5.0.1.RELEASE.jar
├─springmvc-config.xml
└─web.xml

示例代码如下:

User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.fkit.domain;
import java.io.Serializable;
// 域对象,实现序列化接口
public class User implements Serializable
{
private static final long serialVersionUID = 1L;
// 私有字段
private String loginname;
private String password;
private String username;
// 公共构造器
public User()
{
super();
}
// set/get方法
// 此处省略getter和setter方法,请自己补上
}

User是一个域对象,用来接收并封装从前台页面传递过来的数据。

UserController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package org.fkit.controller;

import java.util.ArrayList;
import java.util.List;
import org.fkit.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

// Controller注解用于指示该类是一个控制器,可以同时处理多个请求动作
@Controller
// RequestMapping可以用来注释一个控制器类,此时,所有方法都将映射为相对于类级别的请求,
// 表示该控制器处理所有的请求都被映射到 value属性所指示的路径下
@RequestMapping(value = "/user")
public class UserController
{

// 静态List<User>集合,此处代替数据库用来保存注册的用户信息
private static List<User> userList;

// UserController类的构造器,初始化List<User>集合
public UserController()
{
super();
userList = new ArrayList<User>();
}

// 该方法映射的请求为http://localhost:8080/context/user/register,该方法支持GET请求
@GetMapping(value = "/register")
public String registerForm()
{
System.out.println("register GET方法被调用...");
// 跳转到注册页面
return "registerForm";
}

// 该方法映射的请求为http://localhost:8080/RequestMappingTest/user/register,该方法支持POST请求
@PostMapping(value = "/register")
// 将请求中的loginname参数的值赋给loginname变量,password和username同样处理
public String register(@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
@RequestParam("username") String username)
{
System.out.println("register POST方法被调用...");
// 创建User对象
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
user.setUsername(username);
// 模拟数据库存储User信息
userList.add(user);
// 跳转到登录页面
return "loginForm";
}

// 该方法映射的请求为http://localhost:8080/RequestMappingTest/user/login
@RequestMapping("/login")
public String login(
// 将请求中的loginname参数的值赋给loginname变量,password同样处理
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model)
{
System.out.println("登录名:" + loginname + " 密码:" + password);
// 到集合中查找用户是否存在,此处用来模拟数据库验证
for (User user : userList)
{
if (user.getLoginname().equals(loginname)
&& user.getPassword().equals(password))
{
model.addAttribute("user", user);
return "welcome";
}
}
return "loginForm";
}
}

UserControlller类的代码解释如下:

  1. UserController类使用了@Controlller注解,是一个控制器类。
  2. UserControlller类上面使用了@RequestMapping(value="/user")注解,表示该控制器处理的所有请求都被映射到/user路径下。
  3. 本例没有使用数据库存储用户注册信息,所以定义了一个静态的List集合userList用来代替数据库存储用户数据。
  4. registerForm方法使用了@GetMapping(value="/register")注解,表示该方法映射的请求为:
    http://localhost:8080/RequestMappingTest/user/register,并且只支持GET请求。
    该方法返回字符串"registerForm",参考springmvc-config.xml中的视图解析器的配置信息,可以知道该方法只是跳转到registerForm.jsp注册页面
  5. register方法使用了@PostMapping(value="/register")注解,表示该方法映射的请求为:
    http://localhost:8080/RequestMappingTest/user/register并且只支持POST请求。
    该方法使用@RequestParam注解将指定的请求参数赋值给方法中的形参,之后创建了一个User对象保存用户传递的注册信息,最后将User对象存储到userList集合中,然后登录页面就可以到userList集合中进行用户登录业务逻辑的判断。该方法返回字符串loginForm,这样会跳转到loginForm.jsp登录页面。
    • 提示:registerForm方法和register方法虽然映射的请求一样,但是registerForm方法支持的是GET请求,而register方法支持的是POST请求。
  6. login方法使用了@RequestMapping("/login")注解,表示该方法映射的请求为:
    http://localhost/RequestMappingTest/user/login,这里没有设置method属性,表示支持所有方式的请求。该方法也使用@RequestParam注解将指定的请求参数赋值给方法中的形参。之后到集合中査找用户是否存在,此处用来模拟数据库验证。login方法中还有一个参数Model对象,调用该对象的addAttribute方法可以将数据添加到request当中。最后,如果用户登录成功则返回字符串welcome,并跳转到welcome.jsp欢迎页面;登录失败则返回字符串 loginForm,并跳转到loginForm.jsp登录页面.

registerForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册页面</title>
</head>
<body>
<h3>注册页面</h3>
<form action="register" method="post">
<table>
<tr>
<td><label>登录名: </label></td>
<td><input type="text" id="loginname" name="loginname"></td>
</tr>
<tr>
<td><label>密码: </label></td>
<td><input type="password" id="password" name="password"></td>
</tr>
<tr>
<td><label>真实姓名: </label></td>
<td><input type="text" id="username" name="username"></td>
</tr>
<tr>
<td><input id="submit" type="submit" value="注册"></td>
</tr>
</table>
</form>
</body>
</html>

registerForm.jsp是一个注册页面,用户可以在这里输入登录名、密码和真实姓名,该表单被提交到register请求。注意,这里使用的是POST方式,响应请求的是UserController类的register方法。

loginForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
<h3>登录页面</h3>
<form action="login" method="post">
<table>
<tr>
<td><label>登录名: </label></td>
<td><input type="text" id="loginname" name="loginname"></td>
</tr>
<tr>
<td><label>密码: </label></td>
<td><input type="password" id="password" name="password"></td>
</tr>
<tr>
<td><input id="submit" type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>

lognForm.jsp是一个登录页面,用户可以在这里输入登录名和密码,该表单被提交login请求。这里使用的是POST方式,响应请求的是UserControlller类的login方法。

welcome.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试@RequestMapping注解</title>
</head>
<body>
<!-- 页面可以访问Controller传递传递出来的模型User对象 -->
欢迎[${requestScope.user.username }]登陆
<br>
</body>
</html>

welcome.jsp是一个欢迎页面,用户登录成功后跳转到该页面,该页面使用了EL表达式访问request当中的user对象的username属性
此外,还需要在web.xml文件中配置Spring MVC的前端控制器DispatcherServlet,因为每次配置基本相同,此处不再赘述,读者可自行配置.
同时Spring MVC还需要springmvc-config.xml配置文件,ControllerTest项目中的springmvc-config.xml文件内容一致.读者可以自行配置。

测试

部署RequestMappingTest这个Web应用,在浏览器中输入如下URL来测试应用:

1
http://localhost:8080/RequestMappingTest/user/register
  • 此时可以在浏览器上看到注册页面,表示Spring MVC成功跳转到注册页面registerForm.jsp.
  • 输入登录名"test",密码"123456",真实姓名"测试用户",单击"注册"按钮。请求将会被提交到UserControlller类的register方法进行注册,注册的用户信息会被保存到UserController类的userList静态集合中。若注册成功,将会跳转到登录页面
  • 输入登录名"test",密码"123456",单击"登录"按钮。请求将会被提交到UserController类的login方法进行登录验证,若验证成功,将会跳转到欢迎页面.