【问题标题】:Java - Two different @ModelAttribute on the same view takes up same valuesJava - 同一视图上的两个不同 @ModelAttribute 占用相同的值
【发布时间】:2012-09-18 05:03:12
【问题描述】:

这可能是某个地方的一个非常简单的错误。请帮忙。 我有一个带有两个 <form:form> 标签的 home.jsp 页面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib uri="/META-INF/c.tld" prefix="c"%>
<%@ taglib uri="/META-INF/fmt.tld" prefix="fmt"%>
<%@ taglib uri="/META-INF/spring-form.tld" prefix="form"%>

<html>

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

<head>
    <title>Home Page</title>
</head>

<body>

<div>
    <form:form name="loginForm" modelAttribute="loginUser" action="login" method="post">

        <c:if test="${loginMsg != null}"><c:out value="${loginMsg}"></c:out></c:if>
        <br/>

        Email: <form:input name="loginEmail" id="loginEmail" value=""   path="email"/>
        <form:errors path="email" cssClass="error" />
        <br/>

        password: <form:password name="loginPassword" Id="loginPassword" value="" path="password" />
        <form:errors path="password" />
        <br/>

        <input type="submit" id="id_login" value="Login">

    </form:form>
</div>

<div>
    <form:form name="SignUpForm" modelAttribute="signUpUser" action="signup" method="post">

        <c:if test="${signupMsg != null}"><c:out value="${signupMsg}"></c:out></c:if>   
        <br/>

        Full Name: <form:input name="name" id="name" value=""   path="name"/>
        <form:errors path="name" cssClass="error" />
        <br/>

        Email: <form:input name="signupEmail" id="signupEmail" value="" path="email"/>
        <form:errors path="email" cssClass="error" />
        <br/>

        password: <form:password name="signUpPassword" Id="signUpPassword" value="" path="password" />
        <form:errors path="password" />
        <br/>

        <input type="submit" id="id_signUp" value="Sign Up">

    </form:form>
</div>

</body>

</html>

每个表单都由不同的控制器处理。问题是,当我(仅)填写其中一个表单并单击提交按钮时,ModelAttributes 都将填充相同的值

我的控制器没有什么特别之处:

@RequestMapping("/login")
public String login(@ModelAttribute("loginUser") User user,
        BindingResult result, @ModelAttribute("signUpUser") User signUpUser,
        BindingResult signUpResult, ModelMap model, HttpServletRequest request,
        HttpServletResponse response) {

    // Here, both user and signUpUser have the same value (WHY?)
    // But I dint fill the sign up form at all

    loginFormValidator.validate(user, result);

    if(Errors in `result`)
        return "forward:/home";

    // Authentication Logic
    request.getSession().setAttribute("s_user_obj", some_variable);
    return "forward:/home";

}

更新:

这是生成的 HTML。 在login 行动之前:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

<head>
    <title>Welcome to m0m0</title>
</head>

<body>

<div>
    <form id="loginUser" name="loginForm" action="login" method="post">

        <br/>                           
        Email: <input id="loginEmail" name="email" name="loginEmail" type="text" value=""/>

        <br/>
        password: <input id="password" name="password" name="loginPassword" Id="loginPassword" type="password" value=""/>

        <br/>
        <input type="submit" id="id_login" value="Login">

    </form>
</div>

<div>
    <form id="signUpUser" name="SignUpForm" action="signup" method="post">

        <br/>
        Full Name: <input id="name" name="name" name="name" type="text" value=""/>

        <br/>                   
        Email: <input id="signupEmail" name="email" name="signupEmail" type="text" value=""/>

        <br/>
        password: <input id="password" name="password" name="signUpPassword" Id="signUpPassword" type="password" value=""/>

        <br/>
        <input type="submit" id="id_signUp" value="Sign Up">

    </form>
</div>

</body>

</html>

login 之后的操作:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

<head>
    <title>Welcome to m0m0</title>
</head>

<body>

<div>
    <form id="loginUser" name="loginForm" action="login" method="post">

        <br/>                           
        Email: <input id="loginEmail" name="email" name="loginEmail" type="text" value="a@b.com"/>

        <br/>
        password: <input id="password" name="password" name="loginPassword" Id="loginPassword" type="password" value=""/>

        <br/>
        <input type="submit" id="id_login" value="Login">

    </form>
</div>

<div>
    <form id="signUpUser" name="SignUpForm" action="signup" method="post">

        <br/>
        Full Name: <input id="name" name="name" name="name" type="text" value=""/>

        <br/>                   
        Email: <input id="signupEmail" name="email" name="signupEmail" type="text" value="a@b.com"/>

        <br/>
        password: <input id="password" name="password" name="signUpPassword" Id="signUpPassword" type="password" value=""/>

        <br/>
        <input type="submit" id="id_signUp" value="Sign Up">

    </form>
</div>

</body>

</html>

【问题讨论】:

  • 它看起来像一个错误,但我想进一步了解。您能否发布从该 JSP 生成的 HTML。
  • @subirkumarsao 我已经用 HTML 更新了这个问题。提前致谢

标签: java spring jsp modelattribute


【解决方案1】:

spring 将参数绑定到两个模型,因为它不考虑绑定模型名称(顺便说一句,请求中没有关于模型名称的信息)

每个表单都由不同的控制器处理。

但是这个方法可以同时处理这两种情况吗?

@RequestMapping("/login")
public String login(@ModelAttribute("loginUser") User user,
    BindingResult result, @ModelAttribute("signUpUser") User signUpUser,
    BindingResult signUpResult, ModelMap model, HttpServletRequest request,
    HttpServletResponse response) {

// Here, both user and signUpUser have the same value (WHY?)
// But I dint fill the sign up form at all

loginFormValidator.validate(user, result);

if(Errors in `result`)
    return "forward:/home";

// Authentication Logic
request.getSession().setAttribute("s_user_obj", some_variable);
return "forward:/home";

}

编辑:

public class Form {
    private User loginUser;
    private User signupUser;
    .....
}

那么您可以执行以下操作

<form:input path="loginUser.name" />

<form:input path="signupUser.name" />

在这种情况下,您将只有 1 个模型属性,而不是 2 个

【讨论】:

  • 我不明白您所说的“它不考虑绑定的模型名称”和“没有关于 .. 的信息”我已将 ModelMap model 作为参数提供给 login()对于您的第二个问题:不,还有另一种称为SignUp() 的方法来处理注册表单。最初,每种方法只有一个(相关的)@ModelAttribute。我已修改 login() 以包含 signUpUser 以证明 signUpUseruser 在其字段中具有相同的值。
  • spring 无法区分登录表单和登录表单,因为两者都是用户类型。提交表单时,模型属性名称不是请求正文的一部分。因此,是否将其视为登录模型或注册模型取决于您。 spring 不会解决这个问题。
  • 有没有办法我可以做类似path="loginUser.name" 的事情,以便Spring 知道它正在处理哪个@ModelAttribute?请参考本帖第二个答案:stackoverflow.com/questions/12230216/…
  • 创建 2 个 form:form 元素(就像在你的帖子中一样),首先你可以使用路径前缀“loginUser”。在第二个“signupUser”中。
猜你喜欢
  • 2020-05-17
  • 2016-08-17
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2018-04-22
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多