【发布时间】:2010-06-14 07:40:30
【问题描述】:
我有两个 Web 应用程序,分别是 App1 和 App2。我想从 App1 中的 servlet 调用 App2 中的 servlet。我为此使用 URLConnection。我还可以将参数传递给 App2 中的 servlet,并且还可以从 servlet 接收字符串形式的响应。但我想从 App2 中的 servlet 发送 java 对象并在 App1 的 servlet 中接收它们。如何做到这一点?
【问题讨论】:
我有两个 Web 应用程序,分别是 App1 和 App2。我想从 App1 中的 servlet 调用 App2 中的 servlet。我为此使用 URLConnection。我还可以将参数传递给 App2 中的 servlet,并且还可以从 servlet 接收字符串形式的响应。但我想从 App2 中的 servlet 发送 java 对象并在 App1 的 servlet 中接收它们。如何做到这一点?
【问题讨论】:
视情况而定。
如果这些 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的<Context>元素的crossContext属性设置为true即可。
<Context crossContext="true">
然后它将可用于其他上下文。对于其他服务器,请查阅其文档。
如果这些网络应用程序在物理上不同的网络服务器上运行,那么有几种选择:
转换为字符串并作为参数发送。在检索时,从 String 转换回来。 JSON 是一种很好的格式。 Google Gson 提供了在完全有价值的 Java 对象和 JSON 之间进行转换的可能性,反之亦然。如果您使用 GET 并且请求 URI 变得很长,超过 2KB,那么请考虑使用 POST 而不是 GET,否则 URI 可能会被服务器截断。优点:更好的可重用服务。缺点:难以发送二进制数据。
另请参阅: Converting JSON to Java。
根据RFC2388,使用URLConnection 或Apache HttpComponents Client 发送multipart/form-data HTTP POST 请求,并在另一端使用Apache Commons FileUpload 处理它。优点:标准规格,可以发送二进制数据。缺点:更多代码。
另请参阅: How to use URLConnection。
Serialize Java 对象,使用ObjectOutputStream 将其原始写入URLConnection#getOutputStream(),并从HttpServletRequest#getInputStream() 中检索它,并使用ObjectInputStream 对其进行反序列化。优点:容易。缺点:不可重用,紧耦合。
另请参阅: Object Streams 和 Lesson: Serialization。
【讨论】:
【讨论】: