我用状态会话Bean创建了一个简单的Java Web应用程序。我希望它为其每个新客户端维护一个单独的整数列表。
我的远程界面
package Emote.ejb;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface EmoteRemote {
void addElement(int e);
void removeElement(int e);
List<Integer> getElement();
}
我的状态豆
package Emote.ejb;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateful;
/**
*
* @author
*/
@Stateful
public class EmoteStateful implements EmoteRemote{
List<Integer> values = new ArrayList<>();
@Override
public void addElement(int e) {
values.add(e);
}
@Override
public void removeElement(int e) {
values.remove(new Integer(e));
}
@Override
public List<Integer> getElement() {
return values;
}
}
Jsp页面
<%@page import="java.util.List"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="Emote.ejb.EmoteRemote"%>
<!DOCTYPE html>
<%!
private static EmoteRemote values;
public void jspInit() {
try {
InitialContext ic = new InitialContext();
values = (EmoteRemote) ic.lookup("java:global/EmoteCaps/EmoteStateful");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
%>
<%
if (request.getParameter("AddNum") != null) {
int e = Integer.parseInt(request.getParameter("t1"));
values.addElement(e);
}
if (request.getParameter("remNum") != null) {
int e = Integer.parseInt(request.getParameter("t1"));
values.removeElement(e);
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Welcome</h1>
<form name="abc" method="post">
<input type="text" name="t1"/><br>
<input type="submit" value="Add" name="AddNum"><br>
<input type="submit" value="Remove" name="remNum">
<%
if(values != null){
List<Integer> nums = values.getElement();
for(int value : nums){
out.println("<br>" + value);
}
out.println("<br> Size" + nums.size());
}
%>
</form>
</body>
</html>
首先,我运行程序并将值添加到列表中。然后,我打开另一个浏览器,并通过其URL调用相同的程序。我希望它会返回一个新的数组列表,该列表为空,相反,它会返回与在先前浏览器实例中创建的数组列表相同的列表。
但是我想为每个客户端维护一个单独的数组列表。
如何为每个客户端创建一个单独的有状态bean实例并进行维护?
先谢谢了。