2011-01-28 46 views
3

我有一个问题,整合JSF2.0作为一种视图技术来弹出webflow。 我设法让它“几乎”工作,唯一剩下的就是为JSF2.0配置ajax支持。如何用jsf 2.0配置spring webflow?

发送Ajax请求,接收到来自服务器的响应,但响应不会触发组件的重新呈现。

一些线索,以帮助解决问题:

  • 当谈到产生的.js资源的链接,JSF的行为是错误的。 JSF尝试访问以下链接:

    http://localhost:8080/$ {context_path}/$ {} flow_name /javax.faces.resource/ jsf.js LN = javax.faces 这让404回电话吗?我只好硬编码在模板下面的链接继续得到一些Ajax支持的:?

    http://localhost:8080/$ {上下文路径} /javax.faces.resource/ jsf.js.faces LN = javax.faces(我发现这个链接后切换网络流和调查原始JSF处理页的源代码)

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

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

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

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

任何帮助表示赞赏。似乎这是使用整个技术堆栈的阻塞问题。

回答

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> 
0

最近,我在一个spring webflow项目中从JSF 1迁移到JSF 2。后来我发现ajax不起作用。我在webmvc-config中配置了这两个bean。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>