【问题标题】:Applet - Servlet CommunicationApplet - Servlet 通信
【发布时间】:2011-07-20 22:20:42
【问题描述】:

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

谢谢, 约瑟夫 G.

【问题讨论】:

  • 这是可能的,但前提是可以从外部通过给定端口(通常是 MySQL 的 3306 端口)访问数据库。大多数网站主机都关闭了这个端口。我会尝试对代表 servlet 的 URL 执行 GET/POST:stackoverflow.com/questions/2484119/…

标签: java database servlets applet communication


【解决方案1】:

首先,您必须承认您只能与下载您的小程序的服务器进行通信,其中包括端口号,除非您想弄乱权限、小程序签名和所有这些问题。这也不仅仅是 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 之外实现过(我知道)。

【讨论】:

  • 好了,这样就解决了向servlet发送数据的问题,但是从servlet向applet发送数据呢?
  • 使用connection.getInputStream()
  • 但是想象一下,applet 必须请求一个带有标识符的数据库条目,你怎么能将那个用户的标识符设置给 applet?是否可以使用小程序参数:cafeaulait.org/course/week5/16.html
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多