Primefaces采用随机形式ID

时间:2013-12-29 13:05:05

标签: jsf jsf-2 primefaces

在primefaces中刷新页面的方法是什么? 我试过了

<p:commandLink   actionListener="#{legendcontroller.addEditLegendType(true,false)}" update="legendform:pnlform" >Add Legend</p:commandLink>

<p:commandLink   immediate="true" actionListener="#{legendcontroller.addEditLegendType(false,false)}" update="legendform:pnlform" >View Legend  </p:commandLink>

<p:commandLink id="editLink" value="Edit" actionListener="#{legendcontroller.editLegendType(legendtype)}" update=":legendform:pnlform"  process="@this"/>

第三个会在带有datatable的页面中生成错误。我得到的错误:

无法找到“jnid22:legendviewdatatable:0:editLink”中引用的表达式为“pnlform”的组件。我想在编辑并打开editpanel时刷新表单。我想点击删除时只想刷新数据表。

完整的html:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      >
    <h:head>
        <title>Legend</title>
    </h:head>
    <h:body>
        <ui:composition template="/generalTemplate.xhtml">
            <ui:define name="title">Legend </ui:define>
            <ui:define name="content" >
                <f:view>
                    <h:form id="legendform" prependId="false" >
                        <p:panel id="pnlform">
                            <f:facet name="header">
                                <p:commandLink   actionListener="#{legendcontroller.addEditLegendType(true,false)}" update="legendform:pnlform" >Add Legend</p:commandLink>
                                <p:commandLink   immediate="true" actionListener="#{legendcontroller.addEditLegendType(false,false)}" update="legendform:pnlform" >View Legend  </p:commandLink>
                            </f:facet>

                            <p:panel id="addeditpnl" rendered="#{legendcontroller.addLegendBool or legendcontroller.editLegendBool}" style="width:100%">
                                <h:panelGrid columns="2"  >
                                    <h:outputLabel value="Legend Name" for="legendname" />
                                    <h:inputText id="legendname" value="#{legendcontroller.legendType.legendname}" title="Legendname" required="true" requiredMessage="The Legendname field is required."/>
                                    <h:outputLabel value="Legend Description" for="legendDesc" />
                                    <h:inputText id="legendDesc" value="#{legendcontroller.legendType.legendDesc}" title="LegendDesc" />
                                    <h:outputLabel value="Legend For" for="legendfor" />
                                    <h:inputText id="legendfor" value="#{legendcontroller.legendType.legendfor}" title="Legendfor" required="true" requiredMessage="The Legendfor field is required."/>
                                </h:panelGrid>

                                <p:dataTable id="addeditdtable" value="#{legendcontroller.legendType.legendList}" var="legend" style="width:100%">

                                    <p:column>
                                        <f:facet name="header">
                                            <h:outputText value="Legend SN"/>
                                        </f:facet>
                                        <h:inputText value="#{legend.legendSn}"/>
                                    </p:column>
                                    <p:column>
                                        <f:facet name="header">
                                            <h:outputText value="LegendDesc"/>
                                        </f:facet>
                                        <h:inputText value="#{legend.legendDesc}"/>
                                    </p:column>
                                    <p:column>
                                        <f:facet name="header">
                                            <h:outputText value="Lower Range"/>
                                        </f:facet>
                                        <h:inputText value="#{legend.lowerrange}"/>
                                    </p:column>

                                    <p:column>
                                        <f:facet name="header">
                                            <h:outputText value="Upper Range"/>
                                        </f:facet>
                                        <h:inputText value="#{legend.upperrange}"/>
                                    </p:column>

                                    <p:column>
                                        <f:facet name="header">
                                            <h:outputText value="Color"/>
                                        </f:facet>
                                        <p:colorPicker value="#{legend.color}"/>
                                    </p:column>

                                    <p:column>
                                        <f:facet name="header">
                                            <h:outputText value="ADD/Delete"/>
                                        </f:facet>
                                        <p:commandLink value="Add" actionListener="#{legendcontroller.addLegendAfter(legend)}"  update="addeditdtable" process="@this"/>
                                        <h:outputText value=" / "/>
                                        <p:commandLink value="Delete" actionListener="#{legendcontroller.removeLegendDTO(legend)}" update="addeditdtable" process="@this"/>
                                    </p:column>

                                    <f:facet name="footer">
                                        <p:commandButton  value="SAVE" action="#{legendcontroller.saveLegend()}"/>
                                    </f:facet>
                                </p:dataTable>

                            </p:panel>





                            <p:dataTable id="legendviewdatatable" value="#{legendcontroller.allLegendType()}" rendered="#{!legendcontroller.addLegendBool and !legendcontroller.editLegendBool}" var="legendtype"  style="width:100%">
                                <p:column>
                                    <f:facet name="header">
                                        <h:outputText value="Legendname"/>
                                    </f:facet>
                                    <h:outputText value="#{legendtype.legendname}"/>
                                </p:column>

                                <p:column>
                                    <f:facet name="header">
                                        <h:outputText value="LegendDesc"/>
                                    </f:facet>
                                    <h:outputText value="#{legendtype.legendDesc}"/>
                                </p:column>

                                <p:column>
                                    <f:facet name="header">
                                        <h:outputText value="Legendfor"/>
                                    </f:facet>
                                    <h:outputText value="#{legendtype.legendfor}"/>
                                </p:column>

                                <p:column id="editDelCol">
                                    <f:facet name="header">
                                        <h:outputText value="Edit/Delete"/>
                                    </f:facet>    
                                    <p:commandLink id="editLink" value="Edit" actionListener="#{legendcontroller.editLegendType(legendtype)}" update=":legendform:pnlform"  process="@this"/>
                                    <h:outputText value=" / "/>
                                    <p:commandLink id="deleteLink" value="Delete" actionListener="#{legendcontroller.deleteLegendType(legendtype)}" update="legendviewdatatable" process="@this" />

                                </p:column>
                            </p:dataTable>

                        </p:panel>
                    </h:form>
                </f:view>
            </ui:define>
        </ui:composition >
    </h:body>
