【发布时间】:2017-05-09 17:17:14
【问题描述】:
我有以下几点:
查看:
<h:form class="form-signin">
<h:inputText id="name" name="name" value="#{userCabinetController.user.name}" required="true" requiredMessage="Поле имя не заполнено" class="form-control" type="name"/>
<h:inputText id="email" name="email" value="#{userCabinetController.user.email}" required="true" requiredMessage="Введите логин (email)" class="form-control" type="email"/>
<h:inputSecret id="password" name="password" value="#{userCabinetController.user.password}" required="true" requiredMessage="Введите пароль" class="form-control" type="password"/>
<h:commandButton action="#{userCabinetController.updateUser}" value="Изменить данные" class="btn btn-lg btn-primary btn-block"/>
</h:form>
控制器:
@Named
@ViewScoped
public class UserCabinetController {
@PostConstruct
public void init() {
/**
* get user instance for further updating
*/
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
User userFromSession = (User) sessionMap.get("user");
int userId = userFromSession.getId();
user = userFacade.finById(userId);
}
private User user;
@Inject
UserFacade userFacade;
public void updateUser() {
System.out.println(user);
userFacade.updateUser(user);
}
// getters/setters
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
和立面:
@ApplicationScoped
public class UserFacadeImpl implements UserFacade, Serializable{
@PersistenceContext
private EntityManager em;
@Transactional
public void updateUser(User user) {
em.merge(user);
}
}
但是当我尝试更新用户实例时,它给出了相同的实例,即旧实例没有给出新值。
如何更新用户实例?怎么了?
【问题讨论】:
-
如果你不使用ajax,请求范围对于控制器来说足够了。登录init方法看看。它是否创建了一个新的控制器实例? (您从 RequestScoped 注释中导入哪个包?)
-
你使用的jsf是什么版本的?有关 Viewscoped 的版本问题,请参阅 incepttechnologies.blogspot.in/2013/05/…
标签: jsf jakarta-ee