JSF Web アプリから、同じ EAR にデプロイされた非 JSF Web アプリへのサーバー側転送を実行したいと考えています。これを行う方法はありますか?FacesContext を介して単純にこれを行うことができるようには見えません。(注意してください、より多くのコンテキストのために、転送の前にリクエストオブジェクトにデータを入れます)
1 に答える
これは、どの JSF API でも利用できません。生のサーブレット API にフォールバックする必要があります。
で他のサーブレット コンテキストを取得できるようにするには、まず、「クロス コンテキスト」オプションを有効にするようにサーバーを構成する必要がありますServletContext#getContext()
。これは、ほとんどのサーバーでデフォルトで無効になっています。使用しているサーバーが不明なため、ヒントをいくつか示します。Tomcat の場合は のcrossContext
属性を確認context.xml
し、Glassfish の場合は のcrossContextAllowed
プロパティを確認してくださいglassfish-web.xml
。
それが完了すると、ServletContext
次のように、JSF のコンテキスト パスによってもう一方を取得できるようになります。
ServletContext currentServletContext = (ServletContext) externalContext.getContext();
ServletContext otherServletContext = currentServletContext.getContext("/otherContextPath");
次に、目的のリソースのパスで を取得し、現在の HTTP サーブレット リクエストとレスポンスを渡して をRequestDispatcher
呼び出す必要があります。forward()
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
otherServletContext.getRequestDispatcher("/path/to/other.xhtml").forward(request, response);
最後に、応答のレンダリングが引き継がれ、JSF がそれを行う必要がないことを JSF に通知する必要があります。
facesContext.responseComplete();
このアクションが ajax 要求によって呼び出されたのではなく、通常の同期要求によって呼び出されたことを確認する必要があるだけです。これは、JSF からの応答のレンダリングを完全に制御し、このようにして JSF JS/Ajax エンジンを制御しているためです。 XML 以外の応答が返されるという考えはまったくありません。
(免責事項:これをJSFと組み合わせて使用したことはありませんが、「プレーンな」JSP /サーブレットでそのように機能し、理論的には、サーブレットAPIの上に構築されたJSF Webアプリケーションと同じくらいうまく機能するはずです)