【问题标题】:JSF Bean property not updated [duplicate]JSF Bean 属性未更新 [重复]
【发布时间】:2011-08-27 22:02:16
【问题描述】:

我有一个带有名为“名称”的字段的 bean,以及一个 JSF 表单,该表单的 inputText 映射到该字段。该字段的初始值很好地显示在表单上。

问题是当我提交表单时,值没有随着 inputText 的内容更新。在下面的 savePlayer() 方法中,name 的值始终是“name”,而不是我在表单输入中键入的值。

豆子:

@Named
@RequestScoped
public class PlayerForm {

    @Inject
    private PlayerRepository playerRepository;

    private String name = "name";


    public String savePlayer(){
        Player player = new Player();
        player.setName(name);
        playerRepository.savePlayer(player);
        return "saveUserOk";
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

形式:

   <h:form>
        <h:inputText value="#{playerForm.name}" />
        <h:commandButton value="Submit" action="#{playerForm.savePlayer}" />
    </h:form>

非常感谢您的帮助!

【问题讨论】:

    标签: java jsf cdi


    【解决方案1】:

    如果您从包 javax.faces.bean (JSF) 而不是从 javax.enterprise.context (CDI) 导入 @RequestScoped,就会发生这种情况。然后,每一个 EL 表达式 #{} 都会创建一个全新且完全独立的 bean 实例。然后,给定的表单示例将在 bean 的两个实例中结束,一个设置名称,另一个调用操作。

    javax.faces.bean.RequestScoped 注释只能与 JSF 自己的 @ManagedBean 注释一起使用,不能与 CDI 的 @Named 注释一起使用。

    【讨论】:

    • 这正是我所做的^^非常感谢您的这些清晰的解释:)
    • 不客气。顺便说一句,如果您使用来自 JSF 的 @ManagedBean 和来自 CDI(或任何其他范围)的 @RequestScoped,症状是相同的。同样在这里,bean 在默认的“none”范围内结束,每个 EL 表达式 #{} 都有自己的实例。
    • BalusC,你很快就会成为我在互联网上的 JSF 编程最好的朋友。 @Named bean 是否有类似 ViewScoped 的东西,还是改用 @ManagedBean 更好?
    • @BaileyS:JSF 2.2 具有与 CDI 兼容的 javax.faces.view.ViewScoped。如果您还不能升级到 JSF 2.2,请考虑使用 JSF 实用程序库 OmniFaces。从 1.6 版开始,它具有 JSF 2.0/2.1 目标 CDI 兼容 org.omnifaces.cdi.ViewScopedshowcase.omnifaces.org/cdi/ViewScoped
    • @BalusC,我正在使用 JSF 2.2 并更新了我所有的 ViewScoped 东西以使用 view.ViewScoped 注释。这个问答确实让我看到了使用错误包中的作用域的隐患。
    猜你喜欢
    • 2012-06-25
    • 2012-02-04
    • 2011-06-26
    • 2021-01-21
    • 2017-11-24
    • 2016-01-31
    • 1970-01-01
    • 2018-03-05
    • 2013-01-17
    相关资源
    最近更新 更多