1

Spring 3.2.0、PrimeFaces 3.3.1、Mojarra 2.1.11、そしてSpringSecurity3.1.1でプロジェクトを作成しています。

私の問題は、たとえばテーブルのページ付けのように、Ajax呼び出しがPrimeFacesによって起動されるたびに、画面コンポーネントが更新されないことです。

編集#4

呼び出されたajaxが起動されるたびに、サーバーからステータス302が返され、ページが更新されます。

問題はSpringのセキュリティに関連していると思います。これが私の設定です。

 <security:http entry-point-ref="authenticationEntryPoint" pattern="/spring/**">
    <security:anonymous />
    <security:http-basic />
    <security:custom-filter position="FORM_LOGIN_FILTER" ref="authenticationProcessingFilter" />
    <security:logout logout-url="/spring/logout" logout-success-url="/spring/login?logout=true" />
    <security:intercept-url pattern="/spring/login" access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN" />
    <security:intercept-url pattern="/spring/logoutSuccess" access="ROLE_ANONYMOUS,ROLE_USER,ROLE_CLIENT" />
    <security:intercept-url pattern="/spring/intro" access="ROLE_ANONYMOUS,ROLE_USER"  />
    <security:intercept-url pattern="/spring/flows/admin_main_flow/**" access="ROLE_ADMIN" />
    <security:intercept-url pattern="/spring/flows/client_main_flow/**" access="ROLE_CLIENT" />
 </security:http>
 
 <security:http security="none" pattern="/javax.faces.resource/**" />
 <security:http security="none" pattern="/ajax/**" />
 <security:http security="none" pattern="/static/**" />
 <security:http security="none" pattern="/resources/**" />

これはログインの直後に発生するため、セッションがすでに期限切れになっているとは思われません。

編集#4終了

アプリケーションを最小限に抑えて、次のコードを試しました。

<h:form id="testAjax" >
    <h:panelGrid columns="4" cellpadding="5">  
        <h:outputLabel for="test" value="test:" style="font-weight:bold"/>  
    <p:inputText id="test" value="#{testBean.test}" />
    <p:commandButton value="Submit" update="@form"/>
    <h:outputText value="#{testBean.test}" id="display" />  
</h:panelGrid>  
</h:form>

フォームがネストされていないことを再確認したことに注意してください。@formまたは要素IDを使用して「process」と「update」の両方を試しました。

何が起こるかというと、TestBeanのセッターが呼び出され、属性が設定されますが、その後、新しい値を表示するためにゲッターが再度呼び出されることはありません。サーバー側のログは次のとおりです。

org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'Spring MVC Dispatcher Servlet' processing POST request for [/TryAjax/spring/WEB-INF/login.xhtml]
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping  - Mapping [/WEB-INF/login.xhtml] to HandlerExecutionChain with handler [org.springframework.web.servlet.mvc.UrlFilenameViewController@2f46ccac] and 1 interceptor
org.springframework.web.servlet.mvc.UrlFilenameViewController  - Returning view name 'WEB-INF/login' for lookup path [/WEB-INF/login.xhtml]
org.springframework.web.servlet.DispatcherServlet  - Rendering view [org.springframework.faces.mvc.JsfView: name 'WEB-INF/login'; URL [/WEB-INF/WEB-INF/login.xhtml]] in DispatcherServlet with name 'Spring MVC Dispatcher Servlet'
org.springframework.faces.support.RequestLoggingPhaseListener  - Entering JSF Phase: RESTORE_VIEW 1
org.springframework.faces.mvc.JsfView  - Asking faces lifecycle to render
org.springframework.faces.support.RequestLoggingPhaseListener  - Entering JSF Phase: RENDER_RESPONSE 6
org.springframework.faces.mvc.JsfView  - View rendering complete
org.springframework.web.servlet.DispatcherServlet  - Successfully completed request

