远程servlet之间的通信

Ven*_*esh 7 java servlets

我有两个Web应用程序说App1和App2.我想从App1中的servlet调用App2中的servlet.我正在使用URLConnection.我也能够将参数传递给App2中的servlet,我也能够从servlet接收响应作为字符串.但我想从App2中的servlet发送java对象,并在App1的servlet中接收它们.怎么做到这一点?

Bal*_*usC 10

要看.


如果这些Web应用程序在同一个servlet容器中的物理上相同的Web服务器上运行,那么只需将其设置为请求属性并将请求转发到其他上下文:

request.setAttribute("name", object);
ServletContext app2 = getServletContext().getContext("app2");
app2.getRequestDispacher("servletUrl").forward(request, response);
Run Code Online (Sandbox Code Playgroud)

其他上下文将能够获得如下对象:

Object object = request.getAttribute("name");
Run Code Online (Sandbox Code Playgroud)

这只需要一个服务器设置,以便相互访问上下文.如何做到这一点取决于servletcontainer.例如,在Tomcat中,您只需要将crossContextwebapp <Context>元素的属性设置为true.

<Context crossContext="true">
Run Code Online (Sandbox Code Playgroud)

然后它将可用于其他上下文.对于其他服务器,请参阅其文档.


如果这些Web应用程序在物理上不同的Web服务器上运行,那么有几个选项:

  1. 转换为String并作为参数发送.在检索时,从String转换回来.JSON是一个很好的格式.Google Gson提供了在完全可用的Java对象和JSON之间进行转换的可能性,反之亦然.如果你正在使用GET并且请求URI变得非常长,超过2KB,那么考虑使用POST而不是GET,否则URI可能会被服务器截断.优点:更好的可重复使用服务.缺点:很难发送二进制数据.

    另请参阅: 将JSON转换为Java.

  2. 根据RFC2388multipart/form-data使用URLConnectionApache HttpComponents客户端发送HTTP POST请求,并使用Apache Commons FileUpload在另一端处理它.优点:标准规范,可以发送二进制数据.缺点:更多代码.

    另请参见: 如何使用URLConnection.

  3. 序列化 Java对象,将其原始写入URLConnection#getOutputStream()使用ObjectOutputStream并从中检索原始HttpServletRequest#getInputStream()并使用它进行反序列化ObjectInputStream.优点:简单.缺点:不可重复使用,紧耦合.

    另请参见: 对象流课程:序列化.