JSF 2: 直接调用托管的Bean

4

我是JSF(2)的新手。

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

在JSF中如何做同样的事情呢?(我知道如何从一个 .xhtml 文件中调用一个动作)即:直接从 URL 调用一个托管的 bean 并得到一个结果页面。


不,你具体是想做什么? - Johny T Koshy
就像[链接]http://localhost:8080/app.jsf必须调用一个托管bean,最终我得到了结果页面,无论它是什么。因此,在初始请求时应该在不存在任何视图的情况下完成。 - AnilHoney
请参考@BalusC的答案,并在您的xhtml/jsp中添加一些组件来调用该Bean。 - Johny T Koshy
2个回答

5
如果准备数据用于初始GET请求,只需在关联页面的(post)构造函数或视图范围托管bean中完成工作。请保留HTML标记。
@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 {

    // ...

}

另请参阅:


不是使用@Webfilter,我认为AnilHoney可能在寻找一个@WebServlet来处理特定的模式? - Menno
@Aquillo:过滤器用于修改请求,而Servlet用于控制对视图的请求。OP的情况(根本没有“视图”)听起来太像他想要修改请求了。 - BalusC
1
根据我的理解,他想在到达所需的视图页面之前执行一些逻辑。尽管如此,我仍然建议您选择第一个选项,只要相应的逻辑可以在页面加载时执行,而不是在页面加载之前执行。 - Menno
据我所理解,所需的视图页面仅在执行逻辑之后才知道。因此,Servlet 明显不合适。@Aquillo - BalusC
哦,很抱歉,我没理解到 OP 会使用这个逻辑来确定需要加载哪个页面。在这种情况下,你定义一个筛选器是正确的。 - Menno
对不起各位,很抱歉回复迟了,非常感谢你们的支持。一个简单的例子就是我想要通过[链接]:http://localhost:8080/myapp/homepage.jsf来访问我的网站首页,但必须避免使用任何index.jsp进行重定向或转发的概念,例如JSP:forward(必须无需使用任何JSP完成)。 - AnilHoney

5
你所询问的模式实际上与JSF的工作方式并不相符。
像Struts和Spring MVC这样的基于请求的框架,以及较早的基于Model-2 Servlet/JSP的方法确实是这样工作的。
在JSF中,首先页面(视图)会自动映射到一个请求URL。没有一个直接映射到URL的bean的概念,也没有一个具有与视图强制性1:1关系的bean的概念。虽然有后备bean的概念,但这只是按照约定而定的。对于JSF来说,所有的bean都是“helper beans”,仅被视图引用。
BalusC在他的答案中概述了可以在JSF中使用的一些流行方式,以获得一些基于请求的框架的行为。JSF 2.2将通过引入“视图操作”略微扩展此支持,这将规范一些典型的preRenderViewEvent用例。

话虽如此,JSF 是一个非常灵活的框架,很少有事情是固定的。通过一个复杂的插件和装饰器系统,许多 JSF 的行为可以被替换或添加。

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

你必须自问这是否是你真正想做的事情,如果你想以这种方式工作,那么JSF是否是最好的选择。但是通过JavaVDL中概述的方法(源代码在此),你应该能够实现这一点。请注意,这种最后的方法不适合初学者,如果你想自己完成它,需要相当多的JSF经验。(如果你或其他人想要这种功能,请考虑在OmniFaces问题列表中创建一个问题)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接