Может ли апплет обмениваться данными с экземпляром сервлета
У меня есть апплет, который связывается с сервлетом, используя Http (Not sockets). В настоящее время каждый экземпляр апплета (т.е. Когда каждый апплет запускается другим клиентом на другом компьютере), все экземпляры взаимодействуют с одним и тем же сервлетом. Я хочу, чтобы каждый экземпляр апплета связывался с разными экземплярами того же сервлета. Возможно ли это?
Ответы
Ответ 1
Вы не хотите иметь разные экземпляры одного и того же сервлета в жизни webapp. Обычная практика заключается в использовании HttpSession
для различения между клиентами. Вам необходимо передать HttpSession#getId()
в качестве параметра для рассматриваемого апплета:
<param name="jsessionid" value="${pageContext.session.id}">
Затем в апплете соедините сервлет следующим образом:
String jsessionid = getParameter("jsessionid");
URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + jsessionid);
URLConnection connection = servlet.openConnection();
// ...
Здесь servleturl
явно должен соответствовать сервлету url-pattern
в web.xml
. Вы также можете установить заголовок запроса Cookie
, используя URLConnection.setRequestProperty()
.
Наконец, в сервлете, чтобы получить и хранить конкретные данные клиента, сделайте следующее:
// Store:
request.getSession().setAttribute("data", data);
// Get:
Data data = (Data) request.getSession().getAttribute("data");
Надеюсь, что это поможет.
Ответ 2
Из вашего вопроса кажется, что ваш сервлет содержит состояние. Каждый апплет будет session с контейнером сервлета, доступ к которому может получить ваш сервлет. Вы можете создать объект, который содержит состояние за сеанс, и поместить этот объект в attribute в сеансе вызывающего. Таким образом, контейнер сервлетов может совместно использовать один экземпляр сервлета среди многих клиентов.
Ответ 3
Обычный способ обработки специфичных для экземпляра действий заключается в том, чтобы информация, хранящаяся в области сеанса, предоставляемая контейнером сервлетов, а не путем хранения информации в самом сервлете.
Чтобы он работал, ваш апплет должен правильно отправлять файлы cookie или атрибут JSESSIONID, как это предусмотрено веб-контейнером, или апплет должен запрашивать конкретный URL-адрес экземпляра внутри сервлета.
Я бы посоветовал вам дополнительно ознакомиться с спецификацией API сервлета, чтобы узнать больше о том, что доступно для вас.
Также обратите внимание, что некоторые серверы приложений поддерживают понятие "клиенты", которые являются программами, вызываемыми кодом, обслуживаемым с сервера приложений, который имеет прямой доступ к внутренней части кода сервера приложений. Фактическое общение обрабатывается библиотеками, также предоставляемыми сервером applcation, поэтому это просто. Glassfish и Trifork могут это сделать.