有人知道在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
}
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,它可以正常工作。如果我将Handler设置为ViewScoped则不起作用。
首先:你的芒果THX。
Arjan Tijms:
第二件事是视图范围仅在处理视图时存在。它不能凭空而来。
这是有道理的,我知道。我试着解释一下这个流程,希望你能理解我。我的英语不是最好的,但我认为它足够了。所以试试吧:
我为视图设置了一个请求,因此设置了一个视图范围bean的实例。所以视图和bean存在但servlet不需要jet。
现在我与视图互动,并且必须渲染另一部分。现在这部分需要servlet,我向servlet设置了一个请求。
所以:View和bean作为一个实例存在,而且(在部分重新加载之后)我请求servlet。
Arjan Tijms:
恕我直言,这是重要的一部分。正如你所说,我不能把视图范围的bean作为会话属性。我非常感谢你这个事实因为我之前不知道。您必须有一些代码在请求范围中存储引用,Servlet可以在其中找到并获取它。
现在我可以继续思考一个解决方案。
谢谢和问候
答案 0 :(得分:3)
有两件事需要注意。
首先,您无法通过请求会话属性来获取视图范围bean的实例。那些豆根本就没有(直接)存储在那里。
第二件事是视图范围仅在处理视图时存在。它不能凭空而来。
Java代码中的一个示例,用于说明最后一条语句:
// How to access i here???
while (foo) {
int i = 1;
// ...
}
在i
循环内声明while
时,在循环之前访问它是没有意义的。
对于Servlet,如果您的Servlet在与Faces Servlet相同的请求中进行调度,那么您之后只能访问视图范围的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;
// ...
}
换句话说,使用一个共同的“渠道”让这两个人相互沟通。