Проблемы с обработчиком ресурсов с JSF2 + Richfaces4 + SpringMVC + WebFlow (SWF) - PullRequest
0 голосов
/ 03 января 2011

Я пытался заставить вышеупомянутую установку работать в течение нескольких дней с минимальным успехом. Похоже, у меня проблемы с обработчиком ресурсов. То есть.

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

не работает, NOR может RichFaces разрешить любые ресурсы, которые он использует внутри. Поэтому я провел некоторое исследование, и тег выше должен быть разрешен в "/project/javax.faces.resource/header.css?ln=page", но это не так. Происходят 2 очевидные проблемы.

1) Что-то в цепочке обработчика ресурсов, возможно, обработчик richfaces, ожидает добавления суффикса ".jsf" к запрошенному URL-адресу, что происходит при использовании старых граней EXTERNAL с JSF2 & RichFaces 3.3.x , но с Richfaces 4 и встроенными лицевыми гранями, что не имеет места. В результате один из обработчиков (я полагаю, RichFaces) удаляет суффикс .css, думая, что это дополнительный суффикс, такой как он работал. (Следовательно, это приводит к отсутствию ошибок MIME-типа)

2) Когда атрибуты библиотеки и имени разрешены, они разрешаются по текущему пути вместо корня контекста сервлета. То есть. он должен разрешаться в "/project/javax.faces.resource / ...", но вместо этого он разрешается в "/project/index/javax.faces.resource / ..." при просмотре страницы в каталоге / index.

Может ли кто-нибудь дать мне некоторое представление здесь? Я бьюсь головой об стену на этом и не делаю никаких реальных оснований.

Кстати, вот мой основной конфиг ....

лица-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>

сервлет-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" />

Ответы [ 2 ]

4 голосов
/ 16 января 2011

Хорошо, поэтому я НАКОНЕЦ прибил этот ... с небольшой помощью от Rich Faces.Так что для тех, кто заинтересован в запуске JSF2 + Rich Faces + SpringMVC + Spring WebFlow на Tomcat6 +, хорошо, вот что вам нужно ...

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 ... Spring Core 3.0.5Spring Web Flow 2.2.1 JSF RI 2.0.3 и самое главное ... Rich Faces 4.0.0.20101226-M5

Таким образом, ключ к созданию этой работы, казалось, был версией RichFaces.RichFaces 4 еще не готов к работе, так что, надеюсь, когда это произойдет, все будет работать гладко, но в то же время, теперь, когда Milestone 5 выпущен, эта установка, кажется, работает.Следует обратить внимание на отображение JsfResourceHandlerHack.Richfaces пытается разрешить некоторые из своих ресурсов (созданные на лету), используя ключевое слово «rfRes» по умолчанию.Проблема, с которой я столкнулся, заключалась в том, что ключ "rfRes" не сопоставлен с обработчиком ресурсов.Есть способ настроить его, но это, похоже, не работает.Таким образом, быстрое решение состоит в том, чтобы создать другой экземпляр обработчика ресурсов и отобразить его вручную.Так что для тех, кто заинтересован, это так.

1 голос
/ 07 января 2011

Я думаю, что на ваш вопрос ответили https://jira.springsource.org/browse/SWF-1366.

Удачи

...