带有<f:ajax>的JSF2.0只能运行一次</f:ajax>

时间:2011-02-15 00:18:59

标签: jsf jsf-2

我在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标签上用一个监听器尝试了这个 - 只是第一次调用监听器方法(代码中的断点来解决这个问题)。

我做错了什么?

4 个答案:

答案 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"时,它运行正常。我不知道为什么,因为我在该页面中只有一个表格,而且我的所有组件都是那种形式。

因此,我建议您检查renderexecute标签,至少在我的情况下,这是解决方案

答案 3 :(得分:0)

我遇到了同样的错误,使用Primeface's p:ajax代替f:ajax修复了错误。