JSF 2:直接调用托管bean

我是JSF新手(2)。

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

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

您询问的模式并不是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经验。 (如果您或其他任何人希望拥有此function,请考虑在OmniFaces问题列表中为其创建问题 )

如果它正在准备初始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执行该作业。

  

 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 { // ... } 

也可以看看:

  • 有没有简单的方法来预处理和重定向GET请求?
  • 如何在JSF中进行重定向