繁体   English   中英

同一服务器中两个Web应用程序之间的通信

[英]Communication between two web application in same server

所有,

我有两个Web应用程序,Web1和Web2,部署在我的tomcat服务器上。 我希望Web1中的类在Web2中调用类的方法。 一种方法是使用webservice。 有没有其他方法类似于在同一Web应用程序上调用类的方法?

谢谢。

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

首先,您需要在下面的文件中进行更改

(Windows)C:\\ Program Files \\ Apache Software Foundation \\ 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 =“true”

假设您有两个Web应用程序,其名称为InterServletComm1InterServletComm2分别在每个Web应用程序中具有Servlet1Servlet1 然后每个servlet中的代码如下:

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中接收。 如果答案不明确,请告诉我。

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

<Context crossContext="true">中的context.xml中设置以下元素

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

但是还没有尝试过。

是的,您可以使用javax.servlet.ServletContextjavax.servlet.RequestDispatcher API来完成。 这是它如何从Web1完成:

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

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

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

几乎不是那么简单。 您可以将app1中的类共享和导入app2,但也许它们都与其他类链接。 因此,除了用于进行计算的bean之类的小型服务之外,这个想法并不是那么好。 ppl有很多原因使用Web服务;)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM