2012-09-07 43 views
7

基于一个Java EE架构开发的应用程序这是我第一次经历,我使用如何在Spring 3.1应用程序中声明JSF托管bean?

  • JSF 2.0
  • 春3.1
  • JPA 2.0

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

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

我的问题是:这三种解决方案有什么不同?以及我应该在ApplicationConfig.java或/和web.xml中做什么更改?!关于Spring,我应该在web.xml中添加一些监听器吗?!

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

回答

23

在集成Spring和JSF时,你真的不能成为任何一种技术的初学者,因为它们不能很好地协作。我对你的第一个也是最好的建议是在尝试集成它们之前,先阅读一些关于JSF和Spring的书籍,并且分别理解它们。

就这么说,JSF是一个基于组件的Web框架,其重点在于MVC。 Spring是一种不依赖于Web应用程序的依赖注入和控制反转框架。

如果你不明白,这三个条件是:控制

  • 基于组件的Web框架

  • 依赖注入

  • 反转

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

整合这两件事情的主要问题是需要解决的两个框架之间的责任重叠。 JSF作为一个独立的框架来维护自己托管的bean的范围,而不需要单独的DI框架。然而,当介绍Spring时,自然会有冲突。除了JSF,Spring管理自己的Beans,所以为了引用这些ManagedBeans并将业务对象或DAO正确注入到它们中以供使用,JSF ManagedBeans需要成为Spring控制器。

您可以用@Controller注释声明JSF ManagedBean。 Spring 3足够聪明地认识到它是一个JSF托管bean,并且该bean名称将是ManagedBean声明的任何名称。

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

现在,这是处理,接下来的问题是,你的JSF实现传来那个讨厌的EL解析器。 EL解析器基本上就是这样做的,它解决了在XHTML/JSF页面上遇到的EL表达式。当引用testBean时,它将无法正确解析该名称,因为它是通过该名称引用JSF托管bean,并且无法找到具有所需的所有Spring注入依赖项的Spring Controller。

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

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

现在总算:

要我把某种听众在我的web.xml?!

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

+2

很好的解释。谢谢! – Kris