Программно получить UIComponents JSF-представления в конструкторе бина - PullRequest
12 голосов
/ 14 декабря 2011

Представьте себе страницу JSF с несколькими компонентами, такими как <h:selectOneMenu>, <h:dataTable>, <h:panelGrid> и т. Д. Каждый компонент имеет идентификатор.Есть ли какой-либо метод или метод, с помощью которого я могу получить компоненты программно, когда вызывается конструктор bean-компонента?

Ответы [ 4 ]

36 голосов
/ 14 декабря 2011

Вы можете получить дерево компонентов по FacesContext#getViewRoot() и найти конкретный компонент по ID по UIComponentBase#findComponent():

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component = viewRoot.findComponent("someId");
// ...

Однако корень представления непосредственно не доступен в конструкторе компонента по сути. Он может возвращать null при запросах GET к представлению, в котором компонент не указан во временном теге или атрибуте построения представления. Однако он гарантированно будет доступен во время события предварительного просмотра.

<f:event type="preRenderView" listener="#{bean.init}" />

с

public void init() {
    // ...
}

Не имеет отношения к конкретной проблеме , не ясно, зачем вам это нужно, но я могу сказать, что это более чем часто пахнет кодом. Я предлагаю выяснить, действительно ли это правильное решение для конкретных функциональных требований, которые вы имели в виду. Подсказки и подсказки см. Также Как работает атрибут 'binding' в JSF? Когда и как его использовать? и Как правильно использовать связывание компонентов в JSF, верно? (компонент области запроса в bean-объекте сеанса) .

3 голосов
/ 15 декабря 2011

Я попробовал ваше решение, и оно сработало :).Здесь я просто публикую свой ответ, как я это сделал.На самом деле кто-то только что задал мне этот вопрос, чтобы мы могли получить все компоненты внутри конструктора при вызове нашей страницы, то есть, почему я спросил на этом форуме :).Вот мой код

/** Creates a new instance of ExporterProfileUpdateRequestGrid */
public ExporterProfileUpdateRequestGrid() {

    session = ConnectionUtil.getCurrentSession();
    exporterProfileUpdateRequestList = new ArrayList<ExporterProfileUpdateRequest>();

    int test = selectedRadioButton;
    System.out.println();
    //getExporterProfileUpdateRequestGrid();

} //end of constructor

@PostConstruct
public void init() {

    UIViewRoot viewRoot =  FacesContext.getCurrentInstance().getViewRoot();
    UIComponent component1 = viewRoot.findComponent("exporterProfileUpdateRequestGrid");  //form id
    HtmlForm form = (HtmlForm)component1;

    List<UIComponent> componentList = form.getChildren();

    for(int i=0; i<componentList.size(); i++) {

        UIComponent component = componentList.get(i);

        if (component instanceof Panel) {

            Panel myPanel = (Panel)component;

            List<UIComponent> panelComponentList = myPanel.getChildren();

            for(int j=0; j<panelComponentList.size(); j++) {

                UIComponent panelComponent = panelComponentList.get(j);

                System.out.println();


            }

             System.out.println();

        }

        System.out.println();

    } //end of for()

    UIComponent component2 = viewRoot.findComponent("panel1");   //null
    UIComponent component3 = viewRoot.findComponent("myTable");  // null

} //end of init

Я хочу спросить, что я получил форму (HtmlForm) здесь, но panel1 и myTable null, почему?Хотя я получаю панель и таблицу, осматривая детей HtmlForm, но почему я не могу получить их напрямую.

Спасибо

2 голосов
/ 05 июня 2014

см. http://horrikhalid.com/2011/01/27/how-to-find-uicomponent-in-jsf/

public UIComponent findComponent(String id) {

UIComponent result = null;
UIComponent root = FacesContext.getCurrentInstance().getViewRoot();
if (root != null) {
result = findComponent(root, id);
}
return result;

}

private UIComponent findComponent(UIComponent root, String id) {

UIComponent result = null;
if (root.getId().equals(id))
return root;

for (UIComponent child : root.getChildren()) {
if (child.getId().equals(id)) {
result = child;
break;
}
result = findComponent(child, id);
if (result != null)
break;
}
return result;
}
0 голосов
/ 21 января 2012

Если панель и таблица в форме, попробуйте следующее:

UIComponent component2 = viewRoot.findComponent("exporterProfileUpdateRequestGrid").findComponent("panel1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...