2

@ConversationScoped Beanから値を表示およびインクリメントする、JSF-Compnentsを使用して短いページを作成します。このページは会話を終了することができ、古い会話を終了した後に新しいBeanを取得しています。これがどのように見えるかです:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
    <h:form>
      <h:outputText id="i" value="#{test.i}" />
      <h:commandButton value="increment" 
         actionListener="#{test.increment}" 
         update="i cid" />
      <h:outputText id="cid" 
         value="#{javax.enterprise.context.conversation.id}" />
      <h:commandButton value="end"
         actionListener="#{test.endConversation}"
         update="i cid" />
    </h:form>
</h:body>
</html>

Beanのコードは非常に単純です。

package de.burghard.britzke.test.beans;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@ConversationScoped
public class Test implements Serializable {

   @Inject Conversation conversation;
   private int i;

   @PostConstruct
   public void init() { 
      conversation.begin(); 
      System.out.println("init conversation"+conversation.getId());
   }

   public int getI() {   return i; }
   public void setI(int i) { this.i = i; }

   public void increment() { i++;System.out.println(i); }

   public void endConversation() {
      System.out.println("ending conversation "+conversation.getId());
      conversation.end();
   }
}

標準のh:commandButtonコンポーネントを使用すると、すべてがうまく機能します。ただし、Primefacesコンポーネントのp:commandButtonを使用すると、cid-Parameterがサーバーに渡されないため、「インクリメント」ボタンをクリックするたびに新しいBeanインスタンスが取得されます。これは素顔の問題ではないと言われています。しかし、なぜそれがprimefacesのコンポーネントではなく、標準のコンポーネントで機能するのでしょうか。f:paramコンポーネントをcommandButtonコンポーネントに明示的に埋め込むことで、cid-Parameterを渡すことができましたが、会話を破棄した後、パラメーターは値なしで送信され、エラーが発生します。ただし、 f:paramコンポーネントがなくても機能するはずです。

PrimefacesおよびConversationスコープのBeanを(明示的にcid-Parameterを渡さずに)操作する方法の短いチュートリアルはありますか?

4

2 に答える 2

0

会話が終了した場合の問題はf:param、パラメータに無効な値(null)を指定してパラメータを渡してはならないことcidです。したがって、次のコードでこれを修正するとうまくいきました。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
    <h:form id="form">
        <h:outputText value="#{test.i}" />
        <p:commandButton value="increment"
            actionListener="#{test.increment}"
            update="@parent">
            <f:param 
                name="#{not empty javax.enterprise.context.conversation.id?'cid':''}"
                value="#{javax.enterprise.context.conversation.id}" />
        </p:commandButton>
        <h:outputText
            value="#{javax.enterprise.context.conversation.id}" />
        <p:commandButton value="end" actionListener="#{test.endConversation}"
            update="@parent">
            <f:param name="cid" value="#{javax.enterprise.context.conversation.id}" />
        </p:commandButton>
    </h:form>
</h:body>
</html>

しかし、私は、ページプログラマーが明示的にを渡す必要なしに、primefacesコンポーネントが会話処理を実行することを望んでいますf:param。これらは、標準のJSF(MyFaces)コンポーネントと同じように動作する必要があります。

于 2012-07-29T12:22:52.180 に答える
0

<h:commandButton>との大きな違いの 1 つ<p:commandButton>は、PrimeFaces の種類がデフォルトで AJAX を使用することです。ビューを更新するためにのupdateパラメーターを微調整してきたので、これをある程度知っているようです。<p:commandbutton>

<f:ajax>それを念頭に置いて、通常の で自分自身を使用した場合、同じ問題が発生すると思います<h:commandButton>。これは、特に PrimeFaces の問題ではないことを示しています。

実際の問題については、はっきりとは言えませんが、セッションを確立する同じリクエストで会話を開始する際に問題が発生しました。これをテストするには、このテスト ページにリンクしている別のページから開始するか、メソッドの代わりにこれをメソッド@PostConstructの先頭に配置します。increment()

if (conversation.isTransient()) {
    conversation.begin();
}

これで問題が解決しないことはわかっていますが、回避するのに十分な情報が得られる可能性があります。

于 2012-07-30T18:06:17.010 に答える