首先,您必须承认您只能与下载您的小程序的服务器进行通信,其中包括端口号,除非您想弄乱权限、小程序签名和所有这些问题。这也不仅仅是 Applet 的限制,同样适用于 Flash 和 JavaScript(尽管在 JavaScript 的情况下有一些技巧可以绕过它)。
在您的 Applet 上使用“getCodeBase()”或“getDocumentBase()”方法将为您获取一个 URL,您可以从中获取构建新 URL 所需的组件部分,该 URL 将允许您调用 servlet。
因此,您的 Applet 必须由托管您的 servlet 的同一台服务器提供服务。
例如如果您的 Applet 在以下页面中:
http://www.example.com/myapplet.html
...这意味着您可以调用任何以
开头的 URL
http://www.example.com/
...相对容易。
以下是一个粗略的、未经测试的示例,展示了如何调用 Servlet。这假定此代码的 sn-p 是从 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() 并从请求中读取输入流来获取发送的文本(不显示异常处理,只读取输入的第一行):
public void doPost(HttpServletRequest req, HttpServletResponse res) {
BufferedReader reader = req.getReader();
String line = reader.readLine();
System.out.println("servlet received text: " + line);
}
当然,这只是一种方法。您还可以获取输入并构建这样的查询字符串(未显示 URLEncoding):
String queryString = "inputa=" + view.getInputA() + "&inputb=" + view.getInputB();
并将其附加到您的 URL:
URL servletURL = new URL(codeBase.getProtocol(), codeBase.getHost(), codeBase.getPort(), "/myServlet?" + queryString);
然而,现在构建某种字符串并将其流式传输到 servlet 似乎相当普遍。
推荐的格式是 JSON,因为它是半结构化的,同时易于阅读,并且周围有很多(反)序列化器应该可以在您的 Applet 和您的 servlet 中工作。这意味着您可以为您的数据提供一个很好的对象模型,您可以在 Applet 和 Servlet 之间共享它。构建复杂输入的查询字符串可能会让人费解。
同样,您实际上可以使用 Java 序列化并将二进制流式传输到您的 Servlet,然后使用 Java 序列化来创建适当的 Java 对象。但是,如果您坚持使用 JSON 之类的东西,则意味着您的 servlet 更易于重用,因为 Java 序列化从未在 Java 之外实现过(我知道)。