首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Applet - Servlet通信

Applet - Servlet通信
EN

Stack Overflow用户
提问于 2011-07-21 06:20:43
回答 2查看 7.3K关注 0票数 2

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

谢谢,约瑟夫·G

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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实例中调用的。

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

代码语言:javascript
复制
public void doPost(HttpServletRequest req, HttpServletResponse res) {

   BufferedReader reader = req.getReader();
   String line = reader.readLine();
   System.out.println("servlet received text: " + line);

}

当然,这只是一种方法。您还可以获取您的输入并构建一个查询字符串,如下所示(未显示URLEncoding):

代码语言:javascript
复制
String queryString = "inputa=" + view.getInputA() + "&inputb=" + view.getInputB();

并将其附加到您的URL:

代码语言:javascript
复制
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之外实现过(据我所知)。

票数 2
EN

Stack Overflow用户

发布于 2011-07-21 07:03:57

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6769255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档