我在JSF2.0中遇到了标签问题,我希望有人可以指出我做错了什么。以下是我在UI中的内容:
<h:panelGroup>
<h:form id="theForm">
<h:selectOneMenu id="theMenu" value="#{viewBean.selectedItem}">
<f:ajax event="change" render="selectedItemText"/>
<f:selectItem itemLabel=""/>
<f:selectItems value="#{viewBean.selectableItems}"/>
</h:selectOneMenu>
<h:outputText id="selectedItemText" value="#{viewBean.selectedItemText}" />
</h:form>
</h:panelGroup>
这很有效 - 我的会话范围的支持bean有一个方法setSelectedItem
,它被调用,它在我第一次从菜单中选择一个不同的项目时做了它的事情;输出文本在前端更新,我很高兴。但是,对菜单选择的进一步更改不会通过ajax触发对setter的调用。我也在f:ajax
标签上用一个监听器尝试了这个 - 只是第一次调用监听器方法(代码中的断点来解决这个问题)。
我做错了什么?
答案 0 :(得分:4)
我有类似的问题。
下面我的第二个commandButton只能在下面的JSF视图中运行一次,它有一个视图参数。将<f:param>
添加到我的第一个commandButton解决了这个问题。这是BalusC very helpful discussion未涵盖的情况。
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view>
<f:metadata>
<f:viewParam name="id" value="#{fooManager.millis}" required="true"/>
</f:metadata>
<h:head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</h:head>
<h:body>
<h:form id="fooForm">
<h:commandButton
id="barBbutton"
value="foo:test"
action="#{fooManager.test}">
<f:param name="id" value="1"/>
<f:ajax render="fooMillis1"/>
</h:commandButton>
<p>
<h:outputText id="fooMillis1" value="foo:display1: #{fooManager.millis}"/>
</p>
<p>
<h:outputText id="fooMillis2" value="foo:display2: #{fooManager.millis}"/>
</p>
</h:form>
<h:form id="barForm">
<h:commandButton
id="barButton"
value="bar:test"
action="#{barManager.test}">
<f:ajax render="barMillis1"/>
</h:commandButton>
<p>
<h:outputText id="barMillis1" value="bar:display1: #{barManager.millis}"/>
</p>
<p>
<h:outputText id="barMillis2" value="bar:display2: #{barManager.millis}"/>
</p>
</h:form>
</h:body>
</f:view>
</html>
我的FooManager和BarManager看起来一样:
@ManagedBean
@ViewScoped
public class FooManager {
public long getMillis() {
return millis;
}
public void setMillis(long millis) {
this.millis = millis;
}
public void test() {
setMillis(System.currentTimeMillis());
}
private long millis;
}
当它不工作时,我的Weblogic / Mojarra库没有提供任何有用的提示。任何地方都没有错误。经过无数次尝试后,我想出了一个像上面第一个工作按钮一样的工作按钮。
答案 1 :(得分:3)
我有同样的问题。 对于下面的代码,ajax只运行一次。
<h:inputText id="element_id" value="#{viewBean.someValue}"></h:inputText>
<h:commandLink action="#{viewBean.someAction}" value="click me">
<f:ajax render=":my_form:another_element" execute="element_id> </f:ajax>
</h:commandLink>
当我向render属性添加我正在执行的元素时,每次都会触发ajax。
<h:inputText id="element_id" value="#{viewBean.someValue}"></h:inputText>
<h:commandLink action="#{viewBean.someAction}" value="click me">
<f:ajax render=":my_form:another_element element_id" execute="element_id> </f:ajax>
</h:commandLink>
答案 2 :(得分:1)
我有一个类似的问题,在我的情况下,在所有浏览器中都工作得很好,除了在IE9中ajax只被触发一次。
我正在使用render="@form"
,当我将其更改为render="@all"
时,它运行正常。我不知道为什么,因为我在该页面中只有一个表格,而且我的所有组件都是那种形式。
因此,我建议您检查render
和execute
标签,至少在我的情况下,这是解决方案
答案 3 :(得分:0)
我遇到了同样的错误,使用Primeface's
p:ajax
代替f:ajax
修复了错误。