2012-01-20 27 views
11

Tất cả,Giao tiếp giữa hai ứng dụng web trong cùng một máy chủ

Tôi có 2 ứng dụng web, Web1 và Web2, được triển khai trên máy chủ tomcat của tôi. Tôi muốn các lớp trong Web1 gọi các phương thức trên các lớp trong Web2. Một cách để làm điều này là sử dụng webservice. Có cách nào khác tương tự như gọi một phương thức trên lớp trên cùng một ứng dụng web?

Cảm ơn.

+0

bạn phải hiển thị một số dịch vụ/giao diện. bạn cũng có thể sử dụng JMX/EJB/JNDI sau đó. ofc, webservice sẽ hoạt động ngay cả khi bạn di chuyển các ứng dụng ra khỏi quy trình (tức là 2 máy chủ web khác nhau) nhưng nó luôn phải sắp xếp/hủy hợp lệ các cuộc gọi. – bestsss

+0

@bestss Đó là lý do tôi không muốn sử dụng dịch vụ web. Không muốn sử dụng EJB/JNDI. Có thể thử JMX trừ khi tôi tìm cách khác tốt hơn. – Gaurav

Trả lời

0

Khá nhiều điều không đơn giản. Bạn có thể chia sẻ và nhập các lớp từ app1 vào app2, nhưng có thể tất cả chúng đều được liên kết với các lớp khác. Vì vậy, ý tưởng không phải là quá tốt ngoại trừ các dịch vụ nhỏ như đậu được sử dụng để thực hiện các phép tính ví dụ. Có một lý do ppl đang sử dụng dịch vụ web rất nhiều;).

5

Chỉ cần tìm kiếm xung quanh một số bài viết và kịch bản trên chắc chắn có thể sử dụng chuyển đổi CrossContext trong Tomcat.

Set các yếu tố sau đây trong context.xml trong

Và sau đó getServletContext().getContext("/Web2");.

Chưa thử.

+1

có, bạn có thể sử dụng ngữ cảnh chéo và công văn (và nó hoạt động) nhưng sau đó bạn muốn được tốt hơn off chỉ có một ứng dụng web. Bạn có thể sử dụng các lớp trực tiếp từ "wen-app" khác. – bestsss

+0

@bestss tôi không nghĩ rằng bạn có thể trực tiếp sử dụng các lớp của ứng dụng web khác. Cả hai trình nạp lớp sẽ khác nhau. –

+0

@RameshPVK, tuyệt đối, bây giờ đọc nhận xét ngón tay của tôi quá lười biếng - nó có nghĩa là "không thể", tức là trong sự tương phản của phái. Để sử dụng các lớp họ phải đến từ một trình nạp lớp phổ biến nhưng đó là một câu chuyện hoàn toàn khác. – bestsss

1

Có bạn có thể làm điều đó bằng javax.servlet.ServletContextjavax.servlet.RequestDispatcher API. Đây là cách nó có thể được thực hiện từ 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

Đóng gói các lớp bạn muốn chia sẻ giữa các ứng dụng web vào một bình riêng biệt. Đặt chúng dưới dạng phổ biến/lib để trình nạp lớp phổ biến sẽ tải các lớp và sẽ có sẵn cho cả hai ứng dụng web. Sau đó, phơi bày cá thể trong web2 bằng cách sử dụng jndi, tra cứu chúng từ web1 và gọi các phương thức.

+0

Hoặc đơn giản hơn - không cần jndi, chỉ cần có singleton trong mã thông thường, đăng ký tham chiếu đến cá thể lớp bạn cần gọi khi khởi động và lấy nó từ ứng dụng khác. Nhưng hãy cẩn thận rằng tất cả mã bạn gọi từ một ứng dụng web cần phải được nạp bởi cùng một trình nạp lớp (phổ biến), có thể buộc bạn phải đặt thêm các thư viện chung/lib (hoặc chỉ lib từ Tomcat 6). – Pavel

9

Có. Điều đó là có thể. Nó đã cố gắng cho cùng một thùng chứa servlet bằng cách sử dụng phương thức get2().

Trước tiên, bạn cần phải thực hiện những thay đổi trong file dưới đây

(Windows) C: \ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ conf \ context.xml Set giá trị của crossContext là 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> 

Xin lưu ý rằng crossContext = "true".

Giả sử bạn có hai ứng dụng web với tên InterServletComm1InterServletComm2 có servlets Servlet1Servlet1 trong mỗi ứng dụng web tương ứng. Sau đó, mã trong mỗi servlet sẽ như sau:

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 
    } 

} 

Trên đang gửi thuộc tính tên từ InterServletComm1 và nó được nhận trong InterServletComm2. Vui lòng cho tôi biết nếu câu trả lời này không rõ ràng.

Các vấn đề liên quan