【问题标题】:Resource Handler problems with JSF2 + Richfaces4 + SpringMVC + WebFlow (SWF)JSF 2 + Richfaces 4 + Spring MVC + WebFlow (SWF) 的资源处理程序问题
【发布时间】:2011-06-02 23:37:18
【问题描述】:

我一直在尝试使上述设置工作好几天,但收效甚微。我的问题似乎与资源处理程序有关。 IE。

<h:outputStylesheet name="header.css" library="page"/>

不起作用,RichFaces 也不能解析它在内部使用的任何资源。所以我做了一些调查,上面的标签应该解析为“/project/javax.faces.resource/header.css?ln=page”,但事实并非如此。 2个明显的问题正在发生。

1) 资源处理程序链中的某些东西,可能是richfaces 处理程序,期望将“.jsf”后缀添加到请求的 url,这在使用带有 JSF2 和 RichFaces 3.3.x 的旧 EXTERNAL facelets 时确实会发生,但是 Richfaces 4 和内置的 facelets 不会发生。结果,其中一个处理程序(我相信是 RichFaces)正在剥离 .css 后缀,认为它是一个额外的后缀,就像它过去的工作方式一样。 (因此这会导致缺少 MIME 类型错误)

2) 解析库和名称属性时,将在当前路径而不是 servlet 上下文根下解析。 IE。它应该解析为“/project/javax.faces.resource/...”,但在查看 /index 目录中的页面时,它会解析为“/project/index/javax.faces.resource/...”。

谁能在这里给我一些见解?我正在用我的头撞到墙上,没有做任何真正的地面。

顺便说一下,这是我的基本配置......

faces-config.xml

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

web.xml

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>Spring MVC Servlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Spring MVC Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

servlet-context.xml

<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <beans:property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
    <beans:property name="prefix" value="/WEB-INF/content/" />
    <beans:property name="suffix" value=".xhtml" />
</beans:bean>

<beans:bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
        <beans:property name="order" value="2"/>
        <beans:property name="flowRegistry" ref="flowRegistry" />
</beans:bean>

<beans:bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
    <beans:property name="flowExecutor" ref="flowExecutor" />
    <beans:property name="ajaxHandler">
        <beans:bean class="org.springframework.faces.richfaces.RichFacesAjaxHandler"/>
    </beans:property>
</beans:bean>

<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <beans:property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
    <beans:property name="prefix" value="/WEB-INF/content/" />
    <beans:property name="suffix" value=".xhtml" />
</beans:bean>


<beans:bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <beans:property name="order" value="3" />
    <beans:property name="alwaysUseFullPath" value="true" />
    <beans:property name="mappings">
        <beans:value>
        </beans:value>
    </beans:property>
    <beans:property name="defaultHandler">
        <beans:bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
    </beans:property>
</beans:bean>

webflow-config.xml

<faces:resources/>

<beans:bean id="facesContextListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener"/>

<flow-executor id="flowExecutor">
    <flow-execution-listeners>
        <listener ref="facesContextListener"/>
    </flow-execution-listeners>
</flow-executor>

<flow-registry id="flowRegistry" base-path="/WEB-INF/content" flow-builder-services="flowBuilderServices">
    <flow-location-pattern value="/**/flow.xml" />
</flow-registry>

<flow-builder-services id="flowBuilderServices" development="true" />

【问题讨论】:

  • 好的,所以我解决了一半的问题。看来您不能使用 SimpleUrlHandlerMapping。看起来这是在错误的上下文中解析资源的原因(即在应该只是 / 时使用 /index )。知道我是否只能解决 .jsf 扩展的问题。
  • 我还没有取得很大的进步......但是(不是任何人都在读这个);我现在最终选择了 RichFaces 3.3.3,但我仍然致力于解决这个问题。
  • 因此,将调度程序 servlet 映射到 /*, 应该解析为 /Servlet/javax.faces.resource /file.gif?ln=目录名。我知道资源处理程序正在工作,因为直接将已解析的资源 URL 放入其中会起作用。唯一的问题是 spring 上下文映射被插入到解析的 URL 中。例如。 /Servlet/*/javax.faces.resource/file.gif?ln=dirname 所以要么问题是正在插入 Spring 上下文,要么资源处理程序应该忽略 /javax.faces.resource 之前的所有内容

标签: spring spring-mvc jsf-2 richfaces spring-webflow


【解决方案1】:

