Spring MVC保留未公开属性模型的值
我有一个模型课程:Spring MVC保留未公开属性模型的值,spring,spring-mvc,modelattribute,Spring,Spring Mvc,Modelattribute,我有一个模型课程: public class User{ public String title; public String username; /* setter getter here */ public String toString(){ /* output title and username */ } } 控制器: @RequestMapping("/dummy") public class DummyControlle
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>
但事实上我得到了
title:Sir, username:null
是否有办法保留DAO中未编辑的属性值(对于jspx视图中未显示的字段)?@SessionAttribute
,我认为在会话中保留模型是有意义的,然后springmodeldattribute
将只填充从视图接收到的属性到会话模型。但是它仍然是一样的,标题改为Sir,但是用户名是空的@InitBinder
并尝试dataBinder.setAllowedFields(新字符串[]{“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:
=========================================================================问题已解决
我读到的一些链接与这个问题的公认答案有关:
您可以添加方法,该方法将在调用每个控制器方法之前填充对象:
@ModelAttribute("userLogin")
public UserLogin getUserLogin() {
return UserLogin.findUserLogin(1L);
}
加载后,已提交表单中更改的字段将覆盖旧值,在控制器中,您将刷新对象。与您的问题没有直接关系,我可能会首先使用Max的方法,但您可以使用Spring Webflow及其对话上下文来保存对象的副本:
搜索conversationScope,他们不提供直接指向它的链接。请显示第二个解决方案的代码。感谢您的回复,我已经更新了问题谢谢!只是别忘了确保在modelAttribute参数之后有BindingResult,否则它就不起作用(CMIIW)。我将更新这个问题,添加一些链接,这些链接可能有助于在方法上调用这个名为modeldattribute的属性。
@ModelAttribute("userLogin")
public UserLogin getUserLogin() {
return UserLogin.findUserLogin(1L);
}