spring - 如何在 Spring 3.1 应用程序中声明 JSF 托管 bean?

标签 spring jsf

这是我第一次开发基于 Java EE 架构的应用程序,我正在使用

  • JSF 2.0
  • Spring 3.1
  • JPA 2.0

  • 我想问你一个我有点困惑的问题。我想声明我的 JSF 托管 bean,但是有很多解决方案可以处理这个约束:
  • 在 faces-config.xml 中声明 manged bean。
  • 用 @ManagedBean 注解覆盖我的 Controller 。
  • 用 @Controller 注释覆盖我的 Controller 。

  • 我的问题是:这三种解决方案有什么区别?!以及我应该对我的 ApplicationConfig.java 或/和 web.xml 进行哪些更改?!关于 Spring,我应该在我的 web.xml 中放置某种监听器吗?!

    我真的尝试阅读许多教程和示例,但每次我都发现自己被屏蔽了!

    最佳答案

    在集成 Spring 和 JSF 时,您真的不能成为这两种技术的初学者,因为它们不能很好地结合在一起。我对您的第一个也是最好的建议是,在尝试集成它们之前,先阅读几本关于 JSF 和 Spring 的书,并真正分别了解它们。

    话虽如此,JSF 是一个基于组件的 Web 框架,重点是 MVC。 Spring 是一个依赖注入(inject)和控制反转框架,并非 Web 应用程序独有。

    如果你不明白这三个术语是:

  • 基于组件的 Web 框架
  • 依赖注入(inject)
  • 控制反转

  • 然后我的建议是,您只需停止正在做的事情并立即开始阅读。

    整合这两件事的主要问题是两个框架之间的职责有一些重叠,需要解决。 JSF 作为一个独立的框架维护它自己的托管 bean 的范围,而不需要一个单独的 DI 框架。然而,当引入 Spring 时,自然会产生冲突。 Spring 除了 JSF 之外还管理自己的 Bean,因此要引用这些 ManagedBean 并将业务对象或 DAO 正确注入(inject)其中以供使用,JSF ManagedBeans 需要成为 Spring Controller。

    您可以使用 @Controller 声明 JSF ManagedBean。注解。 Spring 3 足够聪明,可以识别出它是一个 JSF 托管 bean,并且 bean 名称将是任何为 ManagedBean 声明的名称。
    @Controller
    @Scope("session")
    @ManagedBean(name="testBean")
    

    现在已经处理好了,下一个问题是 JSF 实现附带的讨厌的 EL Resolver。 EL Resolver 基本上就是这样做的,它解析在您的 XHTML/JSF 页面上遇到的 EL 表达式。引用 testBean 时但是它将无法正确解析此名称,因为它通过该名称引用 JSF 托管 bean,并且将无法找到具有您需要的所有 Spring 注入(inject)依赖项的 Spring Controller。

    Spring 3 通过为您提供一个自定义 EL Resolver 来代替与您的 JSF 实现捆绑在一起的那个来解决这个问题。您可以声明它用于faces-config.xml
    <application> 
       <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application>
    

    现在终于:

    should i put some kind of listeners in my web.xml ?!



    如果您只是集成 JSF + Spring 而不需要任何其他 Spring 控制的 Servlet 或不需要 Spring Security 集成,那么 没有您的 web.xml 中不需要任何额外内容.您只需要声明 FacesServlet 及其上下文参数,以及您的情况可能需要的任何其他第三方组件库 servlet。

    关于spring - 如何在 Spring 3.1 应用程序中声明 JSF 托管 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317288/

    相关文章:

    jsf - 在 MenuItem 对象上使用 setActionExpression() 和 setUrl() 不起作用?

    java - Spring-Integration TCP --> eh-cache 链

    mysql - 如何为多个表中的值添加 SQL 约束

    spring - @CreatedBy 和 @LastModifiedDate 不再与 ZonedDateTime 一起使用?

    java - Spring Shell - 使用和执行

    jsf - 将新行添加到 p :datatable then submit content

    java - 使用 Mockito 进行依赖注入(inject)的问题

    java - 如何使用RichFaces a4j :commandButton not using submit

    java - 为什么f是:param returning null?

    jsf - 如何使用 h :commandLink and f:ajax 渲染面板组