JSF 2:直接调用托管bean

Ani*_*ney 4 java jsf jsf-2

我是JSF的新手(2).

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

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

Bal*_*usC 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.
    }

}
Run Code Online (Sandbox Code Playgroud)

如果它正在控制请求/响应并且可能重定向/导航到另一个页面,那么就完成这项工作preRenderView.

<f:event type="preRenderView" listener="#{bean.listener}" />
Run Code Online (Sandbox Code Playgroud)

public void listener() {
    // ...

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

    // Or you want to navigate?
    navigationHandler.handleNavigation(context, null, "newOutcome");
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要挂钩所有请求,请使用过滤器:

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

    // ...

}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Arj*_*jms 5

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

基于请求的框架(如Struts和Spring MVC)以及较旧的基于Model-2 Servlet/JSP的方法确实如此工作.

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

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

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

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

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