2011-12-27 2 views
1

내가 컨트롤러는 아래있다 :jsp에서 ModelMap 속성의 값이 변경되는 이유는 무엇입니까?

@Controller 
@SessionAttributes("user") 
public class UserController { 

@Autowired 
AdminDaoInterface adminDao; 

@Autowired 
UserValidator userValidator; 

@RequestMapping(value="userdetails.htm",method=RequestMethod.GET) 
public String userDetails(ModelMap model) { 
    UserCommand userDetailsCmd = new UserCommand(); 
    model.addAttribute("userDetailsCmd", userDetailsCmd); 
    return "UserDetails"; // will go to UserDetails.jsp 
} 


@RequestMapping(value="userdetails.htm",method = RequestMethod.POST) 
public String userDetailsSubmit(
         @ModelAttribute("userDetailsCmd") UserCommand userDetailsCmd, 
         Errors errors, ModelMap model){ 

    //user will contains details of user found from database. 
    User user=adminDao.getUserOnId(userDetailsCmd.getUserId()); 

    if(user==null) { 
    errors.rejectValue("userId", "user.not.exists"); 
    return "UserDetails"; 
    } 

    model.addAttribute("user",user); 
    return "ChangeUserDetails"; // will go to ChangeUserDetails.jsp 
} 


@RequestMapping(value="changeuserdetails.htm",method = RequestMethod.POST) 
public String changeUserDetails(
      @ModelAttribute("userDetailsCmd") UserCommand userDetailsCmd, 
      @ModelAttribute("user") User user){ 

    // some stuff... 

    // BOTH user and userDetailsCmd OBJECTS HAVE A FIELD "userType" 
    // HERE user.userType SHOULD CONTAIN VALUE COLLECTED FROM DB (already 
     // existing value) 

    // AND userDetailsCmd.userType SHOULD CONTAIN VALUE SELECTED IN JSP IN 
    //ORDER TO UPDATE EXISTING VALUE of user.userType.     
    ... 

    //BUT WHEN I SET VALUE OF userDetailsCmd.userType IN JSP, WHY VALUE OF 
    // user.userType GOT CHANGED ALWAYS TO THAT VALUE??? 
    ... 

    // somewhere later in code i m setting user.userType to 
    //userDetailsCmd.userType to update value. 

    adminDao.updateUser(user); 
    return "ChangeUserSuccess"; 
} 

} 

ChangeUserDetails.jsp입니다 : 내가 명령 개체 userDetailsCmd의/변경 값을 설정할 때 항상 변경있어

<form:form method="post" action="changeuserdetails.htm" commandName="userDetailsCmd"> 

<table> 

<tr> 
    <td>User Id :</td> 
    <td>${user.userId}</td> 

</tr> 


<tr> 
    <td>Project :</td> 
    <td>${user.projectId} </td> 
    <td>Change To:</td> 
    <td> 
    <form:select path="projectId"> 
    <form:option value="-1" label="SELECT"/> 
    <form:options items="${projectList}" itemValue="pid"   
       itemLabel="projectName"/> 
    </form:select> 
    </td> 
    </tr> 
<tr> 
    <td>User Type :</td> 
    <td>${user.userType}</td> 
    <td>Change To:</td> 
    <td> 
    <form:select path="userType"> 
     <form:option value="not changed" label="SELECT"/> 
     <form:option value="admin" label="Admin" /> 
     <form:option value="user" label="User" /> 
    </form:select> 
    </td> 
</tr> 

<tr> 
    <td colspan="2"> 
     <input type="submit" value="Change User Details"/> 
    </td> 
</tr> 
</table> 

</form:form> 

왜 값 의 user.userType (userDetailsCmd.userType) jsp? 모두 동일한 속성 이름 (userType)을 가지고 있기 때문에 이 무엇입니까?

편집 : UserCommand 클래스 (명령 개체)입니다 :

public class UserCommand{ 

private String userId; 
private String password; 
private int projectId; 
private String userType; 
private int listUserId; 
private List usersList; 

//PLUS getters and setters for these fields... 
} 

및 사용자 클래스 (A POJO)입니다 :

public class User{ 

private String userId; 
private String password; 
private int projectId; 
private String userType; 

//PLUS getters and setters for these fields... 

    } 
+0

나는 정말로 시도했지만, 당신이 의미하는 것을 이해하지 못했습니다. 예상되는 행동은 무엇이며 관찰 한 행동은 무엇입니까? – Ralph

+0

@Ralph : ChangeUserDetails.jsp에서 필드 ** userType **에 대한 값을 선택하면 이상적으로 (나에 따라) 명령 객체 ** userDetailsCmd **의 값이 (userDetailsCmd.userType'으로) 변경되어야합니다. . 그러나 문제는'

'에서 값을 선택하면 ** user.userType **의 값도 변경된다는 것입니다. jsp의 user가 command 객체가 아니기 때문에'userDetailsCmd.userType' 만'user.userType'이 아닌'userDetailsCmd.userType' 만 변경할 것으로 예상했습니다. 'user.userType'은이 JSP로 들어가기 전에 가지고있는 값을 포함해야합니다. –

+0

글쎄, 사용자를 모델 속성으로 만들지 마라. changeUserDetails 메소드의 인수에서 제거하십시오. –

답변

0
@InitBinder("user") 
public void userBinding(DataBinder binder) { 
    binder.setDisallowedFields("userType"); 
} 

이 컨트롤러와이 추가 User 개체의 userType 필드가 채워지지 않습니다.

관련 문제