【发布时间】:2014-08-12 14:07:44
【问题描述】:
我在我的应用程序中遇到了我不理解的行为。我有一个 servlet (Servlet1),它接受一个请求,使当前会话无效,创建一个新会话,然后将请求重定向到引用 @Named @SessionScoped bean (豆1)。 servlet 和 bean 都 @Inject 另一个 @SessionScoped bean (SharedBean)。我第一次访问我的 servlet URL 时一切正常。但是,我第二次访问 URL 时,@Named @SessionScoped bean 正在创建一个新的 sharedbean 实例。
所以我希望发生的事情是这样的:
- Servlet1 创建一个新会话
- Servlet1 初始化 SharedBean
- Bean1 访问 SharedBean
这在我第一次访问我的 servlet URL 时正确发生,但在第二次调用时发生的是:
- Servlet1 创建一个新会话
- Servlet1 初始化 SharedBean
- Bean1 创建一个新的 SharedBean
这对我来说似乎不是正确的行为。我知道我在这里遗漏了一些东西,如果有人向我解释,我将不胜感激。代码如下:
Servlet1:
@WebServlet
public class Servlet1 extends HttpServlet
{
@Inject
private SharedBean sbean;
public doGet(HttpServeltRequest request, HttpServletResponse response)
{
HttpSession session = request.getSession();
session.invalidate();
session = request.getSession(true);
this.sbean.initialize();
response.sendRedirect(newURL);
}
}
豆1:
@Named
@SessionScoped
public class Bean1 implements Serializable
{
@Inject
private SharedBean sbean;
public void actionMethod()
{
this.sbean.execute(); // New instance being created here on 2nd access!
}
}
SharedBean:
@SessionScoped
public class SharedBean implements Serializable
{
public void initialize() { /* do some work */ }
public void exeucte() { /* do some work */ }
}
【问题讨论】: