Servlets 访问Servlet中的ViewScope Managedbean
有人知道在Servlet中访问ViewScope ManagedBean的方法吗 例如,我可以通过以下方式访问SessionScoped ManagedBean:Servlets 访问Servlet中的ViewScope Managedbean,servlets,jsf-2,cdi,Servlets,Jsf 2,Cdi,有人知道在Servlet中访问ViewScope ManagedBean的方法吗 例如,我可以通过以下方式访问SessionScoped ManagedBean: MyBean bean = (MyBean) request.getSession().getAttribute("myBean"); 但是如果我将范围设置为ViewScoped,它将返回null。我知道原因是Servlet试图提前访问bean。但是我怎么才能解决这个问题呢 支持bean: @ManagedBean(name = "
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
}
Servlet:
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,它将不起作用
第一:为您的awnser提供THX Arjan Tijms: 第二件事是视图范围仅在有视图正在处理时存在。它不是凭空产生的 这是有道理的,我知道。我试着解释一下流程,希望你能理解我。我的英语不是最好的,但我认为它足够了。因此,让我们试试: 我向视图设置了一个请求,并因此设置了视图范围bean的一个实例。因此视图和bean是存在的,但是servlet不是必需的 现在,我与视图交互,并且必须渲染其他部分。现在这个部分需要servlet,我设置了对servlet的请求 因此:视图和bean作为一个实例存在,然后(在部分重新加载之后)我请求servlet Arjan Tijms: 您必须有一些代码将引用存储在请求范围中,Servlet可以在其中找到它并提取它 我想这是最重要的部分。正如你所说,我不能选择视图范围的bean作为会话属性。我非常感谢你告诉我这个事实,因为我以前不知道 现在我可以继续思考一个解决方案
感谢和问候有两件事需要注意 首先,您无法通过请求会话属性来获取视图范围bean的实例。那些豆子根本没有(直接)储存在那里 第二件事是视图范围仅在有视图正在处理时存在。它不是凭空产生的 Java代码中用于说明最后一条语句的示例:
// How to access i here???
while (foo) {
int i = 1;
// ...
}
由于i
是在循环中声明的,而循环之前访问它是没有意义的
对于Servlet,如果您的Servlet在同一个请求中调度到facesservlet,那么您只能在之后访问视图范围的bean,仍然不能直接访问。您必须有一些代码将引用存储在请求范围中,Servlet可以在其中找到它并提取它
要再次使用Java类比,如下所示:
int bar = 0;
while (foo) {
int i = 1;
// ...
bar = i;
}
// use bar here
如果您需要Servlet设置视图范围bean使用的内容,那么将该内容存储在请求范围中,并让视图范围bean在那里获取它。同样,Java对这一点的类比:
int bar = 23;
while (foo) {
int i = bar;
// ...
}
换句话说,使用一个共同的“通道”让这两个人互相交流。有两件事需要注意
首先,您无法通过请求会话属性来获取视图范围bean的实例。那些豆子根本没有(直接)储存在那里
第二件事是视图范围仅在有视图正在处理时存在。它不是凭空产生的
Java代码中用于说明最后一条语句的示例:
// How to access i here???
while (foo) {
int i = 1;
// ...
}
由于i
是在循环中声明的,而循环之前访问它是没有意义的
对于Servlet,如果您的Servlet在同一个请求中调度到facesservlet,那么您只能在之后访问视图范围的bean,仍然不能直接访问。您必须有一些代码将引用存储在请求范围中,Servlet可以在其中找到它并提取它
要再次使用Java类比,如下所示:
int bar = 0;
while (foo) {
int i = 1;
// ...
bar = i;
}
// use bar here
如果您需要Servlet设置视图范围bean使用的内容,那么将该内容存储在请求范围中,并让视图范围bean在那里获取它。同样,Java对这一点的类比:
int bar = 23;
while (foo) {
int i = bar;
// ...
}
换句话说,使用一个公共的“通道”让这两个相互通信。请分享你的托管bean代码,它也是导入部分。你的[cdi]
标记有点滑稽。使用CDI@Inject
是可能的,但您根本没有在支持bean上使用CDI。为什么会有这个标签?因为我认为CSI可能是我问题的解决方案D的可能重复项请也共享您的托管bean代码,它是导入部分。您的[cdi]
标记很有趣。使用CDI@Inject
是可能的,但您根本没有在支持bean上使用CDI。为什么会有这个标签?因为我认为CSI可能是我问题的解决方案D可能重复的