3

ServletContextを使用して同じアプリケーション内のサーブレット間の通信を有効にすることは非常に優れており、異なるアプリ(同じサーブレットコンテナにデプロイされている)からのサーブレット間の通信を有効にする同等の方法があるかどうか疑問に思います。

背景には、複数のサーバーに分散できる2つのアプリケーションがあります。その場合、それらはSOAPを介して通信することになっていますが、両方が同じサーバー(およびサーブレットコンテナ)でホストされている場合は、SOAPオーバーヘッドを回避し、直接通信したいと思います。

助言がありますか?

乾杯

4

2 に答える 2

1

このようなAPIは、サーブレットAPIの最初のバージョンに存在していました。サーブレットコンテキストから他のサーブレットを見つけて呼び出すことができます。他のWebアプリケーションからサーブレットを呼び出すことができるとは思えません。

とにかく、このAPIは非推奨であり、これ以上サポートされていません。その理由は、EJBが導入されたためです。サーブレットは、Webフロントエンドの役割のみを果たします。それらはビジネスロジックを実装するべきではなく、したがって互いに通信するべきではありません。

異なるアプリケーション間で通信を実行する最新の方法は、WebサービスまたはEJBを使用するか、Springを使用している場合はそれらのリモートメカニズムまたはメッセージングです。

于 2012-08-30T13:42:31.640 に答える
0

別のサーブレットコンテナについてはよくわかりません。ただし、 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アプリケーションにそれぞれ サーブレットServlet1Servlet1があるとします。次に、各サーブレットのコードは次のようになります。

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
    }

}

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

于 2013-10-09T12:39:58.093 に答える