2

サーバー側からいくつかの JavaScript を実行するために、マネージ Bean メソッドで RequestContext の primeFaces オブジェクトを使用しました。以前は Listener ハンドラー メソッド (f:ajaxタグからのリクエストを処理する AjaxBehaviourEvent パラメーターを持つメソッド) 内でこれを行っていましたが、これは機能しますが、今回はパラメーターなしのメソッドを使用しました。

問題は、いくつかの html を jquery .append() で追加し、jquery ajax を使用して、追加された要素からサーバーに要求を送信する必要があることです (jsf によって生成されないため、それらは機能しないため、jsf コンポーネントを追加できません)そのため、パラメーターなしで Bean メソッドを使用し、そのメソッドを ajax のリクエストを処理するサーブレットから呼び出す必要がありました。

これをさらに詳しく説明するために、次のように jquery を使用して html コードを追加するとします。

$('#substartmenudiv').append('<div id="congesdiv" />');

次に、新しく追加された div がクリックされたときに実行する必要があるコードを追加します。

$('#congesdiv').click(function(){
 $.post('AjaxRelaisServlet',{action:"setstrtmenustatus",startmenuisopen:startmenuisopen});
});

サーブレットから、ajax リクエストによって送信されたパラメーターをキャッチし、Bean メソッドを呼び出します。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


boolean startmenuisopen= Boolean.valueOf(request.getParameter("startmenuisopen"));

        UserBean.testcmdlink(startmenuisopen);

呼び出された testcmdlink Bean メソッドには、次のような RequestContext オブジェクトが含まれています。

public static void testcmdlink(boolean startmenuisopen){        

        RequestContext context = RequestContext.getCurrentInstance();
        if(!startmenuisopen){
        context.execute("$('#substartmenudiv').append('<div id="+"gestprofdiv"+" />');");
        context.execute("displaymenuitems();");
        context.execute("console.log('more elements are appended !!');");
        startmenuisopen=true;

        }else{
            context.execute("$('#substartmenudiv').empty();");
            context.execute("window['bottomvalue'] =30;");
            context.execute("console.log('start menu div is emptied !!');");
            startmenuisopen=false;
        }

    }

どこでも動作させる方法はありますか?

乾杯 !

4

2 に答える 2

2

そんなことはできません。内部では、オブジェクトにRequestContext依存しています。FacesContextこのオブジェクトは、JSF ライフサイクル処理以外では使用できません

適切な JSF リクエスト中にオブジェクトをジェネラルに詰め込み、サーブレット内でオブジェクトを取得する方法を見つけることで、これをごまかすことできる場合があります。PFソースでの実装に基づいて、この信仰の飛躍を続けていますConstants.REQUEST_CONTEXT_ATTRServletContextRequestContext.getCurrentInstance()

public static RequestContext getCurrentInstance(){
 return (RequestContext)FacesContext.getCurrentInstance().getAttributes().get(Constants.REQUEST_CONTEXT_ATTR);
} 
于 2013-03-29T16:48:07.880 に答える
0

あなたの質問で答えを見つけることができます。リクエストをリッスンし、パラメーターでそれらを処理するリスナーハンドラーメソッドがあると仮定します。したがって、いくつかのパラメーターを渡す必要があるか、要求を処理するためにパラメーターを受け入れない新しいメソッドを作成する必要があります。パラメーターがない場合、NullPointerException がスローされます。

それが役に立てば幸い!!!

于 2013-03-29T11:58:36.420 に答える