0

有人知道在 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 作为会话属性。我非常感谢你这个事实,因为我以前不知道。

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

谢谢并恭祝安康

4

1 回答 1

3

有两件事需要注意。

第一个是您无法通过请求会话属性来获取视图范围 bean 的实例。这些 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;
    // ...
}

换句话说,使用一个共同的“通道”让这两者相互交流。

于 2012-09-02T08:40:12.763 回答