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

时间:2012-09-07 11:31:54

标签: spring jsf

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

  • JSF 2.0
  • Spring 3.1
  • JPA 2.0

我想问你一个我有点困惑的问题。我想声明我的JSF托管bean,但有很多解决方案来处理这个约束:

  1. 在faces-config.xml中声明manged bean。
  2. 使用@ManagedBean批注覆盖我的控制器。
  3. 使用@Controller注释覆盖我的控制器。
  4. 我的问题是:这三种解决方案之间的差异是什么?我应该在ApplicationConfig.java或/和web.xml上做些什么改变?关于Spring,我应该在我的web.xml中放一些听众吗?!

    我真的试过阅读很多教程和示例,但每次我发现自己被阻止了!

1 个答案:

答案 0 :(得分:23)

在整合Spring和JSF时,你真的不能成为这两种技术的初学者,因为它们不能很好地融合在一起。我给你的第一个也是最好的建议是获得一些关于JSF和Spring的书籍,并且在尝试集成它们之前要真正理解它们。

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

如果您不理解这三个术语是:

  • 基于组件的Web框架

  • 依赖注入

  • 控制倒置

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

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

您可以使用@Controller注释声明JSF ManagedBean。 Spring 3非常聪明,可以识别出它是一个JSF托管bean,bean名称将是为ManagedBean声明的名称。

@Controller
@Scope("session")
@ManagedBean(name="testBean")

既然已经解决了这个问题,那么下一个问题就是你的JSF实现附带的讨厌的EL Resolver。 EL解析器基本上就是这样,它解析了XHTML / JSF页面上遇到的EL表达式。引用testBean时,它将无法正确解析此名称,因为它是指该名称的JSF托管bean,并且无法找到所需的Spring注入依赖项的Spring Controller

Spring 3通过为您提供一个自定义EL解析器来代替与JSF实现捆绑在一起的解析器来解决这个问题。您可以声明它在faces-config.xml

中使用
<application> 
   <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application>

现在终于:

  

我应该在我的web.xml中放置一些监听器吗?!

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