Applet – Servlet通信

我已经放弃了我之前的尝试,即使用户和网页已经表明可以直接与数据库进行通信。 我现在试图让我的applet传递在文本字段中输入的信息(字符串和布尔格式)或由复选框指示,并将其提供给servlet,然后servlet将其适当地存储在数据库中。 我已经建立了applet前端 – GUI – 并且还构建了servlet – 数据库连接。 唯一的问题是两者之间的联系,applet和servlet。 如何将String数据从applet传递给servlet?

谢谢,约瑟夫G.

首先,您必须承认,您只能与下载applet的服务器进行通信,包括端口号,除非您想要处理权限,applet签名和所有malarky。 这也不仅仅是一个Applet限制,同样适用于Flash和JavaScript(虽然在JavaScript的情况下有一些技巧可以解决它)。

在Applet上使用“getCodeBase()”或“getDocumentBase()”方法将获得一个URL,您可以从中获取构建新URL所需的组件,以便调用servlet。

因此,必须从托管servlet的同一服务器提供Applet。

例如,如果您的Applet位于以下页面中:

http://www.example.com/myapplet.html

…这意味着您可以拨打任何以#开头的url

http://www.example.com/

……比较容易

以下是一个未经测试的粗略示例,展示了如何调用Servlet。 这假定从Applet实例中调用此代码片段。

URL codeBase = getCodeBase(); URL servletURL = new URL(codeBase.getProtocol(), codeBase.getHost(), codeBase.getPort(), "/myServlet"); // assumes protocol is http, could be https HttpURLConnection conn = (HttpURLConnection)servletURL.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); PrintWriter out = new PrintWriter(conn.openOutputStream()); out.println("hello world"); out.close(); System.out.println(conn.getResponseCode()); 

然后在您的servlet中,您可以获取通过覆盖doPost()发送的文本并从请求中读取输入流(未显示exception处理且仅读取输入的第一行):

 public void doPost(HttpServletRequest req, HttpServletResponse res) { BufferedReader reader = req.getReader(); String line = reader.readLine(); System.out.println("servlet received text: " + line); } 

当然,这只是一种方法。 您也可以接受输入并构建一个这样的查询字符串(URLEncoding not shown):

 String queryString = "inputa=" + view.getInputA() + "&inputb=" + view.getInputB(); 

并将其附加到您的url:

 URL servletURL = new URL(codeBase.getProtocol(), codeBase.getHost(), codeBase.getPort(), "/myServlet?" + queryString); 

但是,现在构建某种字符串并将其流式传输到servlet似乎相当普遍。

推荐的格式是JSON,因为它是半结构化的,同时易于阅读,并且有很多(de)序列化器可以在你的Applet和servlet中运行。 这意味着您可以拥有一个很好的数据对象模型,您可以在Applet和Servlet之间共享。 构建复杂输入的查询字符串可能是一个令人头疼的问题。

同样,您实际上可以使用Java序列化和流二进制文件到Servlet,然后使用Java序列化来创建适当的Java对象。 但是,如果你坚持像JSON这样的东西,那就意味着你的servlet更容易重复使用,因为Java序列化从来没有在Java之外实现(我知道)。

嗯,我想applet和servlet在两个独立的Java进程中运行。 在这种情况下,您将不得不使用一些远程技术,例如对localhost的http调用。 事实上,这就是servlet主要用于和实现的目的:接受和处理http请求。