将Spring请求范围与JSF控制器集成

时间:2014-02-13 13:39:20

标签: spring jsf spring-mvc

我正在开发一个使用JSF和Spring-MVC混合的项目。用户界面端点通过JSF前端控制器(javax.faces.webapp.FacesServlet)访问,而REST服务调用则通过Spring-MVC前端控制器(org.springframework.web.servlet.DispatcherServlet)访问。更深层次是Spring管理(或多或少)。我不喜欢这种安排,但我无法改变它。

问题是,在处理通过JSF前端控制器进入的请求时,Spring的请求范围bean未初始化。是否有一个现成的解决方案,用于将Spring的WebApplicationContext与JSF机制集成,以便为每个请求初始化Spring请求范围的bean,无论该请求是通过JSF还是Spring servlet发出的?

1 个答案:

答案 0 :(得分:1)

有两种方法可以将JSF与Spring集成,具体取决于您希望最大程度控制的框架:

JSF前端控制器: 一种方法是通过JSF faces servlet路由所有请求,让JSF将它们路由到控制器,让JSF通过faces-config管理导航状态。然后将spring bean注入JSF托管bean,并通过SpringBeanFacesELResolver使用值表达式从facelets视图访问spring bean。

请参阅此帖子了解working example

Spring前端控制器:将spring作为带有调度程序servlet的前端控制器,并将spring webflow置于适当位置。这是集成两个框架的首选和最强大的方法,请参阅documentation的此部分。

Spring webflow将管理导航状态,而faces配置文件大多是空的。不需要JSF托管bean层,请求由webflow直接处理。

JSF按钮中的操作直接触发Webflow转换,spring bean也可以在值表达式中用于构建视图。使用此解决方案,与Spring的集成更加无缝,因为Webflow提供了比JSF导航机制更多的可能性:在转换之间触发bean方法,重定向后获取模式以避免双重提交。

初始化Spring请求作用域bean的问题就是用这个方向来解决的,另外一个替代方法是在web.xml中添加RequestContextListener或RequestContextFilter(参见3.4.4.1 of the docs部分)。