【问题标题】:Updating JSF Model is not working更新 JSF 模型不起作用
【发布时间】: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


【解决方案1】:

UserFacadeImpl.updateUser() 应该将更新后的用户对象传回给控制器:

@Named
@ViewScoped
public class UserCabinetController {

  public void updateUser() {
    System.out.println(user);
    user = userFacade.updateUser(user);
  }
}

@ApplicationScoped
public class UserFacadeImpl implements UserFacade, Serializable {

public User updateUser(User user) {
        user = em.merge(user);
        return user;
    }
}

【讨论】:

  • 其实。它没有用。问题是在控制器中,在更新实例 System.out.println(user); 之前给出相同的值。似乎视图和控制器有问题,新值没有传递给控制器​​。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2021-01-28
  • 2021-01-25
相关资源
最近更新 更多