【问题标题】:Why input (for example h:inputText) nested in h:dataTable do not update Bean model? [duplicate]为什么嵌套在 h:dataTable 中的输入(例如 h:inputText)不更新 Bean 模型? [复制]
【发布时间】:2011-06-05 10:52:56
【问题描述】:

我有 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>
....

以及具有 ArrayList of Strings 的托管 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"/>

一切都变好了。

问题: 为什么 1 级 getter &lt;h:inputText value="#{preferredMusicGenre}"/&gt; 使用不正确,而 2 级 getter 使用:&lt;h:inputText value="#{preferredMusicGenrePojo.text}"/&gt; 可以?

【问题讨论】:

    标签: java jsf datatable jsf-2


    【解决方案1】:

    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>
    

    【讨论】:

    • 感谢您的回答。现在这种情况对我来说很清楚,但实际上是简化的情况。原始案例是 POJO 对象。 JSF 是:"" 它是带有自定义转换器的转换器。你能帮我处理这个案子吗?
    • 这也没有意义。按照我的答案中的示例进行修复。
    • 是的。但是如果我正在使用 JPA 模型并且不想包装它的实体。或者这是不好的做法 - 在 JSF Backing Bean 中结合 JPA 模型?
    • 不,这很正常。但是 JPA 模型又具有字段/属性,对吗?您需要通过输入元素单独获取/设置它们,而不是在某些转换器的帮助下通过单个输入元素来获取/设置整个模型。
    • 非常感谢。你拯救了这一天。
    猜你喜欢
    • 2014-02-09
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多