Как настроить Spring Webflow с помощью jsf 2.0?

У меня проблема с интеграцией JSF2.0 в качестве технологии просмотра в Spring webflow. Мне удалось заставить его "почти" заработать, осталось только настроить поддержку ajax для JSF2.0.

Запросы Ajax отправляются, ответы от сервера принимаются, но ответ не запускает повторную визуализацию компонента.

Несколько подсказок, которые помогут решить проблему:

  • Когда дело доходит до создания ссылок .js на ресурсы, поведение JSF неверно. JSF пытается получить доступ к следующей ссылке:

    http://localhost:8080/ $ {context_path} / $ {flow_name} / javax .faces.resource / jsf.js? ln = javax.faces Это возвращает 404. Мне пришлось жестко закодировать следующую ссылку в шаблоне, чтобы получить некоторую поддержку ajax:

    http://localhost:8080/ $ {context-path} /javax.faces. resource / jsf.js.faces? ln = javax.faces (я нашел эту ссылку после отключения веб-потока и исследования исходного кода простой страницы, обработанной JSF)

  • Я предполагаю, что конфигурация JSF верна. Если я исключу веб-поток из цепочки обработки, все будет работать, как ожидалось. Ссылки в порядке, повторный рендеринг компонента в порядке

  • Если я выставляю свои сервисы как @ManagedBean (собственный подход JSF) и не использую Spring, повторный рендеринг bean-компонентов работает нормально, но я не могу взаимодействовать с переменными веб-потока и области видимости потока (веб-поток не видит собственные @ManagedBeans), и все же мне приходится использовать жестко запрограммированные ссылки.

  • У меня нет сервлета / фильтра ресурсов Spring. Я не использую правила urlRewrite для пересылки в свои потоки.

Если потребуются файлы конфигурации - выложу их в вопросе.

Любая помощь приветствуется. Похоже, это проблема блокировки использования всего стека технологий.


person WeMakeSoftware    schedule 28.01.2011    source источник


Ответы (2)


Шаг: 1 web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app
        <?xml version='1.0' encoding='UTF-8'?>
        <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
            version="2.0">
        </faces-config>
5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app
        <?xml version='1.0' encoding='UTF-8'?>
        <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
            version="2.0">
        </faces-config>
5.xsd" id="WebApp_ID" version="2.5"> <display-name>JSF2.0 with Spring webflow</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/config/web-application-config.xml </param-value> </context-param> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Production</param-value> </context-param> <context-param> <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name> <param-value>1</param-value> </context-param> <filter> <filter-name>charEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>charEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>facesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <servlet> <servlet-name>Spring MVC Dispatcher Servlet</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>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <url-pattern>/spring/*</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

Шаг: 2 faces-config.xml

        <?xml version='1.0' encoding='UTF-8'?>
        <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
            version="2.0">
        </faces-config>

Шаг: 3 webflow-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:webflow="http://www.springframework.org/schema/webflow-config"
       xmlns:faces="http://www.springframework.org/schema/faces"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.3.xsd
           http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.2.xsd">

    <!-- Executes flows: the central entry point into the Spring Web Flow system -->
    <webflow:flow-executor id="flowExecutor">
        <webflow:flow-execution-repository max-executions="1" />
        <webflow:flow-execution-attributes>
            <webflow:always-redirect-on-pause value="true"/>
        </webflow:flow-execution-attributes>
        <webflow:flow-execution-listeners>
            <webflow:listener ref="securityFlowExecutionListener"/>
            <webflow:listener ref="facesContextListener"/>
        </webflow:flow-execution-listeners>
    </webflow:flow-executor>

    <!-- The registry of executable flow definitions -->
    <webflow:flow-registry id="flowRegistry" flow-builder-services="facesFlowBuilderServices" base-path="/WEB-INF/flows">
        <webflow:flow-location-pattern value="/**/*-flow.xml" />
    </webflow:flow-registry>

    <!-- Configures the Spring Web Flow JSF integration -->
    <faces:flow-builder-services id="facesFlowBuilderServices" development="true" />

    <!-- Installs a listener to apply Spring Security authorities -->
    <bean id="securityFlowExecutionListener" class="org.springframework.webflow.security.SecurityFlowExecutionListener"/>

        <!-- Installs a listener that creates and releases the FacesContext for each request. -->
    <bean id="facesContextListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener"/>


</beans>

Шаг: 4 webmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:faces="http://www.springframework.org/schema/faces"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.4.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <faces:resources />

    <!-- Maps request URIs to controllers.  Here we have two kinds of flows one  is login flow and another is main flow   -->           
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /main=flowController
               </value>
        </property>
        <property name="defaultHandler">
            <!-- Selects view names to render based on the request URI: e.g. /main selects "main" -->   
            <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
        </property>
    </bean>

    <!-- it is used to handle the flow control Adaptor in 2.3.0.   This will come from spring framework.web.servlet3.2.1 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    <!-- Handles requests mapped to the Spring Web Flow system and ajaxHandler.
    after security we need to enable the ajax for that we need to write one property i.e ajaxHandler -->
    <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
        <property name="flowExecutor" ref="flowExecutor" />
         <property name="ajaxHandler">
        <bean class="org.springframework.faces.webflow.JsfAjaxHandler"/>
    </property>
    </bean>

    <!-- Maps logical view names to Facelet templates in /WEB-INF (e.g. 'search' to '/WEB-INF/search.xhtml' -->
    <bean id="faceletsViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.faces.mvc.JsfView"/>
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".xhtml" />
    </bean>

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


</bean>

</beans>
person Pravin    schedule 20.01.2014

Недавно я перешел с JSF 1 на JSF 2 в проекте Spring webflow. Позже я понял, что ajax не работает. Я настроил эти два bean-компонента в webmvc-config.xml

Первый bean был проблемой

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
    <property name="flowExecutor" ref="flowExecutor"/>
</bean>

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

Вы не можете получить их обоих. Поэтому убедитесь, что у вас есть только JsfFlowHandlerAdapter

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

Вот несколько версий фреймворка в моем проекте на всякий случай

    <spring.version>3.2.13.RELEASE</spring.version>
    <jsf.version>2.2.8-02</jsf.version>
    <org.springframework.webflow>2.4.0.RELEASE</org.springframework.webflow>
    <org.springframework.security.version>3.2.4.RELEASE</org.springframework.security.version>
person Niko Klaskagan    schedule 17.02.2015