7

这是我第一次开发基于 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 中放置某种侦听器吗?!

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

4

1 回答 1

25

在集成 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。

于 2012-09-07T11:58:55.943 回答