4

我是 JSF 的新手 (2)。

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

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

4

2 回答 2

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");
}

或者,如果您想挂接所有请求,请使用过滤器

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

    // ...

}

也可以看看:

于 2012-11-21T11:26:35.947 回答
5

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

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

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

BalusC 在他的回答中概述了当今可以用来从 JSF 中基于请求的框架中获取一些行为的流行方法。JSF 2.2 将通过引入视图操作稍微扩展这种支持,这将preRenderViewEvent.

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

对于这个用例,JSF 将 URL 绑定到(Facelets)视图这一事实可以被覆盖,实际上您可以让 bean 直接响应请求。尽管出于稍微不同的目的,这实际上是我为JavaVDL 所做的,通过覆盖所谓的视图处理程序。

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

于 2012-11-21T13:28:50.240 回答