【问题标题】:Facelets custom component doesn't set attribute after submitFacelets自定义组件在提交后未设置属性
【发布时间】: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 将所有属性连接到组件,因此我不需要标记类,但我不明白为什么第一次会正确设置属性,而第二次则不会。

【问题讨论】:

    标签: java jsf facelets


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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];
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 1970-01-01
        • 2019-01-17
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多