【问题标题】:JSF 2: invoking managed bean directlyJSF 2:直接调用托管 bean
【发布时间】:2012-11-09 10:37:31
【问题描述】:

我是 JSF 的新手 (2)。

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

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

【问题讨论】:

  • 没有。你到底在尝试什么?
  • 就像 [link]localhost:8080/app.jsf 必须调用一个托管bean,最后我得到了结果页。所以它应该在初始请求不存在任何视图的情况下完成
  • 查看@BalusC 答案并在您的 xhtml/jsp 中添加一些组件来调用该 Bean。

标签: java jsf jsf-2


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    如果它正在为初始 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 {
    
        // ...
    
    }
    

    另见:

    【讨论】:

    • 我认为 AnilHoney 可能正在搜索 @WebServlet 而不是 @Webfilter 来处理特定模式?
    • @Aquillo:过滤器用于修改请求,servlet 用于控制对视图的请求。 OP 的情况(根本没有“视图”)听起来太像他想修改请求了。
    • 当我读到这个问题时,他想在登陆所需的视图页面之前执行一些逻辑。不过,我会推荐您的第一个给定选项,只要可以在加载页面时执行相应的逻辑,而不是在加载页面之前执行。
    • @Aquillo:据我了解,所需的视图页面只有在执行逻辑之后 才知道。那么 servlet 肯定是不合适的。
    • 哦,对不起,我不明白 OP 会使用这个逻辑来确定他需要加载哪个页面。在这种情况下,您可以定义一个过滤器。
    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 2013-01-24
    • 2023-03-05
    • 2016-07-09
    • 2013-09-06
    • 2012-10-13
    • 2011-07-10
    • 2012-10-03
    相关资源
    最近更新 更多