1

私は以下のコードを持っています:

<c:set var="show" value="#{cartBean.itemsAdded}" />

<c:if test="${show}">
    <h:form id="test1">
        <h:commandLink action="#{cartBean.foo}">this doesn't work</h:commandLink>           
    </h:form>
</c:if>

<h:form id="test2">
    <h:commandLink action="#{cartBean.foo}">this works!</h:commandLink>         
</h:form>

show=false の場合、2 番目のリンクのみを表示します。そして、それは機能します。サーバーにアクセスできます(これを確認するためにデバッグを使用しています)。

show=true の場合、両方のリンクが表示されます。ただし、2 番目のリンクのみが機能します。条件内のリンクは、サーバーでアクションをトリガーしません。

誰か、助けてくれませんか?

注: a4j:outputPanel render="#{show}"を使用すると同じことが起こります

4

3 に答える 3

2

フォーム送信の処理中に、JSF はコマンド ボタン/リンクがレンダリングされたかどうかを再評価します。レンダリングされていない場合は、単にアクションをスキップします。

フォームの送信が JSF によって処理されたときにも式#{cartBean.itemsAdded}が返されるようにする必要があります。簡単なテストは、Bean をセッション スコープに入れることです (そして、は純粋な getter である、つまり のみを含むtrueと仮定します)。isItemsAdded()return itemsAdded;

これで問題が解決し、Bean をリクエスト スコープに保持したい場合は、a を追加し<a4j:keepAlive>て、後続のリクエストで Bean プロパティを保持します。

<a4j:keepAlive beanName="#{cartBean}" />

以下も参照してください。


具体的な問題とは関係ありませんが、可能な限り JSTL よりも JSF タグ/属性を優先する必要があります。この特定のケースでは、両方の JSTL タグを取り除き、代わりに<c:>JSF 提供のrendered属性を使用する必要があります。

<h:form id="test1" rendered="#{cartBean.itemsAdded}">
    <h:commandLink action="#{cartBean.foo}">this doesn't work</h:commandLink>           
</h:form>
于 2011-03-17T16:17:21.450 に答える
1

回避策

巨大なシステム(私の場合)でこれを使用する危険性があるため、sessionScopeを使用したくありません。私はcluteredサーバーにいて、多くの属性がシリアル化できないため、keepAliveneighterを使用するのは好きではありません。

とにかく、私はこの回避策を見つけました:

  1. リクエストでパラメータを送信します(show = trueなど)
  2. チェック方法を変更し、代わりにORを追加して、この新しいパラメーターを表示します。

管理された豆:

前:

public boolean itemsAdded() {
    return foo; // my initial check
}

後:

public HttpServletRequest getRequest() {
        return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
}

public boolean itemsAdded() {
    return foo || getRequest().getParameter("show") != null;
}

XHTML:

前:

<c:set var="show" value="#{cartBean.itemsAdded}" />
<c:if test="${show}">
    <h:form id="test1">
        <h:commandLink action="#{cartBean.foo}">link</h:commandLink>           
    </h:form>
</c:if>

後:

<c:set var="show" value="#{cartBean.itemsAdded}" />
<c:if test="${show}">
    <h:form id="test1">
       <h:commandLink action="#{cartBean.foo}">link
          <f:param name="show" value="true"/>
       </h:commandLink> 
    </h:form>
</c:if>
于 2011-04-15T17:30:35.960 に答える
0

改善された (そして小さい) 回避策:

XHTML のみを変更:

前:

<c:if test="#{cartBean.itemsAdded}">
    <h:form id="test1">
        <h:commandLink action="#{cartBean.foo}">link</h:commandLink>           
    </h:form>
</c:if>

後:

<c:if test="#{cartBean.itemsAdded || params['show']}">
    <h:form id="test1">
       <h:commandLink action="#{cartBean.foo}">link
          <f:param name="show" value="true"/>
       </h:commandLink> 
    </h:form>
</c:if>
于 2011-04-15T17:53:38.290 に答える