Пользовательский компонент Facelets не устанавливает атрибут после отправки - PullRequest
0 голосов
/ 12 января 2009

У меня проблема с пользовательскими компонентами в 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 ]

1 голос
/ 13 января 2009

Ответ Макдауэлла сделал это. Просто для полноты вот два метода, которые я добавил.

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];
}
1 голос
/ 13 января 2009

Вы должны сохранить свое состояние, переопределив методы saveState и restoreState .

Итак, saveState должен возвращать Сериализуемый объект (например, массив JavaBean или Object []), содержащий значение в msg и все, что возвращается super.saveState . Этот объект будет предоставлен restoreState , где метод должен восстановить msg из объекта и передать родительское состояние в super.restoreState .

...