1、@RequestParam注解
用于将指定的请求参数赋值给方法中的形参。
@RequestParam支持的属性:
示例一:
写法一:
@RequestMapping(value=”/login”)
public ModelAndView login(
@RequestParam(“loginname”) String loginname,
@RequestParam(“password”) String password
){
return …;
}
写法二:
@RequestParam(value=”loginname”, required=true , defaultValue =”admin”)
实例:@RequestMapping和@RequestParam注解的使用:
(1)实体类:User
// 域对象,实现序列化接口
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;
}
}
(2) UserController
// 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:8080/context/user/register,该方法支持GET请求
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String registerForm() {
logger.info("register GET方法被调用...");
// 跳转到注册页面
return "registerForm";
}
// 该方法映射的请求为http://localhost:8080/RequestMappingTest/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:8080/RequestMappingTest/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";
}
}
注:类上面使用了@RequestMapping(value=”/user”)注解,表示所有请求都被映射到user路径下。
(3)loginForm.jsp
<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>
2、@PathVariable注解
获得请求URL中的动态参数,只支持一个属性value,类型为String,表示绑定的名称,如果省略则默认绑定同名参数。
@RequestMapping(value=”/pathVariableTest/{userId}”)
public void pathVariableTest(@PathVariable Integer userId)
例如:http://localhost:8080/DataBindingTest/pathVariableTest/1
则自动将URL中模板变量{userId}绑定到通过@PathVariable注解的同名参数上,userId变量将被赋值为1
3、@RequestHeader注解
用于将请求的头信息数据映射到功能处理方法的参数上。
相关属性:
4、@CookieValue注解
用于将请求的Cookie数据映射到功能处理方法的参数上。
相关属性:
示例:
@RequestMapping(value = “/cookieValueTest”) public void cookieValueTest( @CookieValue(value=”JSESSIONID”,defaultValue=””) String sessionId){ }
实例:@PathVariable、@RequestHeader、@CookieValue注解的使用
@Controller
public class DataBindingController{
// 静态的日志类LogFactory
private static final Log logger = LogFactory
.getLog(DataBindingController.class);
// 测试@PathVariable注解
// 该方法映射的请求为http://localhost:8080/DataBindingTest/pathVariableTest/{userId}
@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(
@PathVariable Integer userId) {
logger.info("通过@PathVariable获得数据: " + userId);
}
// 测试@RequestHeader注解
// 该方法映射的请求为http://localhost:8080/DataBindingTest/requestHeaderTest
@RequestMapping(value="/requestHeaderTest")
public void requestHeaderTest(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts) {
logger.info("通过@requestHeaderTest获得数据: " + userAgent);
for(String accept : accepts){
logger.info(accept);
}
}
// 测试@CookieValue注解
@RequestMapping(value="/cookieValueTest")
public void cookieValueTest(
@CookieValue(value="JSESSIONID", defaultValue="") String sessionId) {
logger.info("通过@requestHeaderTest获得数据: " + sessionId);
}
}
说明:@CookieValue(value="JSESSIONID",defaultValue="") String sessionId)会自动将JSESSIONID值入参到sessionId参数上,defaultValue表示默认值为空。
5、@SessionAttributes注解
允许有选择的指定Model中的哪些属性需要转存到HttpSession对象中。实例:
@Controller
// 将Model中的属性名为user的放入HttpSession对象当中
@SessionAttributes("user")
public class SessionAttributesController{
// 静态的日志类LogFactory
private static final Log logger = LogFactory
.getLog(SessionAttributesController.class);
// 该方法映射的请求为http://localhost:8080/DataBindingTest/{formName}
@RequestMapping(value="/{formName}")
public String loginForm(@PathVariable String formName){
// 动态跳转页面
return formName;
}
// 该方法映射的请求为http://localhost:8080/DataBindingTest/login
@RequestMapping(value="/login")
public String login(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model ) {
// 创建User对象,装载用户信息
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
user.setUsername("admin");
// 将user对象添加到Model当中
model.addAttribute("user",user);
return "welcome";
}
}
页面:
访问request作用范围域中的user对象:${requestScope.user.username}<br>
访问session作用范围域中的user对象:${sessionScope.user.username }<br>
说明:
请求会将loginname和password的数据保存到User中,并添加到Model当中。因为类上面使用了@SessionAttributes("user")注解,故User同时也会将被设置到HttpSession作用域中。
6、@ModelAttribute注解
将请求参数绑定到Model对象。
@ModelAttribute注解只支持一个属性value,类型为String,表示绑定的属性名称。
注意:
被@ModelAttribute注释的方法会在Controller每个方法执行前被执行,因此在一个Controller映射到多个URL时,需要谨慎使用。
示例一:
@Controller
public class ModelAttribute1Controller{
// 使用@ModelAttribute注释的value属性,来指定model属性的名称,model属性对象就是方法的返回值
@ModelAttribute("loginname")
public String userModel1(
@RequestParam("loginname") String loginname){
return loginname;
}
@RequestMapping(value="/login1")
public String login1() {
return "result1";
}
}
示例二:
@Controller
public class ModelAttribute2Controller{
// model属性名称和model属性对象由model.addAttribute()实现,前提是要在方法中加入一个Model类型的参数。
// 注意:当URL或者post中不包含对应的参数时,程序会抛出异常。
@ModelAttribute
public void userModel2(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
Model model){
model.addAttribute("loginname", loginname);
model.addAttribute("password", password);
}
@RequestMapping(value="/login2")
public String login2() {
return "result2";
}
}
示例三:
@Controller
public class ModelAttribute3Controller{
// 静态List<User>集合,此处代替数据库用来保存注册的用户信息
private static List<User> userList;
// UserController类的构造器,初始化List<User>集合
public ModelAttribute3Controller() {
super();
userList = new ArrayList<User>();
User user1 = new User("test","123456","测试用户");
User user2 = new User("admin","123456","管理员");
// 存储User用户,用于模拟数据库数据
userList.add(user1);
userList.add(user2);
}
// 根据登录名和密码查询用户,用户存在返回包含用户信息的User对象,不存在返回null
public User find(String loginname,String password){
for(User user: userList){
if(user.getLoginname().equals(loginname) && user.getPassword().equals(password)){
return user;
}
}
return null;
}
// model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是user。
// 这个例子中model属性名称由返回对象类型隐含表示,model属性对象就是方法的返回值。它不需要指定特定的参数。
@ModelAttribute
public User userModel3(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password){
return find(loginname, password);
}
@RequestMapping(value="/login3")
public String login3() {
return "result3";
}
}
示例四:
@Controller
public class ModelAttribute4Controller{
// 这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称是@RequestMapping的value值。
// Model属性名称由@ModelAttribute(value=””)指定,相当于在request中封装了username(key)=admin(value)。
@RequestMapping(value="/login4")
@ModelAttribute(value="username")
public String login4() {
return "admin";
}
}
示例五:
@Controller
public class ModelAttribute5Controller{
// model属性名称就是value值即”user”,model属性对象就是方法的返回值
@ModelAttribute("user")
public User userModel5(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password){
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
return user;
}
// @ModelAttribute("user") User user注释方法参数,参数user的值来源于userModel5()方法中的model属性。
@RequestMapping(value="/login5")
public String login5(@ModelAttribute("user") User user) {
user.setUsername("管理员");
return "result5";
}
}