zoukankan      html  css  js  c++  java
  • (十六)springMvc 补充


    数据回显

    1. pojo 数据回显的支持 ,springMvc 会默认的将传进来的 pojo 保存到 request 域里面,keypojo 类的名字首字母小写,简短类名而非全限定名;
    2. 也可以使用 model 将传进来的 pojo ,传到页面
    3. 使用注解,指定传到页面的参数的名字,@ModelAttribute

    不过需要注意的是,不要使用重定向,使用转发。否则将是新的请求的 request,导致数据回显失败;


    @ModelAttribute && @SessionAttributes 注解

    这两个注解的知识,转载于 https://blog.csdn.net/xiejx618/article/details/43638537

    先看一个没有使用 @ModelAttributeController 方法.

        @RequestMapping("/save")
        public String save(User user) {
        	user.setUsername("U love me");
        	userService.save(user);
        	return "result";
        }
    
    

    其中 User 包含 idusername 两个私有属性,含有公共 settergetter 方法.
    执行此方法时会将 key 为 “user” (注意:这里即使参数名称是 user1 ,key 一样还是 "user" ),valueuser 的对象加入到 model. 在 jsp 页面可以通过 ${user.id}${user.name} 得到值的,即上面方法和下面方法是相当的.

    @RequestMapping("/save")
    public String save(Model model,int id,String username) {
    	User user=new User();
    	//这里是通过反射从request里面拿值再set到user
    	user.setId(id);
    	user.setUsername(username);
    	model.addAttribute("user",user);
    	
    	user.setUsername("U love me");
    	userService.save(user);
    	return "result";
    }
    

    一.下面再来看看 @ModelAttribute 的基本用法.

    1. 在方法上使用 @ModelAttribute

      @ModelAttribute("user1")
      public User addUser(User user) {
      	return new User(520,"I love U");
      }
      

      假设此方法是写在 UserController 内,那么执行 UserController 内带有 @RequestMapping 的方法之前,都会先执行此 addUser 方法.并且执行 addUser 过程中会添加两个对象到 model,先将 key"user" 的对象(由 addUser 方法的 User user 引起的),再添加key为 "user1" 的对象(由注解 @ModelAttribute("user1") 引起的).

    2. 在方法参数上使用 @ModelAttribute

      @RequestMapping("/save")
      public String save(@ModelAttribute User user) {
      	user.setUsername("U love me");
      	userService.save(user);
      	return "result";
      }
      

      此方法会先从 model 去获取 key"user" 的对象,如果获取不到会通过反射实例化一个User 对象,再从 request 里面拿值 set 到这个对象,然后把这个 User 对象添加到model (其中 key"user" ).

      使用了 @ModelAttribute 可修改这个 key ,不一定是 "user" ,此情况下,用与不用@ModelAttribute 没有区别.

    3. 再来看看在方法和方法参数上结合使用 @ModelAttribute

      即上面两步的两个方法都添加 UserController ,如下:

      @ModelAttribute("user1")
      public User addUser(User user) {
      	return new User(520,"I love U");
      }
      @RequestMapping("/save")
      public String save(@ModelAttribute User user) {
      	user.setUsername("U love me");
      	userService.save(user);
      	return "result";
      }
      

      假设要执行保存用户操作,根据一分析可知,先执行完会产生两个 User 类型的对象(一个 key"user" ,另一个 key"user1" )添加到 model ,再执行 save 方法,此时会先从 model 去找 key"user" 的对象,能找到再从 request 取值 set 到这个 User 对象.最后返回到 jsp 页面, model 里也只有两个 User 类型对象.

      再来个小小假设,将上面 @ModelAttribute("user1")user1 改为 user ,其它不变.虽然执行了 addUser 方法,那么执行到 save 方法内, user 对象的字段值还是来源于请求,最后返回到 jsp 页面,model 里也只有一个 User 类型对象.

    4. 另类:

      @ModelAttribute
      @RequestMapping("/save")
      public String save(@ModelAttribute User user) {
      	user.setUsername("U love me");
      	userService.save(user);
      	return "result";
      }
      

      此种情况,会添加一个 key"user"User 对象到 model ,还会添加一个 key"string" , value"result" 的对象到 model,而视图名称则变为了 "save" 而不是 "result" .相信一般开发者都不会这样用.

    二.下面再看看结合 @SessionAttributes 的用法.

    1. 先看看这段代码

      @Controller
      @RequestMapping("user")
      @SessionAttributes("test")
      public class UserController {
          @RequestMapping(value = "test1")
          public String test1(Map<String, Object> model, SessionStatus sessionStatus) {
              model.put("test","something");
              //sessionStatus.setComplete();
              return "user/list";
          }
       
          @RequestMapping(value = "test2")
          public String test2(Map<String,?>  model) {
              Object test = model.get("test");
              System.out.println(test);
              return "user/list";
          }
      }
      

      在类级别上使用 @SessionAttributes("test"),它的作用是在 controller 共享 model 属性博主备注下:注意是共享属性哦,而非共享整个 model ,共享具体的哪一个属性,根据@SessionAttributes("")的值,直到调用 org.springframework.web.bind.support.SessionStatus#setComplete 会清除此 session 值.否则长期保留(session过期,这个值也不再保留).因此先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法put进去的值.当移除上面的注解,因为属性为testsession也被清除了,所以test2方法会得到是null.

    2. 再看结合 @ModelAttribute 的用法.

      @Controller
      @RequestMapping("user")
      @SessionAttributes("test")
      public class UserController {
          @RequestMapping(value = "test1")
          public String test1(HttpServletRequest request) {
              User user = new User("xiejx618");
              request.getSession().setAttribute("test",user);
              return "user/list";
          }
          @RequestMapping(value = "test2")
          public String test2(@ModelAttribute("test") User user,SessionStatus sessionStatus) {
              System.out.println(user.getUsername());
              sessionStatus.setComplete();
              return "user/list";
          }
      }
      

      一样先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法set进去的值.使用了@SessionAttributes,如果在controller的方法参数上有@ModelAttribute,那么此方法会确保属性testsession会存在,否则会抛org.springframework.web.HttpSessionRequiredException异常,即上面代码先不调/user/test1,直接调/user/test2就会抛此异常

      我个人很少这样用,用原始的写法就清晰很多了,但要看明白别人写的代码。


      作者:xiejx618
      来源:CSDN
      原文:https://blog.csdn.net/xiejx618/article/details/43638537
      版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    R语言入门心得(1) -- 下载与安装
    ASP.NET中ListView用DataPager分页
    .Net平台下的扩展方法
    疑问句
    时态
    webapi put 404
    记一次阿里云ECS服务器图片资源迁移至 阿里云 oss
    javascript
    阿里云 oss 上传文件,js直传,.net 签名,回调
    redis 持久化共享 Session
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665605.html
Copyright © 2011-2022 走看看