我正在开发一个混合使用 JSF 和 Spring-MVC 的项目。用户界面端点通过 JSF 前端 Controller (javax.faces.webapp.FacesServlet) 访问,而 REST 服务调用通过 Spring-MVC 前端 Controller (org.springframework.web.servlet.DispatcherServlet) 访问。更深的层是由 Spring 管理的(或多或少)。我不喜欢这种安排,但我无法改变它。
问题在于,当处理通过 JSF 前端 Controller 传入的请求时,Spring 的请求范围 bean 并未初始化。是否有一个现成的解决方案可以将 Spring 的 WebApplicationContext 与 JSF 机制集成,以便为每个请求初始化 Spring 请求范围的 bean,无论该请求是通过 JSF 还是 Spring servlet?
请您参考如下方法:
有两种方法可以将 JSF 与 Spring 集成,具体取决于您想要给予哪个框架最大的控制权:
JSF 前端 Controller : 一种方法是通过 JSF faces servlet 路由所有请求,并让 JSF 将它们路由到 Controller ,让 JSF 通过 faces-config 管理导航状态。然后将 Spring Bean 注入(inject) JSF 托管 Bean,并通过 SpringBeanFacesELResolver 使用值表达式从 Facelets View 访问 Spring Bean。
请参阅这篇文章 working example .
Spring 前端 Controller :将 spring 作为带有调度程序 servlet 的前端 Controller ,并放置 spring webflow。这是集成两个框架的首选且最强大的方式,请参阅 documentation 的这一部分.
Spring webflow 将管理导航状态,并且 faces 配置文件大部分为空。不需要JSF托管bean层,请求直接由webflow处理。
JSF 按钮中的操作直接触发 webflow 转换,并且 spring bean 也可以在值表达式中使用来构建 View 。通过此解决方案,与 Spring 的集成更加无缝,因为 Webflow 提供了比 JSF 导航机制更多的可能性:在转换之间触发 bean 方法、后重定向 get 模式以避免重复提交。
也就是说,用这个方向解决了 spring request 作用域 bean 的初始化问题,尽管替代方法是向 web.xml 添加 RequestContextListener 或 RequestContextFilter (请参阅第 3.4.4.1 of the docs 部分)。