</html>

最后,我发现primefaces没有使用id给出但使用随机id:

<form id="j_idt12" name="j_idt12" method="post" action="/Configuration/LegendManager/LegendType.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt12" value="j_idt12">
<div id="j_idt12:j_idt13" class="ui-toolbar ui-widget ui-widget-header ui-corner-all ui-helper-clearfix"><div class="ui-toolbar-group-left"><button id="j_idt12:j_idt15" name="j_idt12:j_idt15" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left" title="Welcome" type="submit" role="button" aria-disabled="false"><span class="ui-button-icon-left ui-icon ui-c ui-icon-disk"></span><span class="ui-button-text ui-c">Home</span></button><button id="j_idt12:j_idt16" name="j_idt12:j_idt16" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left" title="Configuration" type="submit" role="button" aria-disabled="false"><span class="ui-button-icon-left ui-icon ui-c ui-icon-disk"></span><span class="ui-button-text ui-c">Configuration</span></button></div><div class="ui-toolbar-group-right"><span id="j_idt12:j_idt18" class="ui-menubutton"><button id="j_idt12:j_idt18_button" name="j_idt12:j_idt18_button" type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left" role="button" aria-disabled="false"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-s"></span><span class="ui-button-text ui-c">sugandha</span></button></span></div></div><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="2044288989474132123:952602282947229034" autocomplete="off">
</form>

2 个答案:

答案 0 :(得分:1)

由于您使用了prependId="false",因此您应该仅使用update="pnlform",或删除prependId="false",这样您就可以保留update="yourformname:yourid"update=":yourid"

更多信息:

答案 1 :(得分:1)

更改您的代码,如下所示:<h:form id="legendform" prependId="true" >或没有prependId属性,然后引用此表单中的嵌套组件,其中包含来自其他任何位置的update=":legendform:pnlform"属性。
在您的情况下,如果您要设置prependId=false,然后以相同的形式从<datatable>内的嵌套组件引用,则应使用update=":pnlform"进行更新。 这是因为<datatable>拥有自己的NamingContainer