HTML对象作为JSF UIComponent

时间:2015-07-14 11:45:30

标签: jsf primefaces tabview uicomponents

我有一个TabView,其选项卡是我生成的:

<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,导致选项卡及其内容重新加载,这对我的情况来说是一个问题。

然后我切换到使用TabViewHelper bean创建我的TabView。

但是将对象标记作为子项添加到选项卡时出现了问题:

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;
}

我收到以下错误:

  

类型List中的方法add(UIComponent)不适用于参数(HTMLObjectElementImpl)

我只能添加一个UIComponent。

我不确定HTMLObjectElementImpl是否适合<object>,但我找不到更好的东西。

是否有HTML <object>标记的UIComponent,还是有另一个可用于HTML <object>的类?

是否有其他人遇到此问题并找到了解决方案?

1 个答案:

答案 0 :(得分:0)

<object>不是JSF组件。它基本上被认为是纯文本。

最简单的方法是创建一个HtmlOutputTextescape设置为false

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

如果您将用户控制的变量传递给它,请注意XSS攻击漏洞。

将来你会尝试以编程方式创建一个JSF组件,使用UIComponent的子类而不是一些随机的JAXP实现特定类。或者,更好的是,修复该更新问题,以便您可以继续使用XHTML代码来创建视图而不是详细的Java代码。