JSF 2:直接调用托管bean

时间:2012-11-21 08:07:30

标签: java jsf jsf-2

我是JSF(2)的新手。

在Struts中,我们可以从app.action之类的URL调用操作。这会调用一个动作并返回一个结果页面,比如一个JSP(最初没有JSP / HTML)。

如何在JSF中完成同样的事情? (我知道如何从.xhtml调用一个动作) 即直接从URL调用托管bean并获取结果页面。

2 个答案:

答案 0 :(得分:5)

如果它正在准备初始GET请求的数据,只需在请求的(post)构造函数中执行该作业,或者查看与该页面关联的作用域托管bean。

@ManagedBean
@RequestScoped
public class Bean {

    public Bean() {
        // Here.
    }

    @PostConstruct
    public void init(){ 
        // Or here, certainly if you rely on injected dependencies like @EJB.
    }

}

如果它正在控制请求/响应并且可能会重定向/导航到另一个页面,那么请在preRenderView中执行该作业。

<f:event type="preRenderView" listener="#{bean.listener}" />

public void listener() {
    // ...

    // You want to redirect?
    externalContext.redirect(newURL);

    // Or you want to navigate?
    navigationHandler.handleNavigation(context, null, "newOutcome");
}

或者,如果您要挂钩所有请求,请使用filter

@WebFilter("/*")
public class MyFilter implements Filter {

    // ...

}

另见:

答案 1 :(得分:5)

您所询问的模式并不是JSF工作方式的原生模式。

基于请求的框架(如Struts和Spring MVC,以及较旧的基于Model-2 Servlet / JSP的方法确实可以这样工作。

在JSF中,首先是自动映射到请求URL的页面(视图)。没有一个bean直接映射到URL的概念,也没有一个bean的概念,它具有与视图强制1:1关系的框架。虽然有一个支持bean的概念,但这是按照惯例。对于JSF,所有bean都是“辅助bean”,仅由视图引用。

BalusC在他的回答中概述了当今可用于从JSF中基于请求的框架获取某些行为的流行方法。通过引入view actions,JSF 2.2将略微扩展这种支持,这正式化了preRenderViewEvent的一些典型用例。

也就是说,JSF是一个非常灵活的框架,很少有东西是一成不变的。可以通过精心设计的插件和装饰系统替换或添加许多JSF的行为。

对于此用例,可以覆盖JSF将URL绑定到(Facelets)视图这一事实,实际上您可以让bean直接对请求做出反应。虽然目的略有不同,但这是我基本上为JavaVDL所做的,通过覆盖所谓的视图处理程序。

你必须问问自己这是否真的是你想要做的,如果你想以这种方式工作,JSF是否是你的最佳选择。但是通过JavaVDL(sourcecode here)中概述的方法,您应该能够做到这一点。请注意,最后一种方法不适合初学者,如果你想自己解决这个问题需要相当多的JSF经验。 (如果您或其他任何人希望拥有此功能,请考虑在OmniFaces issues list为其创建问题。