在集成 Spring 和 JSF 时,您实际上不能成为这两种技术的初学者,因为它们不能很好地协同工作。我给您的第一个也是最好的建议是,在尝试集成 JSF 和 Spring 之前,先阅读几本有关 JSF 和 Spring 的书,并分别真正了解它们。
话虽如此,JSF 是一个基于组件的 Web 框架,重点是 MVC。 Spring 是一个依赖注入和控制反转框架,并不专用于 Web 应用程序。
如果你不明白这三个术语是:
那么我的建议是你停止正在做的事情并立即开始阅读。
集成这两件事的主要问题是两个框架之间需要解决的职责存在一些重叠。 JSF 作为一个独立的框架维护其自己的托管 bean 的范围,而不需要单独的 DI 框架。然而引入Spring的时候自然会出现冲突。 Spring 除了 JSF 之外还管理自己的 Bean,因此要引用这些 ManagedBean 并将业务对象或 DAO 正确注入其中以供使用,JSF ManagedBean 需要成为 Spring 控制器。
您可以使用以下方式声明 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 控制器。
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 集成,那么no你不需要任何额外的东西web.xml
。您只需要声明 FacesServlet 及其上下文参数,以及您的情况可能需要的任何其他第三方组件库 servlet。