java - Applet - Servlet 通信

标签 java database servlets applet communication

我已经放弃了之前让小程序直接与数据库通信的追求,尽管用户和网页都说这是可能的。我现在试图让我的小程序传递在文本字段中输入或由复选框指示的信息(字符串和 boolean 格式),并将其提供给 servlet,然后 servlet 将其适本地存储在数据库中。我已经构建了 applet 前端 - GUI - 以及 servlet - 数据库连接。唯一的问题是 applet 和 servlet 这两者之间的链接。如何将字符串数据从 applet 传递到 servlet?

谢谢, 约瑟夫·G.

最佳答案

首先,您必须承认您只能与下载小程序的服务器进行通信,其中包括端口号,除非您想搞乱权限、小程序签名和所有那些胡言乱语。这不仅仅是 Applet 的限制,同样适用于 Flash 和 JavaScript(尽管就 JavaScript 而言,有一些技巧可以绕过它)。

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

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

例如如果您的小程序位于以下页面:

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() 并从请求中读取输入流来获取发送的文本(不显示异常处理,仅读取第一行输入):

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 servletURL = new URL(codeBase.getProtocol(), codeBase.getHost(), codeBase.getPort(), "/myServlet?" + queryString);

然而,现在构建某种字符串并将其流式传输到 servlet 似乎相当常见。

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

同样,您实际上可以使用 Java 序列化并将二进制流传输到 Servlet,然后 Servlet 使用 Java 序列化来创建适当的 Java 对象。但是,如果您坚持使用 JSON 之类的内容,则意味着您的 servlet 更易于重用,因为 Java 序列化从未在 Java 之外实现过(据我所知)。

关于java - Applet - Servlet 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6769255/

相关文章:

java - JPA.withTransaction 执行其他 Controller 方法错误 : Global. java:39: 错误: 'void' 此处不允许类型

java - 我想在弹出窗口中显示旋转结果而不是 toast

sql - 查询要与两个值进行比较的列

java - servlet : Caused by: java. lang.IllegalArgumentException:无法转换参数:null

java - 如何使用 servlet 更新 JSP 中的值?

java - 多次使用准备好的语句是否资源安全?

java - Maven组装插件添加依赖项

c# - 没有数据库就可以存储信息吗?

Php通过html表单选择行,并写入txt文件

java - 在浏览器中显示pdf文件?