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(); } }
|
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
@RequestMapping(value = "/user") public class UserController {
private static List<User> userList;
public UserController() { super(); userList = new ArrayList<User>(); }
@GetMapping(value = "/register") public String registerForm() { System.out.println("register GET方法被调用..."); return "registerForm"; }
@PostMapping(value = "/register") public String register(@RequestParam("loginname") String loginname, @RequestParam("password") String password, @RequestParam("username") String username) { System.out.println("register POST方法被调用..."); User user = new User(); user.setLoginname(loginname); user.setPassword(password); user.setUsername(username); userList.add(user); return "loginForm"; }
@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
类的代码解释如下:
UserController
类使用了@Controlller
注解,是一个控制器类。
- 在
UserControlller
类上面使用了@RequestMapping(value="/user")
注解,表示该控制器处理的所有请求都被映射到/user
路径下。
- 本例没有使用数据库存储用户注册信息,所以定义了一个静态的
List
集合userList
用来代替数据库存储用户数据。
registerForm
方法使用了@GetMapping(value="/register")
注解,表示该方法映射的请求为:
http://localhost:8080/RequestMappingTest/user/register
,并且只支持GET
请求。
该方法返回字符串"registerForm"
,参考springmvc-config.xml
中的视图解析器的配置信息,可以知道该方法只是跳转到registerForm.jsp
注册页面
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
请求。
login
方法使用了@RequestMapping("/login")
注解,表示该方法映射的请求为:
http://localhost/RequestMappingTest/user/login
,这里没有设置method
属性,表示支持所有方式的请求。该方法也使用@RequestParam
注解将指定的请求参数赋值给方法中的形参。之后到集合中査找用户是否存在,此处用来模拟数据库验证。login
方法中还有一个参数Model
对象,调用该对象的addAttribute
方法可以将数据添加到request
当中。最后,如果用户登录成功则返回字符串welcome
,并跳转到welcome.jsp
欢迎页面;登录失败则返回字符串 loginForm
,并跳转到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 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
方法。
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
方法进行登录验证,若验证成功,将会跳转到欢迎页面.