構成の問題が心配です。基本的な手順に従いましたが、いくつかのエラーを修正するためにいくつかの変更を加えました。これは、関連のない部分を取り除いたweb.xmlです。

<?xml version = '1.0'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
  version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
    <context-param>  
        <param-name>log4jConfigLocation</param-name>  
        <param-value>/WEB-INF/log4j.xml</param-value>  
    </context-param>  
    <listener>  
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    </listener>  
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring_context.xml</param-value>
    </context-param>
    <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>
    <listener>
        <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>    
    <listener>
        <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</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>
    <servlet-mapping> 
        <servlet-name>Faces Servlet</servlet-name> 
        <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping>
    <context-param>
        <param-name>facelets.LIBRARIES</param-name>
        <param-value>/WEB-INF/tags/synaptic.taglib.xml</param-value>
    </context-param>
    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>flushMode</param-name>
            <param-value>AUTO</param-value>
        </init-param>
    </filter>
    <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>Production</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>
    <servlet>
        <servlet-name>Resources Servlet</servlet-name>
        <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
            <servlet-name>Resources Servlet</servlet-name>
            <url-pattern>/resources/*</url-pattern>
    </servlet-mapping>
</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"> 
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
</faces-config>

その他のスプリングフロー構成

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       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/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    <faces:resources />
    <context:annotation-config />
     <context:component-scan base-package="com.synaptic"/>
    <bean class="org.springframework.faces.webflow.JsfFlowHandlerAdapter">
        <property name="flowExecutor" ref="flowExecutor" />
    </bean>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /flows/*=flowController
            </value>
        </property>
        <property name="defaultHandler">
            <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
        </property>
    </bean>
    <bean  class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
    </bean>
    <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="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
      <property name="flowExecutor" ref="flowExecutor"/>
    </bean>
    <webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
        <webflow:flow-execution-listeners> 
            <webflow:listener ref="flowFacesContextLifecycleListener" /> 
            <!--  <webflow:listener ref="facesContextListener"/>-->
        </webflow:flow-execution-listeners> 
    </webflow:flow-executor> 
    <bean id="flowFacesContextLifecycleListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener" /> 
    <webflow:flow-registry id="flowRegistry" flow-builder-services="facesFlowBuilderServices">
        <webflow:flow-location-pattern value="/WEB-INF/flows/**/*.xml"/>
    </webflow:flow-registry>
    <bean id="conversionService" class="org.springframework.faces.model.converter.FacesConversionService"/>
    <bean id="expressionParser" class="org.springframework.webflow.expression.el.WebFlowELExpressionParser">
         <constructor-arg>
             <bean class="org.jboss.el.ExpressionFactoryImpl"/>    
         </constructor-arg>
         <property name="conversionService" ref="conversionService"/>
     </bean>        
    <faces:flow-builder-services id="facesFlowBuilderServices" expression-parser="expressionParser" conversion-service="conversionService"/>
</beans>

何か問題があったり、何かアイデアがあれば教えてください。この問題は何日もの間私を悩ませています。ありがとうございました!

編集#1

バッキングBeanのコードと、それを宣言するWebflowコードを追加します。

public class TestBean implements Serializable {
    private String test = "xxx";
    public String getTest() {
        return test;
    }
    public void setTest(String test) {
        this.test = test;
    }
}

<view-state id="home" view="../views/adminHome.xhtml">
    <on-entry>
        <evaluate expression="textManager.getTest()" result="viewScope.test"/>
    </on-entry>
</view-state>

これで、testBeanのこれは、機能しない最も単純なテストケースになります。私が抱えている主な問題は、テーブルのページ付け、データテーブル、tabViewなどの要素の追加、削除、変更など、ajax呼び出しが機能しないことです。 。

私は通常、ページのBeanを作成し、それらをviewScopeまたはflowScopeに配置します。これは、データベースからのデータのリストにも使用されます。スコープSessionを使用してSpringでBeanを管理することも試みましたが、どちらも機能しません。もう1つの注意点は、デフォルト値がページに正しく表示されることです。

