java - Facelets 自定义组件在提交后未设置属性

标签 java jsf facelets

我在使用 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包含 msg 中的值以及 super.saveState 返回的任何内容的对象(例如 JavaBean 或 Object[] 数组)。该对象将提供给restoreState,其中该方法必须从该对象恢复msg并将父状态传递给super.restoreState

关于java - Facelets 自定义组件在提交后未设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/436488/

相关文章:

java - 小面 Debug模式不起作用

jsf - 自定义用户界面 :include rendering to add prefix/postfix

java - 如何通过java API创建Couchbase存储桶?

java - Guava 的 CharSink 变成支持 StringBuilder?

java - Spring中的依赖注入(inject)在这个语句中是如何工作的?

javascript - 如何调用 p :commandButton by JavaScript on enter keypress?

java - Axis2实现和 stub 生成问题

jsf - JSF中的Valuechangelistener怀疑

java - 已用堆大小持续增加

java - 使用 JSF 从 URL 中删除 Foobar.xhtml