2012-09-18 130 views
0

這可能是一個非常簡單的錯誤。請幫忙。 我有兩個<form:form>一個標籤頁針對home.jsp:Java - 兩個不同的@ModelAttribute在同一個視圖上佔用相同的值

<%@ 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> 

每個表單由不同的控制器處理。問題是,當我填寫(只)的一種形式,並點擊提交按鈕,無論是ModelAttribute s的越來越具有相同值

居住沒有什麼特別的我的控制器:

@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="[email protected]"/> 

     <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="[email protected]"/> 

     <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> 
+0

它看起來像一個錯誤,但我希望看得更遠。你可以發佈這個JSP生成的HTML嗎? –

+0

@subirkumarsao我已經用HTML更新了這個問題。在此先感謝 – th3an0maly

回答

2

春天綁定參數到兩個車型,因爲它不綁定(和BTW考慮的型號名稱也沒有相關信息請求中的型號名稱)

每個表單由不同的控制器處理。

但這種方法處理兩者?

@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

+0

我不明白你的意思是「它不考慮綁定的模型名稱」和「沒有關於..的信息」。我已經提供了'ModelMap模型'作爲'login()'的參數' 第二個問題:不,還有另一種稱爲'SignUp()'的方法來處理註冊表單。最初,每個方法只有一個(相關)'@ ModelAttribute'。我修改了'login()'以包含'signUpUser'來證明'signUpUser'和'user'在它們的字段中具有相同的值。 – th3an0maly

+2

春天無法區分singup表單和登錄表單,因爲它們都是類型用戶。提交表單時,模型屬性名稱不是請求主體的一部分。因此,是否將其視爲登錄模式或註冊模式取決於您。春天不會照顧這個。 –

+0

有沒有辦法像'path =「loginUser.name」'這樣Spring知道它正在處理哪個'@ ModelAttribute'? 請參考第二個答案在這個崗位:http://stackoverflow.com/questions/12230216/how-to-update-two-entities-model-elements-from-one-jsp-in-spring-mvc – th3an0maly

相關問題