@RequestParam注解
org.springframework.web.bind.annotation.RequestParam
注解用于将指 定的请求参数赋值给方法中的形参, 使用@RequestParam注解可指定如下表所示的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 指定请求参数绑定的名称 |
value | String | 否 | name属性的别名 |
required | boolean | 否 | 指示参数是否必须绑定 |
defaultVale | String | 否 | 如果没有产地参数而使用的默认值 |
请求处理方法参数的可选类型为Java基本数据类型和String,示例代码如下:
@RequestMapping(value="/login")
public ModelAndView login(@RequestParam("loginname") String loginname, @ReqeustParam("password") String password){
return ...;}
然后,例如请求连接为http://localhost:8080/context/login?loginname=davieyang&password=111111
,请求中的davieyang就会赋给loginname变量,password的参数值111111赋给password,如果请求中不包含“loginname”参数,则将产生异常,因此,如果不能保证存在“loginname”参数,建议使用:@RequestParam(value="loginname", required=false)
@RequestParam注解还可以这样写:@RequestParam(value="loginname", required=true, defaultValue="admin")
其中required参数不是必须的,默认值为ture
@RequestMapping和@RequestParam注解的使用
package org.davieyang.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方法public String getLoginname() {
return loginname;}public void setLoginname(String loginname) {
this.loginname = loginname;}public String getPassword() {
return password;}public void setPassword(String password) {
this.password = password;}public String getUsername() {
return username;}public void setUsername(String username) {
this.username = username;}
}
User是一个域对象,用来接收并封装从前台页面传递过来的数据
package org.davieyang.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";}
}
UserController类的代码解释如下:
- UserController类使用了@Controller注解,是一个控制器类
- 在UserController类上面使用了@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: 8080/RequestMappingTest/user/login
,这里没有设置method属性,表示支 持所有方式的请求。该方法也使用@RequestParam注解将指定的请求参 数赋值给方法中的形参。之后到集合中查找用户是否存在,此处用来模 拟数据库验证。login方法中还有一个参数Model对象,调用该对象的 addAttribute方法可以将数据添加到request当中。最后,如果用户登录成 功则返回字符串 welcome,并跳转到welcome.jsp欢迎页面;登录失败则 返回字符串 loginForm,并跳转到loginForm.jsp登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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方法
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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>
loginForm.jsp是一个登录页面,用户可以在这里输入登录名和密 码,该表单被提交到login请求。这里使用的是POST方式,响应请求的是UserController类的login方法
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<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:http://localhost:8080/RequestMappingTest/user/register
来测试应用,可看到下图所示页面表示Spring MVC 成功跳转到注册页面 registerForm.jsp
输入登录名“test”,密码“123456”,真实姓名“测试用户”,单击“注 册”按钮。请求将会被提交到UserController类的register方法进行注册, 注册的用户信息会被保存到UserController类的userList静态集合中。若 注册成功,将会跳转到如下图所示页面
输入登录名“test”,密码“123456”,单击“登录”按钮。请求将会被提交到UserController类的login方法进行登录验证,若验证成功,将会跳转到如下图所示页面