1

私はjavaeeプログラミングの経験があまりなく、誰も質問することがないので、お願いしたいと思います。私のコードには、気に入らないことが1つあり、間違った方法で実装されていると思います。私のマネージドBeanはリクエストスコープです。jsfでは、リストからデータを取得するrich:pickListを使用します。

@Scope("request")
public class MyBean{
     private List<String> sourceList;
     ....     

     public List<String> getsourceList() {
            //if (sourceList == null)    <--- Has no sence in request scoped bean
             { sourceList = service.loadList();
             }
             return sourceList;
     }

....

}

いくつかのデータを保存する送信ボタンもあります。

問題は、ページが何らかのアクション(送信ボタンのクリックなど)を実行するたびに、このgetメソッドが毎回呼び出され、サービスレイヤー、次にdao、データベースに移動することです。それは明らかに正しい解決策ではないようです。それを回避する方法は?答えてくれてありがとう。

4

4 に答える 4

0

JSF 2.0を使用している場合は、によって新しいビュースコープを使用できます@ViewScoped

@ManagedBean
@ViewScoped
public class Bean {

    private List<Foo> foos;

    @EJB
    private FooService fooService;

    @PostConstruct
    public void init() {
        foos = fooService.list();
    }

    public List<Foo> getFoos() {
        return foos;
    }

}

まだJSF1.xを使用している場合は、RichFaces<a4j:keepAlive>Tomahawk<t:saveState>が、上記のコード設計でリクエストスコープのBeanにまったく同じ影響を与えることを知っておくとよいでしょう(つまり、ゲッターにデータをロードしないでください)。

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

<t:saveState beanName="#{bean}" />

新しいRichFacesの@KeepAliveアノテーションは使用していませんが、ドキュメントに関しては、同じように動作するはずです。

于 2011-04-29T12:23:05.850 に答える
0

「会話」の範囲がないため、誰もがこの問題を抱えています。「セッション」(ユーザーがログインしている限り)と「要求」(1つの要求/応答サイクル)があります。

必要なのは、「ユーザーが会話を開始した」と言ってから、会話に属するいくつかのリクエストを実行し、最後にそれをまとめる方法です。

これはJavaEEでサポートされていないため、エミュレートする必要があります。ユーザーが会話を開始したら、Beanをセッションスコープに入れて、そこに保持します。ユーザーが会話を終了したら、Beanを手動で削除するか、キャッシュをクリーンアップするように指示します。

于 2011-04-29T07:53:11.480 に答える
0

Spring WebFlowには、実際には「会話スコープ」があります。

http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch12s06.html

于 2011-04-29T11:40:59.467 に答える
0

Springがリクエストスコープとセッションスコープを追加できるように、web.xmlにSpringRequestContextListenerを追加します。

<listener>
     <listener-class>
          org.springframework.web.context.request.RequestContextListener
     </listener-class>  
</listener>

Cf:3.4.4。他のスコープ

于 2011-05-18T14:19:18.827 に答える