Applet - Servlet通信

时间:2011-07-20 22:20:43

标签: java database servlets applet communication

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

谢谢, 约瑟夫G。

2 个答案:

答案 0 :(得分:2)

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

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

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

e.g。如果您的Applet位于以下页面中:

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

...这意味着您可以调用任何以

开头的网址

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 not shown):

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

并将其附加到您的网址:

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之外实现(我知道)。

答案 1 :(得分:1)

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