如何在jsf / primefaces中从托管bean向页面添加组件

时间:2014-01-05 08:51:09

标签: jsf jsf-2 primefaces

单击commandButton应触发ManagedBean中的操作:将新的“outputText”组件添加到当前页面。

总的想法是通过用户操作动态更改页面,服务器端操作,因为添加到页面的新元素需要来自db的数据。

- >如何在jsf / primefaces中从托管bean向页面添加组件?假设元素应该添加到现有的div中,如:

<div id="placeHolder">
</div>

(如果需要,可以将此div更改为jsf面板)

注意:如果替代方法更好地达到相同的效果,我很乐意了解它们。

2 个答案:

答案 0 :(得分:2)

除了您发布的解决方案之外,我会为您提供另一种解决方案。基本上它有一个List给定的输出,每按一次按钮就会增加。这应该呈现与您所述的解决方案完全相同的DOM树:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <title>Tiles</title>
    <h:outputStylesheet name="css/320andup_cle.css" />
</h:head>
<h:body>
    <h:form>
        <h:commandButton actionListener="#{bean.createNewTile}" title="new"
            value="new" />
    </h:form>

    <h:panelGroup layout="block" id="tiles">
        <ui:repeat var="str" value="#{bean.strings}">
            <h:panelGroup>
                <h:outputText styleClass="tile" value="#{str}" />
            </h:panelGroup>
        </ui:repeat>
    </h:panelGroup>
</h:body>
</html>
@ManagedBean
@SessionScoped
public class Bean {

    List<String> strings = new ArrayList<String>();

    public List<String> getStrings() {
        return strings;
    }

    public void createNewTile() {
        strings.add("output");
    }
}

除了更简单的恕我直言,它有一个主要优势:它不会将您的服务器端代码耦合到JSF隐式API 。如果您希望它是CDI托管bean,则可以更改@ManagedBean的{​​{1}}注释。

答案 1 :(得分:1)

解决方案:

这是一个jsf页面,每次单击时都会创建一个新div:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Tiles</title>
        <h:outputStylesheet name="css/320andup_cle.css" />
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton actionListener="#{bean.createNewTile()}" title="new" value="new"/>
        </h:form>

        <h:panelGroup layout="block" id="tiles">
        </h:panelGroup>    
    </h:body>
</html>

Managed Bean:

@Named
@SessionScoped
public class Bean implements Serializable {

    private UIComponent found;

    public void createNewTile() {

        HtmlPanelGroup div = new HtmlPanelGroup();
        div.setLayout("block");


        HtmlOutputText tile = new HtmlOutputText();
        tile.setValue("heeeeeRRRRRRRRRRRRRR         ");
        tile.setStyleClass("tile");
        div.getChildren().add(tile);

        doFind(FacesContext.getCurrentInstance(), "tiles");
        found.getChildren().add(div);

    }

    private void doFind(FacesContext context, String clientId) {
        FacesContext.getCurrentInstance().getViewRoot().invokeOnComponent(context, clientId, new ContextCallback() {
            @Override
            public void invokeContextCallback(FacesContext context,
                    UIComponent component) {
                found = component;
            }
        });
    }
}

请参阅使用此动态生成组件逻辑构建的应用:https://github.com/seinecle/Tiles