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も参照してください。