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)を持つので、 はこれですか?
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...
}
私は実際に試しましたが、あなたが何を意味するのか分かりませんでした。期待される行動とは何ですか?観察した行動は何ですか? – Ralph
@Ralph:ChangeUserDetails.jspでフィールド** userType **の値を選択すると理想的には(私によると)コマンドオブジェクト** userDetailsCmd **の値が(userDetailsCmd.userType'として)変更されるだけです。しかし、問題は、 '
さて、ユーザーにモデル属性を作ってはいけません。 changeUserDetailsメソッドの引数からそれを削除します。 –