2012-01-20 20 views
11

Todo,Comunicación entre dos aplicaciones web en el mismo servidor

Tengo 2 aplicaciones web, Web1 y Web2, implementadas en mi servidor tomcat. Quiero clases en Web1 para llamar a métodos en clases en Web2. Una forma de hacerlo es usar el servicio web. ¿Hay alguna otra manera similar a llamar a un método en clase en la misma aplicación web?

Gracias.

+0

tienes que exponer algún servicio/interfaz. también puedes usar JMX/EJB/JNDI. ofc, el servicio web funcionará incluso si retira las aplicaciones del proceso (es decir, 2 servidores web diferentes), pero siempre tiene que ordenar/desasignar las llamadas. – bestsss

+0

@bestss Esa es la razón por la que no quiero usar el servicio web. No quiero usar EJB/JNDI tampoco. Puede probar JMX a menos que encuentre otra forma mejor. – Gaurav

Respuesta

0

Casi no es tan simple. Puede compartir e importar clases desde su aplicación1 en la aplicación2, pero tal vez estén vinculadas con otras clases. Entonces, la idea no es tan buena, excepto por los pequeños servicios como los frijoles que se usan para hacer cálculos, por ejemplo. Hay una razón por la cual las personas están usando tanto los servicios web;).

5

Acabo de buscar algunos artículos y el escenario anterior es ciertamente posible usando CrossContext cambiando en Tomcat.

Conjunto el elemento siguiente en context.xml en

Y luego getServletContext().getContext("/Web2");.

No lo he intentado todavía.

+1

sí, puede usar cross context y dispatch (y funciona), pero entonces sería mejor que solo tuviera una aplicación web. Sin embargo, puedes usar las clases directamente desde "la otra" aplicación wen. – bestsss

+0

@bestss no creo que pueda usar directamente las clases de otras aplicaciones web. Ambos cargadores de clases serán diferentes. –

+0

@RameshPVK, absolutamente, ahora leyendo el comentario, mis dedos eran demasiado flojos: significaba "no puedo", es decir, en el contraste del despacho. Para usar las clases tienen que provenir de un cargador de clases común, pero esa es una historia completamente diferente. – bestsss

1

Sí, puede hacerlo utilizando javax.servlet.ServletContext y javax.servlet.RequestDispatcher API. Aquí es cómo se puede hacer desde Web1:

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

dispatcher.forward(request, response); 
//or 
dispatcher.include(request, response); 
1

Empaque las clases que desea compartir entre las aplicaciones web en un contenedor separado. Póngalos en common/lib para que el cargador de clases común cargue las clases y esté disponible para ambas aplicaciones web. Luego exponga la instancia en web2 usando jndi, búsquela desde web1 e invoque los métodos.

+0

O más simple: no necesita jndi, solo tiene singleton en el código común, registre la referencia a la instancia de clase que necesita invocar al inicio y recíbalo de la otra aplicación. Pero tenga cuidado de que todo el código que invoque desde una aplicación web deba ser cargado por el mismo cargador de clases (común), lo que podría forzarlo a poner más bibliotecas en common/lib (o simplemente lib desde Tomcat 6). – Pavel

9

Sí. Es posible. Intentó para el mismo contenedor de servlets utilizando el método getServletContext(). GetContext().

En primer lugar es necesario hacer cambios en el archivo de abajo

(Windows) C: \ Archivos de programa \ Apache Software Fundación \ Tomcat 7.0 \ conf \ context.xml valor Conjunto de 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> 

Tenga en cuenta que crossContext = "true".

Suponga que tiene dos aplicaciones web con el nombre InterServletComm1 y InterServletComm2 que tienen los servlets Servlet1 y Servlet1 en cada aplicación web, respectivamente. A continuación, el código en cada servlet es el siguiente:

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 
    } 

} 

Por encima de código envía atributo de nombre de InterServletComm1 y es recibida en InterServletComm2. Háganme saber si esta respuesta no es clara.

Cuestiones relacionadas