数据回显
- 对
pojo
数据回显的支持 ,springMvc
会默认的将传进来的pojo
保存到request
域里面,key
是pojo
类的名字首字母小写,简短类名而非全限定名; - 也可以使用
model
将传进来的pojo
,传到页面 - 使用注解,指定传到页面的参数的名字,
@ModelAttribute
不过需要注意的是,不要使用重定向,使用转发。否则将是新的请求的 request
,导致数据回显失败;
@ModelAttribute
&& @SessionAttributes
注解
这两个注解的知识,转载于 https://blog.csdn.net/xiejx618/article/details/43638537
先看一个没有使用 @ModelAttribute
的 Controller
方法.
@RequestMapping("/save")
public String save(User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}
其中 User
包含 id
和 username
两个私有属性,含有公共 setter
和 getter
方法.
执行此方法时会将 key
为 “user
” (注意:这里即使参数名称是 user1
,key
一样还是 "user"
),value
为 user
的对象加入到 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
的基本用法.
-
在方法上使用
@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")
引起的). -
在方法参数上使用
@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
没有区别. -
再来看看在方法和方法参数上结合使用
@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
类型对象. -
另类:
@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
的用法.
-
先看看这段代码
@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
进去的值.当移除上面的注解,因为属性为test
的session
也被清除了,所以test2
方法会得到是null
. -
再看结合
@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
,那么此方法会确保属性test
的session
会存在,否则会抛org.springframework.web.HttpSessionRequiredException
异常,即上面代码先不调/user/test1
,直接调/user/test2
就会抛此异常我个人很少这样用,用原始的写法就清晰很多了,但要看明白别人写的代码。
作者:xiejx618
来源:CSDN
原文:https://blog.csdn.net/xiejx618/article/details/43638537
版权声明:本文为博主原创文章,转载请附上博文链接!