如何在动作侦听器中更新EditableValueHolder的值?

时间:2015-03-16 12:44:38

标签: jsf jsf-2

我有这个JSF(Java EE 7,由GlassFish 4.1 + PrimeFaces 5.1提供)表单,其中包含主机名,端口号等数据库连接信息。此表单的一部分是URL字段。我希望这个字段可以编辑,但我也希望能够根据其他字段设置值。

为此,我创建了一个带有动作监听器的按钮,我在其中阅读request parameter map中发布的数据并生成新的URL值。然后我想将新值放在URL字段中并使用该值而不是发布的数据。我尝试的是将组件设为EditableValueHolder并设置提交的值render the response。我还尝试设置组件的值并调用resetValue

最好的结果是两次点击后网址字段即更新。

XHTML:

<p:inputText id="url"
             size="50"
             value="#{database.url}"/>
<p:commandButton icon="ui-icon-arrowrefresh-1-w"
                 immediate="true"
                 actionListener="#{database.createConnectionURL('namingContainer')}">
  <p:ajax update="url" />
</p:commandButton>

Bean(使用OmniFaces):

UIComponent urlComponent = Faces.getViewRoot().findComponent(namingContainer + "url");
if (urlComponent instanceof EditableValueHolder) {
  EditableValueHolder editValHolder = (EditableValueHolder) urlComponent;
  editValHolder.setSubmittedValue(urlValue);
}
Faces.getContext().renderResponse();

1 个答案:

答案 0 :(得分:1)

immediate="true"是JSF 1.x的剩余部分,当时无法仅处理一组特定的输入和/或按钮。然后,经常滥用它来处理一组特定的输入和/或按钮,而不是prioritize validation。当你手上有JSF2 ajax时,最好不要使用它。

使用JSF2 ajax,你可以使用execute="..."或者在PrimeFaces process="..."的情况下只执行/处理一组特定的输入/按钮。

<p:inputText id="url"
             size="50"
             value="#{database.url}" />
<p:commandButton icon="ui-icon-arrowrefresh-1-w"
                 process="@this"
                 action="#{database.createConnectionURL('namingContainer')}" 
                 update="url" />

然后您可以更新模型值。

public void createConnectionURL(String namingContainer) {
    // ...
    url = urlValue;
}

请注意,我已将<p:ajax update>移回<p:commandButton>。也许你正在与<h:commandButton>混合。

另见:


无关具体问题,要使用OmniFaces处理组件,最好使用Components实用程序类。