1

現在、私はいくつかの複雑なWebフロントエンドに取り組んでおり、以下を使用して実装しています。

  • JSF 1.2
  • フェイスレット1.1.15
  • RichFaces 3.3.3.Final

純粋なJavaScriptを使用してinputTextフィールドの検証を可能にするカスタムJSFコンポーネントを作成しました。このコンポーネントには、typeという1つの属性しかありません。この属性は、ユーザーがキーボードキーを押したときに適用される検証アルゴリズムを担当します。

restoreView初期ビューが作成されるフェーズでは、この属性はJSF(実際にはFacelets)によって設定されます。これは、属性'type'のsetterとgetterを持つコンポーネントクラスがあることを意味します。そして、xhtmlドキュメントで指定された値で呼び出される「type」セッター。

コンポーネントオブジェクトは、reRender属性で指定すると、restoreViewフェーズで毎回再作成されます。しかし、再作成すると、必要な属性タイプが設定されません。それは単に新しいコンポーネントオブジェクトを作成するだけです...そしてそれがすべてです。私は何かを理解していない可能性があり、これは正常な動作ですが、この場合の属性値を取得するにはどうすればよいですか?

コード:

簡単なテストページ:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:u="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j"
      xmlns:r="http://richfaces.org/rich"
      xmlns:v="http://nobodyhere.ru/jsf/validation">
    <head>
        <title>Test Page</title>
    </head>
    <body>
        <h:form id="testForm">
            <h:inputText id="textInput" value="test">
                <v:keyValidator type="time"/>
            </h:inputText>
            <a:commandButton value="Make AJAX request" reRender="testForm"/>
        </h:form>
    </body>
</html>

コンポーネントクラス:

public class KeyValidator extends UIComponentBase
{

    public KeyValidator()
    {
        System.out.println("new KeyValidator");
    }

    public KeyValidatorType getValidatorType()
    {
        return type;
    }

    public String getType()
    {
        return getValidatorType().toString();
    }

    public void setType(String type)
    {
        this.type = KeyValidatorType.valueOf(type.toUpperCase());
    }

    @Override
    public String getFamily()
    {
        return KeyValidator.class.getName();
    }

    private KeyValidatorType type;
}

「AJAXリクエストを作成」ボタンを押すと、コンポーネントが再作成されます。ただし、属性'type'はコンポーネントに設定されていません。

主な問題はrenderView、コンポーネントレンダラーのフェーズで始まり、encodeBegin呼び出されたときにこの属性を取得しようとしますが、もちろんnull正しい値の代わりに取得します。

それで、おそらくもっと正確な質問:フェーズ
でAJAXリクエストのコンポーネントの属性値を取得する方法は?renderView

どんな助けでも大歓迎です。

4

1 に答える 1

0

必要な属性を保存および復元するには、コンポーネントでsaveStateオーバーライドする必要があります。restoreState

幸運を!

于 2010-11-12T10:55:30.183 に答える