3
<ui:composition template="/WEB-INF/templates/base.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui">    
    <ui:define name="metadata">
        <f:metadata>
            <f:event type="preRenderView" listener="#{resetPassword.loadUser}" />
            <f:viewParam name="user" value="#{resetPassword.user}" />
        </f:metadata>
    </ui:define>

    <ui:define name="content">
        <h:form rendered="#{resetPassword.user != null}">
            <h:panelGrid class="form_panel" columns="2" width="596px">
                <h:outputLabel class="form_label" for="password" value="#{base['resetPassword.password']}" />
                <h:inputSecret class="form_inputText" id="password" value="#{resetPassword.password}">
                    <f:ajax event="keyup" execute="password" listener="#{resetPassword.validatePassword}" render="scorePanel complexity" />
                </h:inputSecret>

                (...) // Other labels and inputfields, no ajax
            </h:panelGrid>
        </h:form>
    </ui:define>
</ui:composition> 

-callspreRenderViewと組み合わせた場合の多くの問題について読みました。ajax私が遭遇した主な問題は問題ですがpostback、私の場合は、でまったく起動しajaxませんpreRenderView。タグ全体がないf:eventと、私のajax呼び出しは正しく機能します。

resetPassword.loadUser()resetPassword.usernullではないを設定します。を埋めるために、のpreRenderView代わりにを使用する必要があります。このパラメータは、フォームが送信されるときに必要です。@PostConstructf:viewParam

が定義されているajaxときにイベントが中断するのはなぜですか?<f:event type="preRenderView" />

<ui:insert name="metadata" />テンプレート内は。内にあり<h:head>ます。

アップデート

BalusCがコメントしたように、この問題はコードのこの部分には表示されません。

public void loadUser(ComponentSystemEvent event) {
    if(!FacesContext.getCurrentInstance().isPostback()) {
        user = (hash != null) ? userService.getByIdAndPwdResetHash(userId, hash) : null;
    }
}

このコードは返される可能性がありますが、返さnullれません(フォームがロードされているため)。

public void validatePassword(AjaxBehaviorEvent event) {
    System.out.println("Ajax works"); // Just for testing purposes so far
}

これはほとんどすべての関連コードであるため、さらに何を追加すればよいかわかりません。

4

1 に答える 1

4

このコンストラクトは、#{resetPassword}リクエストスコープがあり、userBeanの(ポスト)コンストラクト中にプロパティが初期化されていない場合に失敗します。

renderedJSFは、リクエスト値の適用フェーズで、改ざんされたリクエストに対する保護の一環として、送信された値を処理する前に、入力コンポーネント(これにはすべての親コンポーネントも含まれます)の属性を再評価します。あなたの場合、親フォームはレンダリングされないため、すべての入力コンポーネントが処理されるわけではありません。

基本的に2つのオプションがあります。

  1. Bean @ViewScoped(または同等のCDI @ConversationScoped)を作成します。このようにして、同じビュー(または会話)を操作している限り、それは存続します。

  2. userin(post)コンストラクタの初期化を実行します。プレレンダリングビューは遅すぎます。Beanはすでにリクエストスコープになっているので、使用するだけです@ManagedProperty(または、それに相当する自家製のCDI。Googleの結果は「@HttpParam」にあります)。

参照:


具体的な質問とは関係なく、action(listener)メソッドで検証を実行することは適切なアプローチではありません。の代わりに、入力コンポーネントの属性またはネストされた。によって参照<f:ajax listener>する法線を使用します。Validatorvalidator<f:validator>

于 2012-11-26T18:45:57.123 に答える