有人知道在 Servlet 中访问 ViewScoped ManagedBean 的方法吗?
例如,我可以通过这种方式访问 SessionScoped ManagedBean:
MyBean bean = (MyBean) request.getSession().getAttribute("myBean");
但是,如果我将范围设置为 ViewScoped,它将返回 null。我知道原因是 Servlet 尝试尽早访问 bean。但是我该如何解决这个问题?
支持bean:
@ManagedBean(name = "statistikHandler")
@SessionScoped //or ViewScoped
public class StatistikHandler {
private Object someAttribute
//Do something nice here
//getter and setter
}
小服务程序:
public class ImageStreamServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("+++++ CALL THE IMAGESERVLET +++++");
//try to "inject" the Bean here
StatistikHandler handler = (StatistikHandler) request.getSession().getAttribute("statistikHandler");
try {
if (handler != null) {
//Do something with the ManagedBean
} else {
System.out.println("HANDLER NOT FOUND");
}
} finally {
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
而已。如果我将 StatistikHandler 设置为 SessionScope 它工作正常。如果我将处理程序设置为 ViewScoped 它不起作用。
第一: THX 为您的遮阳篷。
阿扬·蒂姆斯:
第二件事是视图范围仅在处理视图时才存在。它不能凭空出现。
这是有道理的,我知道。我试图解释流程,希望你能理解我。我的英语不是最好的,但我认为已经足够了。所以让我们试试:
我设置了对视图的请求,因此设置了视图范围 bean 的实例。所以视图和 bean 存在,但 servlet 不是必需的。
现在我与视图交互并且必须渲染另一部分。现在这部分需要 servlet,我设置了对 servlet 的请求。
所以:视图和 bean 作为实例存在,然后(在部分重新加载之后)我请求 servlet。
阿扬·蒂姆斯:
您将必须有一些代码将引用存储在请求范围内,Servlet 可以在其中找到并获取它。
恕我直言,这是重要的部分。正如你所说,我不能将视图范围的 bean 作为会话属性。我非常感谢你这个事实,因为我以前不知道。
现在我可以继续思考解决方案了。
谢谢并恭祝安康