web-dev-qa-db-ja.com

同じサーバー内の2つのWebアプリケーション間の通信

すべて、

TomcatサーバーにWeb1とWeb2の2つのWebアプリケーションをデプロイしています。 Web1のクラスがWeb2のクラスのメソッドを呼び出すようにしたい。これを行う1つの方法は、Webサービスを使用することです。同じWebアプリケーションのクラスでメソッドを呼び出すのと同様の方法は他にありますか?.

ありがとう。

14
Gaurav

はい。可能です。 getServletContext()。getContext()メソッドを使用して、同じサーブレットコンテナを試行しました。

まず、以下のファイルに変更を加える必要があります

(Windows)C:\ Program Files\Apache Software Foundation\Tomcat 7.0\conf\context.xmlcrossContextの値をtrueに設定します。

context.xml

<Context crossContext="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.Apache.catalina.valves.CometConnectionManagerValve" />
    -->

</Context>

crossContext = "true"であることに注意してください。

名前InterServletComm1InterServletComm2の名前を持つ2つのWebアプリケーションがあり、サーブレット各Webアプリケーションのサーブレット1サーブレット1。次に、各サーブレットのコードは次のようになります。

Servlet1.Java

package interServletComm1;

import Java.io.IOException;
import Java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet1
 */
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();

        request.setAttribute("name", "WebApp1");
        ServletContext context = getServletContext().getContext("/InterServletComm2");
        RequestDispatcher rd = context.getRequestDispatcher("/Servlet2");
        rd.forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

Servlet2.Java

package interServletComm2;

import Java.io.IOException;
import Java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet2
 */
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet2() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        String name = (String) request.getAttribute("name");
        pw.println("This is web application 2.");
        pw.println("<br>The value received from web application one is: " + name);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

上記のコードは、属性nameInterServletComm1から送信し、InterServletComm2。この答えが明確でない場合はお知らせください。

いくつかの記事を検索したところ、TomcatでCrossContextスイッチングを使用すると上記のシナリオが確実に可能になります。

_<Context crossContext="true">_のcontext.xmlに次の要素を設定します

そして、getServletContext().getContext("/Web2");

ただし、まだ試していません。

5
Gaurav

はい、javax.servlet.ServletContextおよびjavax.servlet.RequestDispatcher APIを使用して実行できます。これがWeb1から実行できる方法です。

ServletContext otherContext = servletContext.getContex("/Web2");
RequestDispatcher dispathcer = otherContext.getRequestDispatcher("/a/b.jsp");

dispatcher.forward(request, response);
//or
dispatcher.include(request, response);
2
Ramesh PVK

Webアプリケーション間で共有するクラスを別のjarにパッケージ化します。それらをcommon/libの下に置いて、共通のクラスローダーがクラスをロードし、両方のWebアプリケーションで使用できるようにします。次に、jndiを使用してweb2でインスタンスを公開し、web1からインスタンスを検索して、メソッドを呼び出します。

1
Bibin

それほど単純ではありません。クラスを共有してapp1からapp2にインポートできますが、それらはすべて他のクラスとリンクされている可能性があります。したがって、たとえば計算に使用されるBeanのような小さなサービスを除いて、このアイデアはあまり良くありません。 pplがWebサービスを多用しているのには理由があります;)。

0
yasenYankov