編集#2

FirebugとEclipseデバッグを使用すると、次のように表示されます。

TestBean.testの初期値は「xxx」です。aaaに変更して送信を押します。

ajaxpostリクエストがサーバーに送信されます。

javax.faces.ViewState   e2s1
javax.faces.partial.ajax    true
javax.faces.partial.execu...    @all
javax.faces.partial.rende...    testAjax testAjax:display
javax.faces.source  testAjax:testButton
testAjax    testAjax
testAjax:test   aaa
testAjax:testButton testAjax:testButton

POSTが送信されたら、最初にTestBean.getTest()の呼び出しをデバッグしてから、正しい値を持つTestBean.setTest( "aaa")の呼び出しをデバッグします。

この時点で、応答が作成されたときにTestBean.getTest()が再度呼び出されることを期待しますが、呼び出しは発生せず、応答には正しい値ではなく古い値「xxx」が含まれます。

ここでページを更新すると、ゲッターが呼び出され、新しい値「aaa」が正しく表示されます。

編集#3

私はまだこれを整理することができます。私は今、firebugで予期しない動作に気づきました:

コマンドボタンをクリックすると、2つのリクエストがサーバーに送信されます。POSTとGETです。

POSTが最初に送信され、ステータス「302 Moved Temporarily」が返され、次にGETが開始され、更新されたデータなしで応答が返されます。この場合、ステータス302が何を意味し、何が原因である可能性があるかを誰もが知っていますか?

Primefacesデモと同じ方法でデバッグすると、ステータスを返さないPOSTリクエストのみが発生します302

ありがとうございました

4

3 に答える 3

1

同じ状態へのリダイレクトを無効にするには、flow-executorにパラメータを追加する必要があります。構成は次のようになります。

<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
    <webflow:flow-execution-listeners> 
        <webflow:listener ref="flowExecutionListener" /> 
        <webflow:listener ref="facesContextListener"/>
        <!--  <webflow:listener ref="flowFacesContextLifecycleListener" />-->
    </webflow:flow-execution-listeners> 
    <webflow:flow-execution-attributes>
        <webflow:redirect-in-same-state value="false"/>
    </webflow:flow-execution-attributes>
</webflow:flow-executor> 

これにより、フローエグゼキュータがajaxリクエストの送信後にページを完全に更新するのを防ぎます。

于 2012-08-15T15:27:08.527 に答える
0

JSFをSpringと統合すると、JSF管理対象BeanがSpringBeanになります。これが、SpringにELResolverの独自の実装が含まれているため、EL式内からこれらのSpringBeanを参照できるようになっています。

残念ながら、Springがすぐにサポートするスコープは、@ Request、@ Session、および@Applicationのみです。

幸い、Springと統合するViewScopeの単純な実装をアプリケーションに統合できます。PrimeFacesのリード開発者であるCagatayCiviciは、アプリケーションに簡単に統合できる単純なViewScope実装の例を示すブログ記事を書きました。

http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/

ビュースコープのマネージドBeanを使用すると、Beanはajax更新でページ要素を動的にレンダリングするのに十分な永続性を持ちます。

于 2012-08-01T00:00:59.323 に答える
0
<webflow:flow-execution-attributes>
<webflow:redirect-in-same-state value="false"/>
</webflow:flow-execution-attributes>

私の問題を解決しました。JSF 1.x RichFaces 3.xでのナビゲーションには、org.springframework.web.servlet.handler.SimpleUrlHandlerMappingを使用していました。JSF2.xおよびPrimeFaces/RichFaces 4に移行すると、DataTablesのajaxアスペクトが機能しませんでした(たとえば、表示されても並べ替えられません)このxmlの追加は魔法のように機能しました(私が何であるかわからないため、必要になるため)やって)

于 2021-03-03T16:33:05.920 に答える