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

ayo*_*ntu 7 jsf spring

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

  • JSF 2.0
  • 春季3.1
  • JPA 2.0

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

  1. 在faces-config.xml中声明manged bean.
  2. 使用@ManagedBean批注覆盖我的控制器.
  3. 使用@Controller注释覆盖我的控制器.

我的问题是:这三种解决方案之间的差异是什么?我应该在ApplicationConfig.java或/和web.xml上做些什么改变?关于Spring,我应该在我的web.xml中放一些监听器吗?

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

map*_*aft 24

在集成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")
Run Code Online (Sandbox Code Playgroud)

既然已经处理了,那么下一个问题就是你的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>
Run Code Online (Sandbox Code Playgroud)

现在终于:

我应该在我的web.xml中放一些听众吗?

如果你只是整合JSF +春,而不需要任何其他弹簧控制servlet或无需Spring Security的集成则没有,你什么都不需要你额外的web.xml.您只需要声明FacesServlet及其上下文参数,以及您的情况可能需要的任何其他第三方组件库servlet.

  • 很棒的解释.谢谢! (2认同)