Servlets 访问Servlet中的ViewScope 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 = "

有人知道在Servlet中访问ViewScope 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,它可以正常工作。如果我将处理程序设置为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可能重复的