【SpringMVC】参数绑定注解

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";
		 }
}

 
 


    
    



    
    



    
    



    
    

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值