Связь между двумя веб-приложениями на одном сервере - PullRequest
14 голосов
/ 20 января 2012

All

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

Спасибо.

Ответы [ 5 ]

10 голосов
/ 09 октября 2013

Да.Это возможно.Он пытался использовать тот же контейнер сервлета с помощью метода getServletContext (). GetContext () .

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

(Windows) C: \Программные файлы \ 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
    }

}

Приведенный выше код отправляет атрибут name из InterServletComm1 , и он принимается в InterServletComm2 .Пожалуйста, дайте мне знать, если этот ответ не ясен.

5 голосов
/ 20 января 2012

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

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

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

Пока не пробовал.

2 голосов
/ 21 января 2012

Да, вы можете сделать это, используя 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);
1 голос
/ 02 декабря 2012

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

0 голосов
/ 20 января 2012

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

...