2012-01-20 16 views
11

Tutti,comunicazione tra due applicazioni Web nel server stesso

Ho 2 applicazioni web, Web1 e Web2, distribuiti sul mio server Tomcat. Voglio le classi in Web1 per chiamare i metodi sulle classi in Web2. Un modo per farlo è utilizzare il servizio web. C'è un altro modo simile a chiamare un metodo in classe sulla stessa applicazione web?

Grazie.

+0

devi esporre qualche servizio/interfaccia. puoi anche usare JMX/EJB/JNDI quindi. ofc, webservice funzionerà anche se si spostano le applicazioni fuori dal processo (ovvero 2 server Web diversi) ma deve sempre effettuare il marshall/unmarshal delle chiamate. – bestsss

+0

@bestss Questo è il motivo per cui non voglio usare webservice. Non voglio neanche usare EJB/JNDI. Posso provare JMX a meno che non trovi un altro modo migliore. – Gaurav

risposta

0

Praticamente non è così semplice. Puoi condividere e importare classi dalla tua app1 in app2, ma forse sono tutte collegate ad altre classi. Quindi l'idea non è molto buona a parte i piccoli servizi come i bean che vengono utilizzati per fare calcoli, per esempio. C'è un motivo per cui i servizi Web vengono utilizzati così tanto;).

5

Basta cercare in alcuni articoli e lo scenario sopra è certamente possibile utilizzando lo switching CrossContext in Tomcat.

Impostare il seguente elemento in context.xml in

E poi getServletContext().getContext("/Web2");.

Non ho ancora provato, però.

+1

sì, è possibile utilizzare cross context e dispatch (e funziona), ma sarebbe meglio avere solo una web-app. Tuttavia, puoi utilizzare le classi direttamente da "l'altra" app-wen. – bestsss

+0

@bestss Non penso che tu possa utilizzare direttamente le classi di altre applicazioni web. Entrambi i classloader saranno diversi. –

+0

@RameshPVK, assolutamente, ora leggendo il commento le mie dita erano troppo pigre - si intendeva "non può", cioè nel contrasto di dispacciamento. Per usare le classi devono provenire da un classloader comune, ma questa è una storia completamente diversa. – bestsss

1

Sì, è possibile farlo utilizzando javax.servlet.ServletContext e javax.servlet.RequestDispatcher API. Ecco come può essere eseguito da 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

Imballare le classi che si desidera condividere tra le applicazioni Web in un contenitore separato. Mettili sotto common/lib in modo che il classloader comune carichi le classi e sia disponibile per entrambe le applicazioni web. Quindi esponi l'istanza in web2 usando jndi, cercali da web1 e invoca i metodi.

+0

O più semplice: non c'è bisogno di jndi, basta un singleton nel codice comune, registrare il riferimento all'istanza di classe che è necessario chiamare all'avvio e scaricarlo dall'altra applicazione. Ma attenzione che tutto il codice che invochi da una webapp deve essere caricato dallo stesso (comune) classloader, che potrebbe costringerti a mettere più librerie in common/lib (o solo lib da Tomcat 6). – Pavel

9

Sì. È possibile. Ha provato per lo stesso contenitore servlet utilizzando il metodo getServletContext(). GetContext().

Per prima cosa è necessario apportare modifiche nel file di seguito

(Windows) C: \ Programmi \ Apache Software Foundation \ Tomcat 7.0 \ conf \ context.xml valore Set di crossContext su 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> 

prega di notare che crossContext = "true".

Supponiamo di avere due applicazioni web con nome InterServletComm1 e InterServletComm2 con servlet Servlet1 rispettivamente e Servlet1 in ogni applicazione web. Quindi il codice in ogni servlet è il seguente:

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 
    } 

} 

Sopra codice invia attributo nome da InterServletComm1 ed è ricevuto in InterServletComm2. Per favore fatemi sapere se questa risposta non è chiara.

Problemi correlati