0

facelets のカスタム コンポーネントに問題があります。ページが初めてレンダリングされるときに、コンポーネント クラスで属性が適切に設定されます。ただし、フォームが送信されると、属性は設定されません。

これをテストするために使用しているクラスは次のとおりです。

public class TestEcho extends UIData
{
    /** Logger. */
    private static Log log = LogFactory.getLog(TestEcho.class);

    private String msg;

    public TestEcho()
    {
        log.debug("Constructor.");
    }

    public void encodeEnd(FacesContext context) throws IOException
    {
        ResponseWriter writer = context.getResponseWriter();
        writer.startElement("div", this);
        writer.writeText("The value of msg is '" + msg + "'.", null);
        writer.endElement("div");
    }

    public void setMsg(String msg)
    {
        log.debug("Setting msg to '" + msg + "'.");
        this.msg = msg;
    }
}

コンポーネントは、このように .xhtml ページで使用されます。

<h:form>
    <v:testEcho msg="hello" />
    <h:commandButton action="#{PictureManager.trigger}" value="Click" />
</h:form>

ページが初めてレンダリングされるとき、コンポーネントは次の html コードをレンダリングします。

<div>The value of msg is 'hello'.</div>

ボタンをクリックすると、これがレンダリングされます。

<div>The value of msg is 'null'.</div>

ログから、コンポーネントが再構築されていることがわかりますが、属性は設定されていません。

13:23:42,955 DEBUG [TestEcho] Constructor.
13:23:42,955 DEBUG [TestEcho] Setting msg to 'hello'.
----- Button was pressed here -----
13:25:48,988 DEBUG [TestEcho] Constructor.
13:25:49,144 DEBUG [PictureManager] Button pressed.

私が理解していることから、Faceletsはすべての属性をコンポーネントに配線するため、タグクラスは必要ありませんが、最初に属性が正しく設定され、2回目では正しく設定されない理由がわかりません。

4

2 に答える 2

1

saveStateメソッドとrestoreStateメソッドをオーバーライドして、状態を保存する必要があります。

そのため、saveStateは、 msgの値とsuper.saveStateによって返されるものを含むSerializableオブジェクト (JavaBean または Object[] 配列など) を返さなければなりません。このオブジェクトは、メソッドがオブジェクトからmsgを復元し、親状態をsuper.restoreStateに渡す必要があるrestoreStateに提供されます。

于 2009-01-13T11:21:02.363 に答える
1

マクダウェルの答えはそれをしました。完全を期すために、追加した 2 つのメソッドを次に示します。

public Object saveState(FacesContext context)
{
    Object[] rtrn = new Object[2];
    rtrn[0] = super.saveState(context);
    rtrn[1] = msg;
    return rtrn;
}

public void restoreState(FacesContext context, Object state)
{
    Object[] values = (Object[]) state;
    super.restoreState(context, values[0]);
    msg = (String) values[1];
}
于 2009-01-13T15:08:32.780 に答える