我有这个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();
答案 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
实用程序类。