将数据从 servlet 发送到 applet:我该如何实现?
Posted
技术标签:
【中文标题】将数据从 servlet 发送到 applet:我该如何实现?【英文标题】:Sending data from a servlet to applet : How can I implement this? 【发布时间】:2012-07-23 19:35:51 【问题描述】:我想将 send HashMap
对象发送到请求它的小程序。 servlet 具有 HashMap
对象。有什么办法可以做到吗?
Applet ------requests HashMap object---->Servlet listens to this request
|
|
Servlet searches that HashMap Object
|
|
\ /
<--Finally Send this to applet------------ Servlet gets the HashMap object
我已经与servlet建立了连接,我的servlet也有HashMap对象,但是我不知道如何将它发送到applet,我想知道它是否可以发送!
【问题讨论】:
HashMap 是否包含一些特定的对象或者类似于 HashMap如何序列化它并发送它作为响应?考虑将其转换为 JSON 或 XML。
【讨论】:
绝对不推荐使用Java序列化。它将您的服务紧密耦合到一个平台,并且破坏了可移植性。而是使用通用的传输格式,以便可以轻松地将其用于其他目的。 我认为 json 或 xml 是某种带有元数据的序列化数据。 是的,但您明确提到它作为将其转换为 JSON/XML 的替代方法(“或”)。 你能找到一些教程吗?直到现在我都无法做到这一点。或者只是详细说明你的答案 确定@SuhailGupta。尝试使用谷歌 gson - google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/… 和 mkyong.com/java/…【参考方案2】:如果 servlet 与下载小程序的服务器位于同一服务器中,则可以打开到该 servlet 的 URL 连接。 你可以阅读
URL site = new URL("your site")
URLConnection urlCon = site.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
urlCon.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
同时在 servlet 中,您使用 HttpServletResponse 将数据写回客户端。
如果你需要更“复杂”的东西,你可以在你的小程序中使用轴作为 web 服务堆栈,或者包含一个轻量级的 REST 库,比如 Jersey。但是这些解决方案迫使您使用其他服务器组件而不是 Servlet。
这篇文章会对你有所帮助:
要编写您的 servlet:How to send json back to the client in response。 写你的客户:How to read JSON from http response。它们都使用json-lib 来解析/序列化 JSON 格式的对象。
希望对您有所帮助。
【讨论】:
我必须将数据从 servlet 发送到 applet。不是从小程序到 servlet @Suhail,那个 URLConnection 是双向的。【参考方案3】:我将利用一些外部库来回答您的问题:Google Gson 和 Apache IO Utils。
所以你的 Servlet 中已经有了 HashMap,并希望将它发送到 Applet:
Map<String, String> myMap = new HashMap<String, String>();// or whatever
Gson gson = new GsonBuilder().create();
String jsonString = gson.toJson(myMap);
IOUtils.write(jsonString, resp.getOutputStream());// where 'resp' is your HttpServletResponse
IOUtils.closeQuietly(resp.getOutputStream());
并在您的 Applet 中接收它:
String jsonString = IOUtils.toString(conn.getInputStream()); // where 'conn' is an HttpURLConnection
IOUtils.closeQuietly(connection.getInputStream());
Gson gson = new GsonBuilder().create();
// The TypeToken is needed when Generics are involved
Type typeOfHashMap = new TypeToken<Map<String, String>>() .getType();
Map<String, String> myMap = gson.fromJson(jsonString, typeOfHashMap);
就是这样。这只是一个简单的例子,但我希望你能从中有所收获。
当然,您可以手动完成,而不是使用外部库,但这种方式要容易得多。
【讨论】:
我还没有理解如何实现这段代码。另外解释一下resp.getOutputStream()
到底是什么。它返回什么? connection.getInputStream()
也是如此。我现在做的是this。红色标记是对applet函数的调用,我把你的第二个sn-p放在这里。
由于您的 Applet 已经调用了 Servlet,因此您有一个输入和一个输出流可用于在两者之间进行通信。您需要做的是使用上述流来发送和接收数据。请记住:您写入 Servlet 中的 output 流的内容是通过 Applet 中的 input 流接收的。我认为您不需要(或可以)从 Servlet 调用 Applet。在连接到 servlet 之后,您必须在 Applet 的代码中包含我的答案的第二部分;并删除您的 servlet 中的 new PollForm().func()
。
能否请您解释一下小程序代码中的这条语句:Type typeOfHashMap = new TypeToken<Map<String, String>>() .getType();
它是做什么的?
它保存 HashMap 的类型,以便您可以将其传递给 Gson,Gson 反过来使用它将 JSON 字符串转换为给定的类型。 POJO(没有泛型)不需要那个;你可以使用gson.fromJson(jsonString, MyPojo.class)
。
哈希映射类型是什么意思?它怎么知道我使用了 HashMap ?请解释一下。我一直在努力理解这一点【参考方案4】:
你可以简单的序列化对象,直接写入HttpServletResponse,写入字节流。
在 Applet 端,您必须读取字节流并使用流进行反序列化。 请注意,Applet 发送一个 POST 请求,否则如果您使用 GET 请求,您可能会有 1024 字节的限制。
希望对您有所帮助。
【讨论】:
以上是关于将数据从 servlet 发送到 applet:我该如何实现?的主要内容,如果未能解决你的问题,请参考以下文章
JavaWeb — Servlet(Server Applet)
从 servlet 获取数据到 JSP 并通过 ajax 再次将该数据发送到另一个 servlet