【问题标题】:How to fix erasing fields when navigating between forms?在表单之间导航时如何修复擦除字段?
【发布时间】:2014-03-04 01:20:16
【问题描述】:

当我尝试在表单之间导航时,我无法弄清楚为什么我的 User 类的字段值消失了。

@Controller
public class WizardController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String userForm(@ModelAttribute("user") User user) {
        return "form/userForm";
    }
    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String processedForm(@ModelAttribute("user") User user, BindingResult result,
                                ModelMap model) {
        if (result.hasErrors()) {
            return "form/userForm";
        }
        ArrayList<String> p = new ArrayList<String>();
        p.add("add_user");
        p.add("delete_user");
        model.addAttribute("permissions", p);
        model.addAttribute("user", user);
        return "form/permissionForm";
    }

    @RequestMapping(value = "/show", method = RequestMethod.POST)
    public String show(@ModelAttribute("user") User user, BindingResult result) {
        if (result.hasErrors()) {
            System.out.println("Error");
            return "show";
        } else {
            System.out.println(user);
            return "show";
        }
    }
}

我的permissionForm.jsp

<form:form action="/show" method="post" modelAttribute="user">
    <form:errors path="*" cssClass="errorblock" element="div"/>
    <p>
        <form:select path="permissions">
            <form:options items="${permissions}"/>
        </form:select>
    </p>
    <p><input type="submit" value="Add"/></p>
</form:form>

userForm.jsp

<form:form action="/user" method="post" modelAttribute="user">
    <form:errors path="*" cssClass="errorblock" element="div"/>
    <p><form:input path="name" placeholder="Name"/></p>
    <p><form:input path="age" placeholder="Age"/></p>
    <p><form:input path="email" placeholder="Email"/></p>
    <p><form:input path="password" placeholder="Password"/></p>
    <p><input type="submit"></p>
</form:form>

在 show.jsp 上我正在渲染我的用户

${user}

还有 POJO 类

public class User implements Serializable {
    private String name;
    private String email;
    private String password;
    private Integer age;
    private List<String> permissions;
    // getters, setters, toString
}

输出:用户{name='null', email='null', password='null', age=null, permissions=[delete_user]}。我需要一个完整的对象,像这样:

用户{name='John', email='john@gmail.com', password='12345', age=21, permissions=[delete_user]}。

感谢您的帮助。

【问题讨论】:

标签: java spring spring-mvc


【解决方案1】:

因为在 permissionForm.jsp 中,表单只有权限字段的输入,因此在提交时,它会传递一个仅填充权限字段的用户对象,其余的将为空。 如果您需要在其余字段中包含值,请添加如下隐藏输入:

<form:form action="/show" method="post" modelAttribute="user">
   <form:errors path="*" cssClass="errorblock" element="div"/>
   <p>
       <form:select path="permissions">
           <form:options items="${permissions}"/>
       </form:select>
       <form:hidden path="name"/>
       <form:hidden path="age"/>
       <form:hidden path="email"/>
   </p>
   <p><input type="submit" value="Add"/></p>
</form:form>

但是,对于密码字段,我不建议在 JSP 中添加隐藏字段,因为它会将密码暴露给任何可以阅读 html 源代码的人。

另一个更好的解决方案是使用会话,通过在表单之间的会话中存储和修改用户,在第一次提交时首先存储用户:

@RequestMapping(value = "/user", method = RequestMethod.POST)
public String processedForm(@ModelAttribute("user") User user, BindingResult result,
                            ModelMap model,HttpSession session) {
    if (result.hasErrors()) {
        return "form/userForm";
    }
    session.setAttribute("user",user);
    ArrayList<String> p = new ArrayList<String>();
    p.add("add_user");
    p.add("delete_user");
    model.addAttribute("permissions", p);
    model.addAttribute("user", user);
    return "form/permissionForm";
}
@RequestMapping(value = "/show", method = RequestMethod.POST)
public String show(@ModelAttribute("user") User user, BindingResult result,HttpSession session) {
    User userInSession = (User)session.getAttribute("user");
    userInSession.setPermissions(user.getPermissions());

    if (result.hasErrors()) {
        System.out.println("Error");
        return "show";
    } else {
        System.out.println(userInSession);
        return "show";
    }
}

【讨论】:

  • 是的。它很好的解决方案。谢谢。但是没有“隐藏参数”还有其他解决方案吗?
  • 是的,在第一次提交表单时,您可以将用户对象存储在会话中,然后在其他提交中,您可以使用提交表单获得的新值修改会话中的用户.
  • 我将它添加到分析器中
  • 好的。感谢您的帮助。
  • 如果你想在会话中存储一个 bean 的数据,你不需要回退到HttpSession。查看@SessionAttributes,以及Session ScopeCustom Scope beans。
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多