applet可以与servlet的实例通信

时间:2010-04-02 11:58:27

标签: java servlets applet

我有一个使用Http(非套接字)与servlet通信的applet。当前,applet的每个实例(即,当每个applet由不同计算机上的不同客户端运行时),所有实例都与相同的servlet通信。我想要的是applet的每个实例都与相同的servlet 的不同实例进行通信。这可能吗?

3 个答案:

答案 0 :(得分:2)

您不希望在webapp的生命周期中拥有相同servlet的不同实例。通常的做法是使用HttpSession来区分客户端。您需要将HttpSession#getId()作为参数传递给相关的applet:

<param name="jsessionid" value="${pageContext.session.id}">

然后,在Applet中按如下方式连接Servlet:

String jsessionid = getParameter("jsessionid");
URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + jsessionid);
URLConnection connection = servlet.openConnection();
// ...

此处servleturl显然应与url-pattern中的servlet web.xml匹配。您也可以使用Cookie 设置URLConnection.setRequestProperty()请求标头。

最后,在Servlet中,要获取和存储客户端特定数据,请执行以下操作:

// Store:
request.getSession().setAttribute("data", data);
// Get:
Data data = (Data) request.getSession().getAttribute("data");

希望这有帮助。

答案 1 :(得分:1)

从您的问题看来,您的servlet似乎包含状态。每个applet都有一个session,其中包含servlet可以访问的servlet容器。您可以创建一个保存每个会话状态的对象,并将该对象作为attribute放置在调用者的会话中。这样,servlet容器可以在许多客户端之间共享一个servlet实例。

答案 2 :(得分:0)

处理特定于实例的操作的常用方法是将存储在会话范围中的信息由servlet容器提供,而不是将信息存储在servlet本身中。

要使其正常工作,您的applet必须正确发送Web容器提供的cookie或JSESSIONID属性,否则applet必须在servlet中请求实例特定的URL。

我建议您进一步熟悉Servlet API规范,以便了解有关可用内容的更多信息。

另请注意,某些应用程序服务器支持“客户端”的概念,“客户端”是使用从应用程序服务器提供的代码调用的程序,可直接访问应用程序服务器代码的内部。实际通信由applcation服务器提供的库处理,因此这很简单。 Glassfish和Trifork可以做到这一点。