почему значение атрибута ModelMap меняется в JSP? - PullRequest
1 голос
/ 27 декабря 2011

У меня есть контроллер, указанный ниже:

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

<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 ( 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...

   }

1 Ответ

0 голосов
/ 03 июля 2013
@InitBinder("user")
public void userBinding(DataBinder binder) {
    binder.setDisallowedFields("userType");
}

Добавьте это к своему контроллеру, и поле userType объекта User не будет заполнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...