访问Servlet中的ViewScoped Managedbean

时间:2012-09-01 12:48:10

标签: servlets jsf-2 cdi

有人知道在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:

  

您必须有一些代码在请求范围中存储引用,Servlet可以在其​​中找到并获取它。

恕我直言,这是重要的一部分。正如你所说,我不能把视图范围的bean作为会话属性。我非常感谢你这个事实因为我之前不知道。

现在我可以继续思考一个解决方案。

谢谢和问候

1 个答案:

答案 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;
    // ...
}

换句话说,使用一个共同的“渠道”让这两个人相互沟通。