Связь между двумя веб-приложениями на одном сервере

Все,

У меня есть 2 веб-приложения, Web1 и Web2, развернутые на моем сервере tomcat. Я хочу, чтобы классы в Web1 вызывали методы в классах в Web2. Один из способов сделать это - использовать webservice. Есть ли другой способ, похожий на вызов метода в классе в одном и том же веб-приложении?

Спасибо.

Ответ 1

Да. Возможно. Он пытался использовать тот же контейнер сервлетов, используя getServletContext(). Метод getContext().

Сначала вам нужно внести изменения в файл ниже

(Windows) C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\context.xml Установите значение crossContext в 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" .

Предположим, у вас есть два веб-приложения с именем InterServletComm1 и InterServletComm2 с сервлетами Servlet1 и Servlet1 в каждом веб-приложении соответственно. Затем код в каждом сервлете выглядит следующим образом:

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. Пожалуйста, дайте мне знать, если этот ответ не ясен.

Ответ 2

Просто просмотрел некоторые статьи, и описанный выше сценарий, безусловно, возможен с использованием переключения CrossContext в Tomcat.

Задайте следующий элемент в context.xml в <Context crossContext="true">

И затем getServletContext().getContext("/Web2");.

Однако пока не пробовал.

Ответ 3

Да, вы можете это сделать, используя 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);

Ответ 4

Пакет классов, которые вы хотите разделить между веб-приложениями, в отдельную банку. Поместите их под общим /lib, чтобы обычный загрузчик классов загружал классы и был доступен для обоих веб-приложений. Затем выведите экземпляр в web2 с помощью jndi, найдите их из web1 и вызовите методы.

Ответ 5

В значительной степени это не так просто. Вы можете делиться и импортировать классы из вашего приложения 1 в приложение2, но, возможно, они связаны с другими классами. Таким образом, идея не так хороша, за исключением небольших сервисов, таких как beans, которые используются, например, для расчета. Существует причина, по которой ppl использует веб-службы так много;).