2012-01-20 14 views
11

Tümü,Haberleşme 2

Ben aynı sunucuda uygulama web ikisi arasında web uygulamaları, Web1 ve web2. Web1'deki sınıfları Web2'deki sınıfları çağırmak için sınıflar istiyorum. Bunu yapmanın bir yolu web servisini kullanmaktır. Aynı web uygulamasında sınıfa bir yöntemi çağırmanın başka bir yolu var mı?

Teşekkürler.

+0

Bazı servis/arayüzleri göstermek zorundasınız. o zaman JMX/EJB/JNDI kullanabilirsiniz. ofc, webservice, uygulamaları sürecin dışına taşıyor olsanız bile (yani 2 farklı web sunucusu) çalışacaktır, ancak her zaman çağrıları mareşal/kararsızlaştırmak zorundadır. – bestsss

+0

@bestss Webservice kullanmak istemememin nedeni budur. EJB/JNDI kullanmak istemiyorum. Daha iyi bir yol bulamazsam, JMX'i deneyebilirim. – Gaurav

cevap

0

Oldukça bu kadar basit değil. Sınıfları uygulamanızdan uygulama2'ye paylaşabilir ve içe aktarabilirsiniz, ancak bunların hepsi diğer sınıflarla bağlantılı olabilir. Öyleyse fikir, örneğin hesaplamalar yapmak için kullanılan fasülyeler gibi küçük servisler dışında pek iyi değildir. Ppl web servislerini çok fazla kullanmanın bir sebebi var;).

5

Sadece bazı makalelerin arandığını ve yukarıdaki senaryoyu Tomcat'te CrossContext anahtarını kullanarak yapmak kesinlikle mümkün.

Seti

Sonra getServletContext().getContext("/Web2"); yılında context.xml aşağıdaki öğesi. Yine de, henüz denemedim.

+1

evet, çapraz bağlamı ve gönderimi kullanabilirsiniz (ve çalışır) ancak bir web uygulamasının olması daha iyi olur. Yine de sınıfları doğrudan "diğer" wen-app'dan kullanabilirsiniz. – bestsss

+0

@bestss Doğrudan diğer web uygulamalarının sınıflarını kullanabileceğinizi düşünmüyorum. Her iki sınıf yükleyicisi de farklı olacak. –

+0

@RameshPVK, kesinlikle, şimdi parmaklarım çok tembel olan yorumu okuyarak - "yapamaz" anlamına geliyordu, yani gönderimin aksine. Sınıfları kullanmak için ortak bir sınıf yükleyiciden gelmeleri gerekiyor ama bu tamamen farklı bir hikaye. – bestsss

1

Evet javax.servlet.ServletContext ve javax.servlet.RequestDispatcher API en kullanarak bunu yapabilirsiniz. İşte o web1 yapılabilir nasıl: Eğer ayrı kavanoza web uygulamaları arasında paylaşmak istiyorum

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

Paket sınıfları. Ortak sınıf yükleyicileri, sınıfları yükleyecek ve her iki web uygulamasında da kullanılabilir olacak şekilde ortak/lib/alt dizinlere koyun. Sonra örneği web2'de jndi kullanarak ortaya çıkarın, onları web1'den arayın ve yöntemleri çağırın.

+0

Veya daha basit - jndi'ye gerek yok, sadece ortak kodda singleton var, referansı başlangıçta çağırmanız gereken sınıf örneğine kaydedin ve diğer uygulamadan alın. Ancak, bir web sunucusundan çektiğiniz tüm kodların, aynı (yaygın) sınıf yükleyicisi tarafından yüklenmesi gerektiğini unutmayın; bu da, daha fazla kütüphaneyi ortak/lib (veya Tomcat 6'dan beri yalnızca lib) oluşturmaya zorlayabilir. – Pavel

9

Evet. Bu mümkün. getServletContext(). GetContext() yöntemini kullanarak aynı sunucu kapsayıcısını denedi.

Önce aşağıdaki dosyada değişiklik yapmanız gerekiyorsa

(Windows) C: true crossContext arasında \ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ conf \ context.xml Seti değer.

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> 

lütfen unutmayın crossContext = "true".

isme InterServletComm1 ve InterServletComm2 sahip servlet'ler sırasıyla her web uygulamasında Servlet1 ve Servlet1 ile iki web uygulamaları olduğunu varsayalım. Daha sonra, her bir sunucudaki kod şu şekilde gider:

Servlet1.Yukarıdaki kod 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 özelliğindeki adı gönderir ve onu InterServletComm2 içerisine alınır. Lütfen bu cevabın açık olmadığını bana bildirin.