org.springframework.web.bind.annotation包下 @RequestParam 注解,该注解类型用于将指定的请求参数赋值给方法中的形参。那么@RequestParam注解有什么属性呢?它有4种属性,下面将逐一介绍这四种属性:
1、name属性
该属性的类型是String类型,它可以指定请求头绑定的名称;
2、value属性
该属性的类型是String类型,它可以设置是name属性的别名;
3、required属性
该属性的类型是boolean类型,它可以设置指定参数是否必须绑定;
4、defalutValue属性
该属性的类型是String类型,它可以设置如果没有传递参数可以使用默认值。
请求处理方法参数的可选类型位Java的8种基本数据类型和String。如下示例伪代码:
@RequestMapping(value="/hello") public ModelAndView hello( @RequestParam("loginname") String loginname, @RequestParam("password") String password) { return...; }
假设请求如下:http://localhost:8088/springmvc-comment1/login?loginname=qianch&password=123456
以上代码会将请求中的loginname参数的值“qianch”赋给loginname变量,password参数的值“123456”赋给password变量。
下面将通过案例演示@RequestMapping和@RequestParam注解的应用。
在项目的“src/main/java”下创建一个包,包名叫“com.qianchunhua.domain”,在包下创建User类,该类是一个域对象,主要用于封装前台页面传来的数据。如下代码:
package com.qianchunhua.domain; import java.io.Serializable; // 域对象,实现序列化接口 public class User implements Serializable{ // 私有字段 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; } }
在刚才创建的“com.qianchunhua.controller”包下再创建一个UserController类,该类主要模拟用户的注册。代码如下:
package com.qianchunhua.controller; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.qianchunhua.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; 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>(); } // 静态的日志类LogFactory private static final Log logger = LogFactory .getLog(UserController.class); // 该方法映射的请求为http://localhost:8088/springmvc-comment1/user/register,该方法支持GET请求 @RequestMapping(value="/register",method=RequestMethod.GET) public String registerForm() { logger.info("register GET方法被调用..."); // 跳转到注册页面 return "registerForm"; } // 该方法映射的请求为http://localhost:8088/springmvc-comment1/user/register,该方法支持POST请求 @RequestMapping(value="/register",method=RequestMethod.POST) // 将请求中的loginname参数的值赋给loginname变量,password和username同样处理 public String register( @RequestParam("loginname") String loginname, @RequestParam("password") String password, @RequestParam("username") String username) { logger.info("register POST方法被调用..."); // 创建User对象 User user = new User(); user.setLoginname(loginname); user.setPassword(password); user.setUsername(username); // 模拟数据库存储User信息 userList.add(user); // 跳转到登录页面 return "loginForm"; } // 该方法映射的请求为http://localhost:8088/springmvc-comment1/user/login @RequestMapping("/login") public String login( // 将请求中的loginname参数的值赋给loginname变量,password同样处理 @RequestParam("loginname") String loginname, @RequestParam("password") String password, Model model) { logger.info("登录名:"+loginname + " 密码:" + password); // 到集合中查找用户是否存在,此处用来模拟数据库验证 for(User user : userList){ if(user.getLoginname().equals(loginname) && user.getPassword().equals(password)) { model.addAttribute("user",user); return "welcome"; } } return "loginForm"; } }
UserController类的代码解释如下:
(1)UserController类使用了@Controller注解,是一个控制器类;
(2)UserController类上面使用了@RequestMapping(value=”/user”)注解,表示该控制器处理的所有请求都被映射到user路径下;
(3)本来没有使用数据库存储用户注册信息,所以定义了一个静态的List集合userList来代替数据库存储用户数据;
(4)registerForm方法使用了@RequestMapping(value=”/register”,method=RequestMethod.GET)注解,表示该方法映射的请求为http://localhost:8088/springmvc-comment1/user/register
,并且只支持GET请求。该方法返回字符串“registerForm”,参考springmvc-config.xml中的配置信息,可以知道该方法只是跳转到registerForm.jsp注册页面;
(5)register方法使用了@RequestMapping(value=”/register”,method=RequestMethod.POST)注解,表示该方法映射的请求为http://localhost:8088/springmvc-comment1/user/register
,并且只支持POST请求。该方法使用@RequestParam注解将指定的请求参数赋值给方法中的形参,之后创建了一个User对象保存用户传递的注册信息,最后将User对象存储到userList集合当中,之后的登录页面就可以到userList集合当中进行用户登录业务逻辑判断。该方法返回字符串“loginForm”,并跳转到loginForm.jsp登录页面;
(6)login方法使用了@RequestMapping(“/login”)注解,表示该方法映射的请求为http://localhost:8088/springmvc-comment1/user/login
,这里没有设置method属性表示支持所有方式的请求。该方法也使用@RequestParam注解将指定的请求赋值给方法中的形参。之后到集合中查找用户是否存在,此处用来模拟数据库验证。login方法中海油一个参数Model对象,调用该对象的addAttribute方法可以将数据添加到request当中。最后,如果用户登录成功则返回字符串“loginForm”,并跳转到loginForm.jsp页面。
我们需要在项目的content文件夹下,创建一个registerForm.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方法。
REF
https://blog.csdn.net/qq_42223653/article/details/90486584