English 中文(简体)
Facelets自定义组件在提交后未设置属性。
原标题:
  • 时间:2009-01-12 18:36:31
  •  标签:

我在 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 可以将所有属性与组件相连接,因此我不需要标签类,但是我不明白为什么属性第一次设置正确,而第二次设置错误。

最佳回答

您必须通过覆盖saveState和restoreState方法来保存您的状态。

因此,saveState 必须返回一个 Serializable 对象(例如 JavaBean 或 Object[] 数组),其中包含 msg 中的值和 super.saveState 返回的所有内容。这个对象将被提供给 restoreState,其中该方法必须从对象中恢复 msg 并将父状态传递给 super.restoreState

问题回答

麦克道尔的答案做到了。为了完整起见,这是我添加的两种方法。

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];
}




相关问题
热门标签