好的,所以我终于完成了这个……在 Rich Faces 的帮助下。所以对于任何有兴趣在 Tomcat6+ 上运行 JSF2 + Rich Faces + SpringMVC + Spring WebFlow 的人来说,这就是你所需要的......

WEB.XML

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/appServlet/servletContext.xml</param-value>
</context-param>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<servlet>
    <servlet-name>faces</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>faces</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
    <param-value>*.xhtml</param-value>
</context-param>

servletContext.xml

    <mvc:annotation-driven />
    <context:component-scan base-package="com.package.subpackage"/>

<mvc:resources location="/" mapping="/resources/**" />

<faces:resources order="0" />

<bean id="flowHandlerMapping"
    class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
    <property name="flowRegistry" ref="flowRegistry" />
    <property name="order" value="3" />
    <property name="defaultHandler" ref="defaultHandler" />
</bean>

<bean class="org.springframework.faces.webflow.JsfFlowHandlerAdapter">
    <property name="flowExecutor" ref="flowExecutor" />
    <property name="ajaxHandler">
        <bean class="org.springframework.faces.richfaces.RichFacesAjaxHandler" />
    </property>
</bean>

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
    <property name="prefix" value="/WEB-INF/pageContent/" />
    <property name="suffix" value=".xhtml" />
</bean>

springmvc-config.xml

<bean name="jsfResourceHandlerHack" class="org.springframework.faces.webflow.JsfResourceRequestHandler" />

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="order" value="1" />
    <property name="mappings">
        <value>
            /rfRes/**=jsfResourceHandlerHack
        </value>
    </property>
</bean>

spring-webflow-config.xml

    <!-- Executes flows: the central entry point into the Spring Web Flow system -->
<flow-executor id="flowExecutor">
    <flow-execution-listeners>
        <listener ref="facesContextListener"/>
    </flow-execution-listeners>
</flow-executor>

<flow-registry id="flowRegistry" base-path="/WEB-INF/content" flow-builder-services="facesFlowBuilderServices">
    <flow-location-pattern value="/**/flow.xml" />
    <flow-location id="parent-flow" path="parent-flow.xml"/>
</flow-registry>

<faces:flow-builder-services id="facesFlowBuilderServices" development="true"/>
<beans:bean name="facesContextListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener" />

spring-beans-config.xml `

<bean name="defaultHandler" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" >

</bean>`

Jar 版本如下... 春天核心 3.0.5 Spring Web Flow 2.2.1 JSF 注册机 2.0.3 最重要的是…… 丰富的面孔 4.0.0.20101226-M5

所以制作这项工作的关键似乎是 RichFaces 的版本。 RichFaces 4 还没有准备好生产,所以希望一旦发生这种情况,一切都会顺利进行,但与此同时,现在 Milestone 5 已经发布,这个设置似乎可以工作。要注意的部分是 JsfResourceHandlerHack 映射。 Richfaces 尝试默认使用关键字“rfRes”来解析它的一些资源(我相信是动态创建的)。我遇到的问题是“rfRes”键没有映射到资源处理程序。有一种方法可以配置它,但这似乎不起作用。所以快速修复是创建另一个资源处理程序实例并手动映射它。所以对于任何有兴趣的人来说,它就在那里。

【讨论】:

  • 感谢@Stoney,这太棒了!非常有用,正是我需要的。我正在使用 Primefaces,但仍然如此。我刚刚删除了 servletContext.xml 中的 。最好的问候。
  • 另一个需要指出的重要细节是,在 /rfRes/**=jsfResourceHandlerHack 映射之上的 order 值必须低于 flowHandlerMapping bean 的 order 值。
  • 好吧,我添加了 jsfResourceHandlerHack 行,服务器给了我其他错误:14:17:17,878 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web](http-localhost- 127.0.0.1-8080-1) Servlet 传输的 Servlet.service() 引发异常:javax.servlet.ServletException:处理程序没有适配器 [org.springframework.faces.webflow.JsfResourceRequestHandler@55c3c719]:您的处理程序是否实现了受支持的接口喜欢控制器?
【解决方案2】:

我认为您的问题已在https://jira.springsource.org/browse/SWF-1366 中得到解答。

祝你好运

【讨论】:

  • 是的,我在某个时候遇到了那个链接。即使使用 HttpRequestHandlerAdapter bean 和 SimpleUrlHandlerMapping,资源仍然无法正确解析
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2013-09-11
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多