我放弃了让applet与数据库直接通信的早期追求,尽管用户和网页都说这是可能的。我现在正在尝试让我的applet传递在文本字段中输入或由复选框指示的信息(字符串和布尔值格式),并将其提供给servlet,然后servlet将其适当地存储在数据库中。我已经构建了applet前端- GUI -以及servlet -数据库连接。唯一的问题是两者之间的联系,即applet和servlet。如何将字符串数据从applet传递到servlet?
谢谢,约瑟夫·G
发布于 2011-07-21 07:21:03
首先,您必须承认,您只能与下载applet的服务器进行通信,包括端口号,除非您想要搞乱权限、applet签名和所有那些恶意的东西。这也不仅仅是一个小程序的限制,同样适用于闪存和JavaScript (尽管在JavaScript的情况下有一些技巧可以绕过它)。
在Applet上使用"getCodeBase()“或"getDocumentBase()”方法都会得到一个网址,您可以从中获取构建新网址所需的组件部分,以便调用servlet。
因此,必须从承载servlet的同一台服务器上提供Applet。
例如,如果您的Applet在以下页面中:
http://www.example.com/myapplet.html
...it意味着您可以调用任何以
http://www.example.com/
轻松使用...relatively。
下面是一个未经测试的粗糙示例,展示了如何调用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:
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之外实现过(据我所知)。
发布于 2011-07-21 07:03:57
嗯,我猜applet和servlet运行在两个独立的Java进程中。在这种情况下,您将不得不使用一些远程处理技术,例如对localhost的http调用。事实上,这正是servlet的主要用途:接受和处理http请求。
https://stackoverflow.com/questions/6769255
复制相似问题