当前位置: 首页 > 面试题库 >

为什么嵌套在h:dataTable中的输入(例如h:inputText)不更新Bean模型?

高云瀚
2023-03-14
问题内容

我有jsf页面:

....
<form jsfc="h:form" action="">
  <h:dataTable value="#{newMusician.strings}" var="preferredMusicGenre" id="musicGenresSelectTable">
    <h:column>
      <h:inputText value="#{preferredMusicGenre}" immediate="true"/>
     </h:column>
   </h:dataTable>
   <p>
      <input type="submit" jsfc="h:commandButton" value="Add" action="#{newMusician.saveNewMusician}"/>
   </p>
</form>
....

以及具有StringArrayList的托管bean:

@ManagedBean
@ViewScoped
public class NewMusician {

    private ArrayList<String> strings = new ArrayList<String>();

    public NewMusician() {
        strings.add("olo");
    }
    public ArrayList<String> getStrings() {
        return strings;
    }
    public void saveNewMusician() {
    .....
    }
....
}

问题:当我在其中更改文本并按保存按钮时,在saveNewMusician()方法中,我可以看到ArrayList“字符串”包含相同的旧值“
olo”,但是我没有在输入字段中插入那个值。如果使用h:selecOneMenu,则会出现相同的问题。

如果不使用字符串,而是将字符串聚合并将值设置为字符串的对象,则情况会发生变化。因此,如果我要使用一些POJO并将inputText更改为:

<h:inputText value="#{preferredMusicGenrePojo.string}" immediate="true"/>

一切都OK。

问题:为什么使用1级吸气剂<h:inputText value="#{preferredMusicGenre}"/>不正确,但是使用2级吸气剂:
<h:inputText value="#{preferredMusicGenrePojo.text}"/>可以吗?


问题答案:

A String是不可变的。它没有值的二传手。您需要将其包装在bean(或称为POJO)中。

public class Musician {
    private String preferredGenre;

    // Add/generate constructor, getter, setter, etc.
}

然后按如下所示更改您的托管bean。

@ManagedBean
@ViewScoped
public class NewMusician {

    private ArrayList<Musician> musicians = new ArrayList<Musician>();

    public NewMusician() {
        musicians.add(new Musician("olo"));
    }

    public ArrayList<Musician> getMusicians() {
        return musicians;
    }

    public void saveNewMusician() {
        // ...
    }

    // ...
}

和您的数据表:

<h:dataTable value="#{newMusician.musicians}" var="musician">
    <h:column>
        <h:inputText value="#{musician.preferredGenre}" />
    </h:column>
</h:dataTable>


 类似资料:
  • 如果我尝试更新面板中的任何内容 它抛出:java.lang.IllegalArgumentException:ThreatListPanel: 这是xhtml 这是更新bean

  • 我有一个Observable类,它在字符串变化时通知observer。在观察者的update方法中,更新的字符串可以打印到控制台。但是GUI没有相应的更新。为什么?

  • 我对摩基托并不陌生,但这次我在工作中发现了一个有趣的案例。我希望你能帮我解决这件事。 我需要注入mock来改变测试过程中的某些方法行为。问题是,bean结构是嵌套的,并且这个bean在其他bean内部,不能从test方法访问。我的代码如下所示: 所以在我的测试中,我希望调用nestedDAO.method返回模拟答案。 我尝试执行一个initmocks: 还要在我的测试类上添加注释: 总是从方法获

  • 问题内容: 我似乎在使用样式语法实例化嵌套类类型的空数组时遇到问题: 这是我误会的东西吗(早在我喝咖啡之前,但我已经查看了发行说明,并且我认为您应该能够引用这样的嵌套类)或Beta 7中的错误? 这可以作为一种解决方法: 问题答案: 这肯定看起来像是编译器中的错误,尤其是 允许 您实例化嵌套类的空数组就好了。它根本不适用于初始化程序语法。 我会提出一个错误。同时,对于遇到问题的任何人,都可以通过使

  • 我是java新手,所以请不要后悔java中的对象和东西正在传递引用的值,但下面是我试图传递对象的代码。当我通过传递到函数中更新值时,a的值没有改变。发生了什么请帮助我。。。

  • 问题内容: 这是一个python新手问题: 我有以下目录结构: 其中,和是文件夹。两者和处于同一级别。 module.py有一个名为的类,我想在test_file.py中实例化它的一个实例。我该怎么办? 我试过了: 但是我得到了: 问题答案: 您想要的是相对导入,例如: 问题在于,如果您将test_file.py作为主模块调用,它将无法正常工作。如前所述这里: 请注意,显式和隐式相对导入均基于当前