2

我有一个模型类:

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 视图中显示的字段)?

  1. 我想到了隐藏字段,但是在查看 html 源代码时可以查看用户名并且可以对其进行操作,所以我认为它不能成为解决方案。

  2. 我已经尝试过@SessionAttribute了,我认为将模型保留在会话中是有意义的,然后 springmodelAttribute只会填充从视图接收到的属性到会话模型。但是还是一样,标题更改为先生,但用户名为空。

  3. 我阅读@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">

==================================================== ===
问题
已解决 我读到的一些链接与此问题中已接受的答案相关:

  1. springsource 文档
  2. @Christopher Yang 的 stackoverflow 解释
  3. 调试队长的博客
4

2 回答 2

0

您可以添加方法,该方法将在调用每个控制器方法之前填充对象:

@ModelAttribute("userLogin")
public UserLogin getUserLogin() {
    return UserLogin.findUserLogin(1L);
}

从提交的表单中加载更改的字段后,将覆盖旧值,并且在您的控制器中,您将刷新对象。

于 2013-05-14T16:46:35.657 回答
0

与您的问题没有直接关系,我可能会首先使用 Max 的方法,但是您可以使用 Spring Webflow 及其对话上下文来保留对象的副本:

http://static.springsource.org/spring-webflow/docs/2.0.x/reference/htmlsingle/spring-webflow-reference.html

搜索 conversationScope,他们不提供直接指向它的链接。

于 2013-05-14T17:20:33.740 回答