【SpringMVC】参数绑定注解

来源:互联网 发布:php的未来发展 编辑:程序博客网 时间:2024/05/21 22:49

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>();}// 静态的日志类LogFactoryprivate 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注解的使用

@Controllerpublic class DataBindingController{// 静态的日志类LogFactoryprivate 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{// 静态的日志类LogFactoryprivate 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时,需要谨慎使用。

                   示例一:

@Controllerpublic 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"; }}
示例二:

@Controllerpublic class ModelAttribute2Controller{// model属性名称和model属性对象由model.addAttribute()实现,前提是要在方法中加入一个Model类型的参数。// 注意:当URL或者post中不包含对应的参数时,程序会抛出异常。@ModelAttributepublic 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"; }}

示例三:

@Controllerpublic 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对象,不存在返回nullpublic 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属性对象就是方法的返回值。它不需要指定特定的参数。@ModelAttributepublic User userModel3( @RequestParam("loginname") String loginname,@RequestParam("password") String password){return find(loginname, password);}@RequestMapping(value="/login3") public String login3() { return "result3"; }}
示例四:
@Controllerpublic class ModelAttribute4Controller{ // 这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称是@RequestMapping的value值。 // Model属性名称由@ModelAttribute(value=””)指定,相当于在request中封装了username(key)=admin(value)。@RequestMapping(value="/login4")@ModelAttribute(value="username") public String login4() { return "admin"; }}
示例五:

@Controllerpublic 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"; }}
 
原创粉丝点击