2016-11-20 1 views
1

Я пытаюсь проверить мой управляемый компонент для динамического изменения веб-страницы. (programmatically); Большинство примеров jsf показывают, как использовать привязку для изменения ui, но как насчет остальной части веб-страницы? Образцы показывают, как добраться до UIViewRoot, который обычно находится в блоке h:body, но как насчет самого h:body или h:head?JSF - как добавить ребенка в h: head или to h: body with managed bean

Так что мой вопрос ... Есть ли способ, с помощью FacesContext получить h:body или h:head в качестве родительских компонентов и добавить ребенок к ним прямо с управляемым бобом или, пожалуйста, сообщите о том, как получить так эффекта, используя другие способы?

Благодаря

+0

Вы можете создать все такие элементы в XHTML и отображения/скрытия, используя переменную в управляемом фасоли –

+0

@VikasSachdeva я не мог видеть, какие примеры; вы могли бы предоставить более подробную информацию PLS – user390525

ответ

1

UIViewRoot представлено <f:view> тегом. Если вы не укажете его явно на своей странице JSF, то он будет добавлен неявно.

UIViewRoot, который обычно находится в час: блок корпус

Нет, это не внутри тела, но по умолчанию, окружающий тело и голову. Как это:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <f:view> <!-- No need to define. Added implicitly here in ComponentTree --> 
     <h:head> 
      <meta http-equiv="content-type" content="text/html;charset=UTF-8"/> 
     </h:head> 
     <h:body>  
      <h:outputText value="#{hello.message}"/>    
     </h:body> 
    </f:view> 
</html> 

Итак, если вы получить UIViewRoot с помощью FacesContext.getCurrentInstance().getViewRoot() и попросить своих детей (.getChildren()), вы получите список из 4 элементов:

  1. UIInstructions: визуализирует <html> открывающий тег
  2. UIOutput: это номер <h:head>. Задать getChildren еще раз, чтобы получить UIOutput для <meta> тег
  3. HtmlBody: это, по-видимому, h:body.Спросите getChildren получить <h:outputText>
  4. UIInstructions: оказывает </html> закрывающий тег

добавить детей к ним прямо с управляемым боба

Да, в общем, вы можете использовать ManagedBeans манипулировать UIComponentTree (например, добавьте элемент, затем перезагрузите страницу, чтобы показать его). Однако рассмотрите JSF lifecycle и порядок обработки (вы, например, не можете добавить ребенка в качестве первого элемента в тело во время фазы обработки, потому что элементы уже обработаны). Образец для добавления нового элемента в теле:

List<UIComponent> viewRootChildren = FacesContext.getCurrentInstance().getViewRoot().getChildren(); 
for(UIComponent child : viewRootChildren){ 
    if(child instanceof HtmlBody){ 
     HtmlOutputText newText = new HtmlOutputText(); 
     newText.setValue("added dynamically"); 
     child.add(newText); 
    } 
} 
+0

Это очень интересно :) Итак, UIInstructions является родителем как UIOutput, так и HtmlBody? – user390525

+0

Нет, хотя '' является родителем '' и '' является родителем '' и '', это неверно для UIComponentTree на стороне Java. Вместо этого все эти 4 элемента находятся на одном уровне иерархии (дочерние элементы 'UIViewRoot'). Затем вы можете снова вызвать 'getChildren' на любом из этих 4 элементов, где' UIInstructions' не имеет дополнительных дочерних элементов (но только для html). У UIOutput и HtmlBody есть дополнительные дети, и вы можете манипулировать ими через Java. – Ben

+0

Я рекомендую сейчас игнорировать '' и' UIInstructions'. Это отличается от других тегов, чтобы включить html-root-элемент. Ваш вопрос заключался в том, как получить «h: head» и «h: body» (2-й и 3-й элементы), которые можно выполнить, как описано. Возможно, просто попробуйте вызвать 'FacesContext.getCurrentInstance() getViewRoot(). GetChildren()' в любом месте вашего ManagedBean, установить точку останова и отладить/проверить, чтобы увидеть UIComponentTree. – Ben

0

Вы можете отобразить/скрыть компоненты JSF с помощью атрибута rendered.

Ниже приведен пример -

<h:outputText value="Result = #{calculator.result}" rendered="#{calculator.result != null}"/> 

Здесь этот элемент будет отображаться в интерфейсе только если calculator.result не null где calculator это имя вашего managedBean и result является переменной внутри этого компонента. Вы можете изменить значение этой переменной в событии предварительного рендеринга или в вызове AJAX или в других событиях.

Для более чем одного элемента вы можете использовать <h:panelGroup> с атрибутом rendered.

+0

Пожалуйста, найдите «дубликат» этого ... несколько десятков на StackOverflow и пометьте вопросы как дубликат одного из них. – Kukeltje

+0

Нет, я имею в виду, как использовать FacesContext для создания компонентов программно: S Не путь к тегам. См. Ссылку, которую я даю в моем вопросе pls – user390525

+0

Я отредактировал мой вопрос; Пожалуйста, см. Его – user390525

Смежные вопросы