1

このプロジェクトは、Spring 3、Spring Web Flow 2.3、Spring security 3、および Primefaces 3.2 で開発されています。JSF2 のディスパッチャ サーブレットを使用すると、ビューは AJAX で完全にリロードされ、タグ h:link を使用できます。しかし、SWF のディスパッチャ サーブレットを使用して以来、上記の 2 つのケースで問題が発生し始めました。

たとえば、h:linkタグとその属性output="listActivitiesを使用すると、結果はhref="WEB-INF/views/WEB-INF/views/listActivities.xhtml"になります。h:outputlinkを使用してこの問題が発生する可能性があります。結果は href="listActivities" であり、UrlBasedViewResolver を使用するように SWF を構成したためです。

AJAX を使用している場合、アプリは機能せず、メッセージは serverError: class com.sun.faces.context.FacesFileNotFoundException /WEB-INF/views/WEB-INF /views/comunes/registro.xhtml Not Found in ExternalContext as a です。リソース。h:link を使用するのと同じ問題。

web.xml

 <!-- Extensión por defecto para el uso de Facelets -->

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

<context-param>
  <param-name>javax.faces.PROJECT_STAGE</param-name>
  <param-value>Development</param-value>
</context-param>


<!-- Archivo de configuración de Spring -->

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

  <!-- Carga el spring web application context -->

  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

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

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

    <!-- Servlet para los recursos de la aplicación -->

   <servlet>
 <servlet-name>Resources Servlet</servlet-name>
 <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
 <load-on-startup>0</load-on-startup>
   </servlet>

   <servlet-mapping>
 <servlet-name>Resources Servlet</servlet-name>
 <url-pattern>/resources/*</url-pattern>
   </servlet-mapping>

   <!-- FronController de la aplicación, maneja todas las request -->

  <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>1</load-on-startup>
  </servlet>
  <servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
  </servlet-mapping>

<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>/faces/*</url-pattern>
</servlet-mapping>
</web-app>

webflow-config.xml

<!-- Configuración Spring webflow para JSF 2 -->


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


<!-- Configure Web Flow to be able to recognize JSF 2 Ajax requests -->

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

<!-- Executes flows: the central entry point into the Spring Web Flow system -->

<webflow:flow-executor id="flowExecutor">
    <webflow:flow-execution-listeners>
        <webflow:listener ref="facesContextListener"/>
        <webflow:listener ref="securityFlowExecutionListener" />
    </webflow:flow-execution-listeners>
    <webflow:flow-execution-attributes>
        <webflow:redirect-in-same-state value="false"/>
    </webflow:flow-execution-attributes>
</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 that creates and releases the FacesContext for 
            each request. -->

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

<!-- Installs a listener to apply Spring Security authorities -->

<bean id="securityFlowExecutionListener"
         class="org.springframework.webflow.security.SecurityFlowExecutionListener" />


    <!-- configuración MVC para JSF 2 -->

<faces:resources/>

<!-- Dispatches requests mapped to flows to FlowHandler implementations -->

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

<!-- Maps request paths to flows in the flowRegistry -->

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
    <property name="order" value="1"/>
    <property name="flowRegistry" ref="flowRegistry" />
    <!-- If no flow match, map path to a view to render; e.g. the "/intro" path 
             would map to the view named "intro"    -->
    <property name="defaultHandler">
<bean  class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
    </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/views/" />
    <property name="suffix" value=".xhtml" />
</bean>

<!-- Dispatches requests mapped to org.springframework.web.servlet.mvc.Controller
         implementations -->

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
   </beans>

部分的なコード ビュー

    <ui:define name="content">
    <div class="registroUsuario">
    <h:form id="registroForm">
        <h:panelGrid columns="3">

    <h:outputLabel for="distrito" value="Distrito" styleClass="labelInput" />

    <h:selectOneMenu id="distrito" required="true" requiredMessage="Debe seleccionar un
       distrito" value="#{registro.idDistrito}" title="Seleccione su distrito">

     <f:selectItem itemLabel="Seleccione distrito" itemValue="0"
              noSelectionOption="true"></f:selectItem>
    <f:selectItems var="distrito" value="#{registro.distritos}" itemLabel="#
          {distrito.nombre}" itemValue="#{distrito.idDistrito}">
    </f:selectItems>

    <f:ajax update="barrio calle messageDistrito" render="barrio calle messageDistrito" 
          listener="#{registro.updateBarrio}" event="blur" />

    <f:validateBean for="idDistrito" />
    </h:selectOneMenu>

      <h:message id="messageDistrito" for="distrito" styleClass="messageError" />           

    <h:outputLabel for="barrio" value="Barrio" styleClass="labelInput" />
    <h:selectOneMenu id="barrio" effect="fade" required="true" requiredMessage="Debe
     seleccionar un barrio" value="#{registro.idBarrio}" title="Seleccione su barrio ">

  <f:selectItem itemLabel="Seleccione barrio" itemValue="0" noSelectionOption="true" />     

<f:selectItems var="barrio" value="#{registro.barrios}" itemLabel="#{barrio.nombre}"
               itemValue="#{barrio.idBarrio}">
</f:selectItems>

<f:ajax render="calle messageBarrio" listener="#{registro.updateCalle}" 
         event="valueChange" />
<f:validateBean for="idBarrio" />
</h:selectOneMenu>
<h:message id="messageBarrio" for="barrio" styleClass="messageError" />

検出された問題は次のとおりです。 URL /spring/.....で指定した場合

1- f:ajax タグはリスナー属性でメソッドを呼び出さないが、ビューを「リロード」すると 2 番目のポイントが発生する。

2- URL /WEB-INF/views/WEB-INF/views/でコンテキスト パスを繰り返します。これは、h:link タグを使用するか、ah:selectOneMenu の値を変更すると発生します。

3- h:comammdbuton が機能しない、リスナー属性がメソッドを呼び出さない。

URL /faces/......で使用すると、上記の手順で問題なく動作します。

なぜこの動作が発生するのですか?

敬具。

4

2 に答える 2

0

フローでビューを変更する必要があると思います。例では:

<view-state id="idView" view="remove your prefix /WEB-INF/view/ so only the folder under that prefix">
于 2014-07-18T10:07:07.587 に答える
0

faceletsViewResolver のプレフィックスをに設定する必要があります

<property name="prefix" value="/WEB-INF/" />

*.xhtml ファイルは、フロー定義と同じフォルダーに配置する必要があります。

于 2013-04-01T17:23:35.223 に答える