2012-01-20 97 views
11

所有,通信之间的两个Web应用程序在同一台服务器

我有2个Web应用程序,材WEB1和web2,部署我的Tomcat服务器上。我想让Web1中的类调用Web2中的类。一种方法是使用webservice。有没有其他方式类似于在同一个Web应用程序上调用类的方法?

谢谢。

+0

你必须公开一些服务/接口。那么你也可以使用JMX/EJB/JNDI。 ofc,即使您将应用程序移出流程(即2个不同的Web服务器),webservice也能正常工作,但它始终需要编组/解组呼叫。 – bestsss

+0

@bestss这就是我不想使用webservice的原因。不想使用EJB/JNDI。可以尝试JMX,除非我找到其他更好的方法。 – Gaurav

回答

0

其实它并不那么简单。你可以将app1中的类分享并导入到app2中,但也许它们都与其他类相关联。所以这个想法并不是很好,除了像bean这样的小服务用于计算例如。有一个原因是人工智能正在使用Web服务;)。

5

刚刚搜索了一些文章,上面的场景当然可以在Tomcat中使用CrossContext切换。

坐落在context.xml中以下元素

然后getServletContext().getContext("/Web2");

虽然还没有尝试过。

+1

是的,你可以使用跨上下文和调度(它的工作原理),但你最好只有一个网络应用程序。不过,您可以直接使用“其他”文本应用程序中的类。 – bestsss

+0

@bestss我不认为你可以直接使用其他Web应用程序的类。这两个类加载器都会有所不同。 –

+0

@RameshPVK,绝对,现在阅读评论我的手指太懒 - 它的意思是“不能”,即在调度的对比。要使用它们必须来自一个普通的类加载器的类,但这是一个完全不同的故事。 – bestsss

1

是的,你可以使用javax.servlet.ServletContextjavax.servlet.RequestDispatcher API的做到这一点。这里是它如何从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

将您想要在Web应用程序之间共享的类打包到单独的jar中。将它们放在common/lib下,以便通用类加载器将加载这些类,并可供这两个Web应用程序使用。然后使用jndi在web2中暴露实例,从web1中查找它们并调用这些方法。

+0

或者更简单 - 不需要jndi,只需要在公共代码中使用singleton,将引用注册到需要在启动时调用的类实例,并从其他应用程序获取它。但是要注意,你从一个webapp调用的所有代码都需要被相同的(通用)类加载器加载,这可能会迫使你将更多的库放在common/lib中(或者自从Tomcat 6以来只是lib)。 – Pavel

9

是的。有可能的。它通过使用 getServletContext()。getContext()方法尝试了相同的servlet容器。

首先,你需要做下面的文件更改

(Windows)中C:\ Program Files文件\ Apache软件基金会\ 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 = “真”

假设你有一个名字InterServletComm1InterServletComm2 具有的servlet Servlet1在每个Web应用程序分别Servlet1两个Web应用程序。然后每个servlets中的代码如下:

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 
    } 

} 

以上代码从InterServletComm1发送属性名称并且在InterServletComm2接收。 请让我知道如果这个答案不明确。

相关问题