在集成 Spring 和 JSF 时,您真的不能成为这两种技术的初学者,因为它们不能很好地结合使用。我对您的第一个也是最好的建议是,在尝试集成它们之前,先阅读几本关于 JSF 和 Spring 的书籍,并真正分别了解它们。
话虽如此,JSF 是一个基于组件的 Web 框架,重点是 MVC。Spring 是一个依赖注入和控制反转框架,并非 Web 应用程序独有。
如果你不明白这三个术语是:
然后我的建议是,您只需停止正在做的事情并立即开始阅读。
整合这两件事的主要问题是两个框架之间的职责有一些重叠,需要解决。JSF 作为一个独立的框架维护它自己的托管 bean 的范围,而不需要一个单独的 DI 框架。然而,当引入 Spring 时,自然会产生冲突。Spring 除了 JSF 之外还管理自己的 Bean,因此要引用这些 ManagedBean 并将业务对象或 DAO 正确注入其中以供使用,JSF ManagedBeans 需要成为 Spring Controller。
您可以使用注释声明 JSF ManagedBean @Controller
。Spring 3 足够聪明,可以识别出它是一个 JSF 托管 bean,并且 bean 名称将是任何为 ManagedBean 声明的名称。
@Controller
@Scope("session")
@ManagedBean(name="testBean")
现在已经处理好了,下一个问题是 JSF 实现附带的讨厌的 EL Resolver。EL Resolver 基本上就是这样做的,它解析在您的 XHTML/JSF 页面上遇到的 EL 表达式。但是,当引用testBean
时,它将无法正确解析此名称,因为它通过该名称引用 JSF 托管 bean,并且将无法找到具有您需要的所有 Spring 注入依赖项的 Spring Controller。
Spring 3 通过为您提供一个自定义 EL Resolver 来代替与您的 JSF 实现捆绑在一起的那个来解决这个问题。您可以声明它用于faces-config.xml
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
现在终于:
我应该在我的 web.xml 中放置某种监听器吗?!
如果您只是集成 JSF + Spring 而不需要任何其他 Spring 控制的 Servlet 或不需要 Spring Security 集成,那么您不需要在web.xml
. 您只需要声明 FacesServlet 及其上下文参数,以及您的情况可能需要的任何其他第三方组件库 servlet。