3

複数の WARS を持つ Web アプリケーションがあります。これらの WARS はすべて異なる機能を実行しますが、Css、Js、ヘッダーとフッター、およびエラー メッセージとトランザクションの確認を出力する特定の jsp など、多くの共通点があります。保守性を高めるために、これらの共有ファイルを 1 つの場所ではなく複数の場所に置きたくないので、1 つを編集するとすべてに表示されます。基本的なコード管理だけです。これをSOの誰かに説明する必要はないと思います。

Css と Js については、ルート War があり、すべての<link>and<script>タグを完全にアドレス指定します。ヘッダーとフッター (jsp フラグメント) については、使用して<c:import>おり、ルート戦争から再度取得しています。私が抱えている最後の問題は、jsps の共有です。

ユーザーがアクションを実行しようとした後、トランザクションが完了したことを確認するためにデータベースに変更が加えられた後、またはフォーマットされたメッセージをユーザーに提供したいその他の状況で、私はよくこれらの jsps に転送します。サーブレットは次のようになります...

public class sampleServlet extends ExtendedHttpServlet{ //ExtendedHttpServlet used to add common function to all of our HttpServlets including the foward function I use below. 
     public void doPost(HttpServletRequest request, HttpServletResponse response){

        //Do some preperation stuff here, then...

        try{

            ModelJob.insertNewControlMJob(user, submit);  //ModelJob is my inteface to our 'Job' Table Model... 
            submit.setSeqId(ModelJob.getSeqId(user, submit));
            EmailFactory.SUBMIT_NEW_EMAIL.sendCMAdminEmail(user, submit, null);
            EmailFactory.SUBMIT_NEW_EMAIL.sendUserEmail(user, submit, null);

            req.setAttribute("color","Green");
            req.setAttribute("message"," Job Successfully Submited. Sequece id : " + submit.getSeqId());
            forward("/WEB-INF/TransactionResult.jsp", req, resp); 
            return;

        }catch(Exception e){

            req.setAttribute("color","Red");
            req.setAttribute("message","Teradata failure : " + e.getMessage());
            forward("/WEB-INF/TransactionResult.jsp", req, resp);
            e.printStackTrace();
            return;

        }
     }
}

これは、スーパークラスで定義された上記の呼び出しメソッドですExtendedHttpServlet

protected void forward(String destination, HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException 
{
    RequestDispatcher dispatcher = request.getRequestDispatcher(destination.toString());
    dispatcher.forward(request, response);
}

しかし、これを使用すると、すべての戦争で TransactionResult.jsp のコピーを保持する必要があり、メンテナンスが少し面倒になります。

私の質問は - 転送先の他の WAR で jsps を見つけるために転送機能を取得する方法はありますか? または、jsp を EAR に含めて、フォワードに jsp ファイルを見つけてもらうこともできます。jsps は単なるファイルであり、特別なサーブレットによって実行時にコンパイルされることを理解しているので、なぜこれが不可能なのかわかりませんか?

アドバイス/洞察/助けをありがとう....

編集 あなたの何人かがどのサーバーを尋ねたので、私は現在Websphere v 7.0を使用しています

4

3 に答える 3

2

サーブレット 3.0 準拠のサーバーを使用している場合は、すべての共有 Web リソース (JSP、CSS ファイルなど) をMETA-INF/resourcesjar のディレクトリ内にパッケージ化することをお勧めします。この jarWEB-INF/libをすべての webapp に配置すると、これらの共有リソースは、webapp のルートに直接あるかのように、webapp の一部になります。

于 2012-06-29T17:46:33.157 に答える
2

で他のサーブレット コンテキストを取得し、ServletContext#getContext()そのリクエスト ディスパッチャを で使用できますServletContext#getRequestDispatcher()。最初に、「クロス コンテキスト」オプションを有効にするようにサーバーを構成する必要があります。これは、ほとんどのサーバーでデフォルトで無効になっています。使用しているサーバーが不明なため、ヒントをいくつか示します。Tomcat の場合は のcrossContext属性を確認context.xmlし、Glassfish の場合は のcrossContextAllowedプロパティを確認してくださいglassfish-web.xml

それが完了すると、ServletContext次のように、サーブレットのコンテキスト パスによってもう一方を取得できるようになります。

ServletContext otherServletContext = getServletContext().getContext("/otherContextPath");

次に、目的のリソースのパスで を取得し、現在の HTTP サーブレット リクエストとレスポンスを渡して をRequestDispatcher呼び出す必要があります。forward()

otherServletContext.getRequestDispatcher("/WEB-INF/TransactionResult.jsp").forward(request, response);

まったく別の方法は、完全に別の Java プロジェクト (Eclipse では「Web フラグメント プロジェクト」と呼ばれる) を作成し、共有 JSP を/META-INF/resourcesJava ソース フォルダーのフォルダーに配置することです。最後に、この Java プロジェクトを使用してすべての WAR をフォルダー内の JAR ファイルのフレーバーでデプロイし/WEB-INF/libます (Eclipse では、スタンドアロン Java プロジェクトをすべての Web プロジェクトの「デプロイ アセンブリ」として追加するだけで十分です)。/META-INF/resourcesフォルダ内の JSP に、現在の WAR 内にあるかのようにアクセスできます。

于 2012-06-29T17:42:30.917 に答える
1

ServletContext.getContext()を使用して、(同じ仮想ホスト内の) 他のアプリケーションのコンテキストにアクセスします。それを取得したら、そのリクエストディスパッチャーを使用して転送を行うことができます。

上記を機能させるには、いくつかのベンダー固有の設定を有効にしてデフォルトのセキュリティを上書きする必要がある場合があります。こちらを参照してください: Tomcat で crossContext 属性は何をしますか? セッション共有を有効にしますか?

于 2012-06-29T17:43:55.077 に答える