我有两个Web应用程序说App1和App2。我想从App1中的servlet调用App2中的servlet。我正在使用URLConnection。我也能够将参数传递给App2中的servlet,我也能够从servlet接收响应作为字符串。但我想从App2中的servlet发送java对象,并在App1的servlet中接收它们。怎么做到这一点?
答案 0 :(得分:10)
取决于
如果这些Web应用程序在同一个servlet容器中的物理上相同的Web服务器上运行,那么只需将其设置为请求属性并将请求转发到其他上下文:
request.setAttribute("name", object);
ServletContext app2 = getServletContext().getContext("app2");
app2.getRequestDispacher("servletUrl").forward(request, response);
其他上下文将能够获得如下对象:
Object object = request.getAttribute("name");
这只需要一个服务器设置,以便相互访问上下文。如何做到这一点取决于servletcontainer。例如,在Tomcat中,您只需将webapp的crossContext
元素的<Context>
属性设置为true
。
<Context crossContext="true">
然后它将可用于其他上下文。对于其他服务器,请参阅其文档。
如果这些Web应用程序在物理上不同的Web服务器上运行,那么有几个选项:
转换为String并作为参数发送。在检索时,从String转换回来。 JSON是一个很好的格式。 Google Gson提供了在完全可用的Java对象和JSON之间进行转换的可能性,反之亦然。如果你正在使用GET并且请求URI变得非常长,超过2KB,那么考虑使用POST而不是GET,否则URI可能会被服务器截断。优点:更好的可重复使用服务。缺点:很难发送二进制数据。
另请参阅: Converting JSON to Java。
根据Apache HttpComponents Client使用multipart/form-data
或RFC2388发送URLConnection
HTTP POST请求,并使用Apache Commons FileUpload在另一方处理它。优点:标准规范,可以发送二进制数据。缺点:更多代码。
另请参阅: How to use URLConnection。
Serialize Java对象,使用ObjectOutputStream
将其原始写入URLConnection#getOutputStream()
并从HttpServletRequest#getInputStream()
原始检索并使用{{3}对其进行反序列化}。优点:简单。缺点:不可重复使用,紧耦合。
另请参阅: ObjectInputStream
和Object Streams。
答案 1 :(得分:1)