2015-07-14 4 views
0

У меня есть TabView, чьи вкладки я генерироваться с:объект HTML, как JSF UIComponent

<p:tabView> 
    <c:forEach var="app" items="#{data.apps}"> 
     <p:tab title="#{app.name}" closable="true" id="app_#{app.id}"> 
      <object data="#{app.startUri}" height="800" width="1150" /> 
     </p:tab> 
    </c:forEach> 
</p:tabView> 

Однако, у меня была проблема с добавлением новых вкладок. Мне пришлось обновить TabView, который заставил закладки и их содержимое перезагружаться, что было проблемой для моей ситуации.

Затем я переключился на создание своего TabView с помощью компонента TabViewHelper.

Но тогда была проблема с добавлением тега объекта, как ребенок на вкладку:

public TabView initializeTabView(List<App> apps) { 
    tv = new TabView(); 
    Tab tab; 
    for (App app : apps) { 
     tab = new Tab(); 
     tab.setTitle(app.getName()); 
     HTMLObjectElementImpl content = new HTMLObjectElementImpl(owner, "test-object"); 
     tab.getChildren().add(content); 
    tv.getChildren().add(tab); 
    } 
    return tv; 
} 

Я получаю следующее сообщение об ошибке:

The method add(UIComponent) in the type List is not applicable for the arguments (HTMLObjectElementImpl)

Я могу только добавить UIComponent.

Я не уверен, что HTMLObjectElementImpl подходит для <object>, но я не нашел лучшего.

Есть ли UIComponent для HTML <object> -tag или есть еще один класс для HTML <object>?

У кого-нибудь еще была эта проблема и нашли решение?

+0

У вас будет такая же проблема при обновлении, хотя ... вы просто превратили простой xhtml в сложную Java. Вкладки PF просто не поддерживают «add-a-tab-dynamic-at-runtime without-reloading-all-others» – Kukeltje

+0

@ Kukeltje Добавление динамической вкладки легко возможно с помощью 'tv.getChildren(). Add (tab)' , Это хорошо для меня. – Patrick

+0

Да, но чтобы сделать его видимым, вы должны отобразить весь вкладку, включая все другие вкладки. Это то, что я сказал в своем предыдущем комментарии. Я знаю, что вы не можете добавить вкладку. – Kukeltje

ответ

0

<object> не является компонентом JSF. Это в основном считается простым текстом.

Простейшим способом было бы создать HtmlOutputText с escape, установленным на false.

HtmlOutputText html = new HtmlOutputText(); 
html.setEscape(false); 
html.setValue("<object>...</object>"); 

Остерегайтесь отверстий для атаки XSS в случае, если вы передадите управляемые пользователем переменные.

В дальнейшем вы пытаетесь создать компонент JSF программно, используйте подкласс UIComponent, а не какой-либо случайный класс реализации JAXP. Или, лучше, исправить эту проблему обновления, чтобы вы могли использовать код XHTML для создания представления вместо подробного кода Java.

+0

Благодарим за помощь! «HtmlOutputText» работал хорошо – Patrick