0

を使用して、jsf ページからサーバーにデータを送信しようとしていますjQuery.post。リクエストを処理するためのURLと同じページのURLを入れました。jQuery.postデータを取得できますが、呼び出しに応答を返すことができません。

私の擬似コード:

jQuery.post('localhost/mypage.jsf', { data: 'xyz' }, function(res){
    console.log(res);
});

ハンドラー クラスで変数を取得できdataますが、応答を返すことができません。

どうすればもっとうまくできるかについてのアイデアはありますか?

4

1 に答える 1

1

JSFは基本的にその仕事には間違ったツールです。JSFのようなコンポーネントベースのMVCフレームワークではなく、JAX-RSのようなWebサービスフレームワークを使用する必要があります。

しかし、本当に主張するのであれば、次の方法でJSFを悪用して、任意の応答を送り返すことができます。ビューで使用<f:event type="preRenderView">して、ビューがレンダリングされる前にメソッドを呼び出し、<f:viewParam>リクエストパラメータをBeanプロパティとして設定します(これはGETリクエストでも効果的に機能することに注意してください)。

<f:metadata>
    <f:viewParam name="data" value="#{bean.data}" />
    <f:event type="preRenderView" listener="#{bean.process}" />
</f:metadata>

Google Gsonなどを使用してJSONを返す場合は、次のようになります。

public void process() throws IOException {
    String message = "Hello! You have sent the following data: " + data;
    String json = new Gson().toJson(Collections.singletonMap("message", message));

    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext ec = context.getExternalContext();
    ec.setResponseContentType("application/json");
    ec.setResponseCharacterEncoding("UTF-8");
    ec.getResponseOutputWriter().write(json);
    context.responseComplete(); // Prevent JSF from rendering the view.
}

繰り返しになりますが、あなたはJSFをその仕事の間違ったツールとして悪用しています。JAX-RS、あるいは単なるバニラサーブレットを見てください。サーブレットとRESTfulも参照してください。

于 2013-01-08T16:54:15.303 に答える