【问题标题】:How to configure spring webflow with jsf 2.0?如何使用 jsf 2.0 配置 spring webflow?
【发布时间】:2011-06-17 02:08:38
【问题描述】:

我在将 JSF2.0 作为视图技术集成到 spring webflow 时遇到问题。 我设法让它“几乎”工作,唯一剩下的就是为 JSF2.0 配置 ajax 支持。

发送 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(我在之后找到了这个链接关闭web-flow并调查纯JSF处理页面的源代码)

  • 我假设 JSF 的配置是正确的。如果我从处理链中删除 webflow,一切都会按预期工作。链接没问题,组件重新渲染没问题

  • 如果我将我的服务公开为 @ManagedBean(JSF 本机方法)并且不使用 Spring 支持的 bean 重新渲染工作正常,但我无法与 webflow 和流范围变量(web- flow 没有看到原生的@ManagedBeans),我仍然必须使用硬编码的链接。

  • 我没有任何 Spring 资源 servlet/过滤器。我不使用 urlRewrite 规则转发到我的流程。

如果需要配置文件 - 我会在问题中发布它们。

感谢任何帮助。似乎这是使用整个技术堆栈的阻塞问题。

【问题讨论】:

    标签: ajax spring jsf integration spring-webflow


    【解决方案1】:

    步骤: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_2_5.xsd"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_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>
    

    【讨论】:

      【解决方案2】:

      最近我在一个 spring webflow 项目中从 JSF 1 迁移到 JSF 2。后来我发现ajax不起作用。我在 webmvc-config.xml 中配置了这两个 bean

      第一个 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-18
        • 2012-08-22
        • 2011-11-01
        • 1970-01-01
        • 2012-09-13
        • 2018-09-24
        • 2019-10-18
        • 2011-04-21
        相关资源
        最近更新 更多