在集成Spring和JSF时,你真的不能成为任何一种技术的初学者,因为它们不能很好地协作。我对你的第一个也是最好的建议是在尝试集成它们之前,先阅读一些关于JSF和Spring的书籍,并且分别理解它们。
就这么说,JSF是一个基于组件的Web框架,其重点在于MVC。 Spring是一种不依赖于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。
很好的解释。谢谢! – Kris