2011-12-27 13 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.userTypeuserDetailsCmd.userType)jsp?どちらも同じ属性名(userType)を持つので、 はこれですか?

EDIT: 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... 
} 

とユーザークラス(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のユーザはコマンドオブジェクトではないので、 'userDetailsCmd.userType'だけが' user.userType'ではなく変更されると予想していました。 'user.userType'は、このjspに入る前の値を含んでいなければなりません。 –

+0

さて、ユーザーにモデル属性を作ってはいけません。 changeUserDetailsメソッドの引数からそれを削除します。 –

答えて

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

あなたのコントローラにこれを追加し、 UserオブジェクトのuserTypeフィールドにはデータが入力されません。

関連する問題