JSF 2.0 How to create backup UIComponents?

I tried simply:

public class UIDemoComponent extends UIComponentBase {

    private String someVariable;  // this gets always cleared, getters/setters omitted

    public UIDemoComponent() {
        super();  // place breakpoint here
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {

        HtmlForm form = new HtmlForm();
        form.setStyle("padding: 10px; background-color: blue;");
        getChildren().add(form);

        AjaxBehavior behavior = new AjaxBehavior();
        behavior.setRender(Arrays.asList("@form"));
        form.addClientBehavior("click", behavior);
    }
}

I registered a tag handler and successfully inserted the component into the page. However, when I click on the blue form that is displayed, JSF re-creates the component (breakpoint in the constructor is caught). The effect of this is that any instance variables are lost. How should data be stored in components if they are always recreated?

I tried redefining and checking state storage mechanisms StateHolderwith PartialStateHolderno luck either:

@Override
public Object saveState(FacesContext context) {
    return super.saveState(context);  // breakpoint
}

@Override
public void restoreState(FacesContext context, Object state) {
    super.restoreState(context, state);  // breakpoint
}

JSF executes saveStatewhen the page and components are created, but restoreStatenever called. In fact, when an AJAX request is processed, a new instamnce UIDemoComponent is created, but the method saveStateis called again, instead restoreState.

( AJAX)?

+3
1

, JSF state restoreState, . restoreState.

:

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

restoreState .

+3

Source: https://habr.com/ru/post/1778260/


All Articles