我有一个模型类:
public class User{
public String title;
public String username;
/* setter getter here */
public String toString(){
/* output title and username */
}
}
控制器:
@RequestMapping("/dummy")
public class DummyController
{
private log = Logger.getLogger(this.getClass().getName());
@RequestMapping(value="binder")
public String binderInput(Model model){
UserLogin userInit=UserLogin.findUserLogin(1L);
model.addAttribute("userLogin",userInit);
return "binderInput";
}
@RequestMapping(value="binderResult")
public String binderResult(@ModelAttribute("userLogin") UserLogin userLogin,BindingResult br){
log.debug("userLogin:"+userLogin);
return "binderResult";
}
}
binderInput的视图(jspx):
<form:form action="dummy/binderResult" method="POST" modelAttribute="userLogin">
title:<form:input path="title" />
<input type="submit"/>
</form:form>
中的 DAO
UserLogin.findUserLogin(1L);
将返回标题为“先生”和用户名“史密斯”的用户。我浏览localhost:8080/myWeb/dummy
并且视图在标题字段中显示“先生”,然后我将标题更新为“先生”并提交表格。
在 binderResult 我希望看到
title:Sir, username:Smith
但实际上我得到了
title:Sir, username:null
有没有办法保留未编辑的 DAO 中的属性值(对于未在 jspx 视图中显示的字段)?
我想到了隐藏字段,但是在查看 html 源代码时可以查看用户名并且可以对其进行操作,所以我认为它不能成为解决方案。
我已经尝试过
@SessionAttribute
了,我认为将模型保留在会话中是有意义的,然后 springmodelAttribute
只会填充从视图接收到的属性到会话模型。但是还是一样,标题更改为先生,但用户名为空。我阅读
@InitBinder
并尝试
dataBinder.setAllowedFields(new String[]{"title"});
但没有帮助,它只是过滤属性而不保留其他不允许字段的值
我开始认为我必须手动执行以下操作:
@RequestMapping(value="binderResult")
public String binderResult(@ModelAttribute("userLogin") UserLogin userLogin,BindingResult br,HttpSession session){
/* after put DAO model in session in binderInput */
UserLogin userLoginSession = session.getAttribute("userLoginSession");
userLoginSession.setUsername(userLogin.getUsername());
//further process or save userLoginSession
log.debug("userLogin:"+userLoginSession);
return "dummy/binderResult";
}
有没有办法像我最初期望的那样在 Spring 中保留未编辑的属性?
谢谢你的帮助!
==================================================== ===
gouki 询问我的第二点的代码:
@RequestMapping("/dummy")
@SessionAttributes({"userSession"})
public class Dummy2Controller
{
private log = Logger.getLogger(this.getClass().getName());
@RequestMapping(value="binder")
public String binderInput(Model model,HttpSession session){
UserLogin userInit=UserLogin.findUserLogin(1L);
model.addAttribute("userSession",userInit);
return "binderInput";
}
@RequestMapping(value="binderResult")
public String binderResult(@ModelAttribute UserLogin userSession,BindingResult br,HttpSession session){
log.debug("userSession:"+userSession);
//further process or save userSession to DB
return "binderResult";
}
}
并在视图中将 modelAttribute 更改为userSession:
<form:form action="dummy/binderResult" method="POST" modelAttribute="userSession">
==================================================== ===
问题
已解决
我读到的一些链接与此问题中已接受的答案相关: