RequestScope bean和Prime Faces Collector

时间:2010-09-29 23:45:29

标签: jsf primefaces

我遇到了问题。我有一个Bean CreateProjectBean,它是RequestScope bean。我想使用名为Collector的Prime Faces组件,因此我可以动态地更改视图createProject表groupRoleAdapters,它是CreateProjectBean的一个字段。每次我在收集器中单击“添加”或“删除”时,都会发送新的请求,这意味着,再次创建GroupRoleAdapters - 当然是空的。

我的收藏家代码:

<p:panel header="Add group">
    <h:panelGrid columns="2">
        <h:outputLabel value="Group name: *" for="txt_title"></h:outputLabel>

        <h:selectOneMenu id="groupMenu"
            value="#{createProjectBean.groupRoleAdapter.groupName}">
            <f:selectItems value="#{createProjectBean.groupNames}"
                var="group" itemValue="#{group}" itemLabel="#{group}" />
        </h:selectOneMenu>


        <f:verbatim>
            <br />
        </f:verbatim>

        <h:message styleClass="errorMessage" for="creationForm:groupMenu" />

        <h:outputLabel value="Role name: *" for="txt_title"></h:outputLabel>

        <h:selectOneMenu id="roleMenu"
            value="#{createProjectBean.groupRoleAdapter.roleName}">
            <f:selectItems value="#{createProjectBean.roleNames}" var="role"
                itemValue="#{role}" itemLabel="#{role}" />
        </h:selectOneMenu>

        <f:verbatim>
            <br />
        </f:verbatim>


        <h:message styleClass="errorMessage" for="creationForm:roleMenu" />

        <f:verbatim>
            <br />
        </f:verbatim>


        <p:commandButton value="Add" update="creationForm:out"
            action="#{createProjectBean.reinit}">
            <p:collector value="#{createProjectBean.groupRoleAdapter}"
                addTo="#{createProjectBean.selectedGroupRoleAdapters}"/>
        </p:commandButton>
    </h:panelGrid>
</p:panel>

<f:verbatim>
    <br />
</f:verbatim>

<p:outputPanel id="out">
    <p:dataTable value="#{createProjectBean.selectedGroupRoleAdapters}"
        var="groupRoleAdapter">


        <p:column>
            <f:facet name="header">
                <h:outputText value="Name" />
            </f:facet>
            <h:outputText value="#{groupRoleAdapter.groupName}" />
        </p:column>

        <p:column>
            <f:facet name="header">
                <h:outputText value="Role" />
            </f:facet>
            <h:outputText value="#{groupRoleAdapter.roleName}" />

        </p:column>

        <p:column>
            <f:facet name="header">
                <h:outputText value="Operation" />
            </f:facet>
            <p:commandLink value="Remove" update="creationForm:out">
                <p:collector value="#{groupRoleAdapter}" removeFrom="#{createProjectBean.selectedGroupRoleAdapters}" />
            </p:commandLink>
        </p:column>

    </p:dataTable>
</p:outputPanel>

我想在列表selectedGroupRoleAdapters(由收集器表表示)中添加和删除groupRoleAdapters时使用相同的bean实例,但每次尝试创建新项目时都要创建bean的新实例,因此将范围更改为sessionScope是不是我能接受的。

提前感谢您的帮助。

我附上该视图的完整代码:

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:composition template="/templates/template.xhtml">
    <ui:define name="head">
        <title>Create Project</title>
        <link rel="stylesheet" type="text/css"
            href="#{facesContext.externalContext.requestContextPath}/styles/style.css" />
    </ui:define>
    <ui:define name="content">
        <div class="mainTable">
        <center><f:view>
            <h:outputText id="error" rendered="false" />
            <h:message styleClass="errorMessage" for="error" />
            <h:form id="creationForm">
                <h:panelGrid columns="2" width="420">

                    <h:panelGroup width="300">
                        <h:outputLabel styleClass="formLabel" value="Name: "></h:outputLabel>
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:inputText styleClass="formField" id="name"
                            value="#{createProjectBean.project.name}" required="true">
                            <f:validateLength minimum="3" />
                        </h:inputText>
                    </h:panelGroup>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:message styleClass="errorMessage" for="creationForm:name" />

                    <h:panelGroup>
                        <h:outputLabel styleClass="formLabel" value="Short Name: " />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:inputText styleClass="formField" id="shortname"
                            value="#{createProjectBean.project.shortname}" required="false">
                            <f:validateLength maximum="8" />
                        </h:inputText>
                    </h:panelGroup>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:message styleClass="errorMessage" for="creationForm:shortname" />

                    <h:panelGroup>
                        <h:outputLabel styleClass="formLabel" value="Homepage: " />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:inputText styleClass="formField" id="homepage"
                            value="#{createProjectBean.project.homepage}" required="false">
                        </h:inputText>
                    </h:panelGroup>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:message styleClass="errorMessage" for="creationForm:hostname" />

                    <h:panelGroup>
                        <h:outputLabel styleClass="formLabel" value="Description: " />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:inputTextarea styleClass="formField" id="description"
                            value="#{createProjectBean.project.description}" required="false"
                            cols="50" rows="10" />
                    </h:panelGroup>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:message styleClass="errorMessage" for="creationForm:description" />

                    <h:panelGroup>
                        <h:outputLabel styleClass="formLabel" value="Plugins: " />
                    </h:panelGroup>

                    <h:selectManyListbox id="pluginBox"
                        value="#{createProjectBean.selectedPluginNames}">
                        <f:selectItems value="#{createProjectBean.pluginNames}"
                            var="plugin" itemValue="#{plugin}" itemLabel="#{plugin}" />
                    </h:selectManyListbox>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:message styleClass="errorMessage" for="creationForm:pluginBox" />

                    <h:panelGroup>
                        <h:outputLabel styleClass="formLabel" value="Tags: " />
                    </h:panelGroup>

                    <h:selectManyListbox id="tagBox"
                        value="#{createProjectBean.project.tags}">
                        <f:selectItems value="#{createProjectBean.allTags}" var="tag"
                            itemValue="#{tag}" itemLabel="#{tag.name}" />
                    </h:selectManyListbox>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:message styleClass="errorMessage" for="creationForm:tagBox" />

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <p:panel header="Add group">
                        <h:panelGrid columns="2">
                            <h:outputLabel value="Group name: *" for="txt_title"></h:outputLabel>

                            <h:selectOneMenu id="groupMenu"
                                value="#{createProjectBean.groupRoleAdapter.groupName}">
                                <f:selectItems value="#{createProjectBean.groupNames}"
                                    var="group" itemValue="#{group}" itemLabel="#{group}" />
                            </h:selectOneMenu>

                            <f:verbatim>
                                <br />
                            </f:verbatim>

                            <h:message styleClass="errorMessage" for="creationForm:groupMenu" />

                            <h:outputLabel value="Role name: *" for="txt_title"></h:outputLabel>

                            <h:selectOneMenu id="roleMenu"
                                value="#{createProjectBean.groupRoleAdapter.roleName}">
                                <f:selectItems value="#{createProjectBean.roleNames}" var="role"
                                    itemValue="#{role}" itemLabel="#{role}" />
                            </h:selectOneMenu>

                            <f:verbatim>
                                <br />
                            </f:verbatim>

                            <h:message styleClass="errorMessage" for="creationForm:roleMenu" />

                            <f:verbatim>
                                <br />
                            </f:verbatim>


                            <p:commandButton value="Add" update="creationForm:out"
                                action="#{createProjectBean.reinit}">
                                <p:collector value="#{createProjectBean.groupRoleAdapter}"
                                    addTo="#{createProjectBean.selectedGroupRoleAdapters}"/>
                            </p:commandButton>
                        </h:panelGrid>
                    </p:panel>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <p:outputPanel id="out">
                        <p:dataTable value="#{createProjectBean.selectedGroupRoleAdapters}"
                            var="groupRoleAdapter">


                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Name" />
                                </f:facet>
                                <h:outputText value="#{groupRoleAdapter.groupName}" />
                            </p:column>

                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Role" />
                                </f:facet>
                                <h:outputText value="#{groupRoleAdapter.roleName}" />

                            </p:column>

                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Operation" />
                                </f:facet>
                                <p:commandLink value="Remove" update="creationForm:out">
                                    <p:collector value="#{groupRoleAdapter}"
                                        removeFrom="#{createProjectBean.selectedGroupRoleAdapters}" />
                                </p:commandLink>
                            </p:column>

                        </p:dataTable>
                    </p:outputPanel>

                    <f:verbatim>
                        <br />
                    </f:verbatim>

                    <h:commandButton value="Create" styleClass="formButton"
                        action="#{createProjectBean.create}" />
                </h:panelGrid>
            </h:form>
        </f:view></center>
        </div>
    </ui:define>
</ui:composition>
</html>

1 个答案:

答案 0 :(得分:0)

如果您已经使用JSF 2.0,只需将bean放在view范围内,@ViewScoped注释或<managed-bean-scope>view</managed-bean-scope>中的faces-config.xml

如果你还在使用JSF 1.x(因为你使用那些丑陋的JSF 1.0 / 1.1强制<f:verbatim>标签,我很害怕),那么你必须 < / em>将bean放在session范围内,最终结合唯一的请求范围参数,该参数在h:inputHiddenf:param后续请求中保留使用一个组件来获取第三方库,该组件能够为后续请求保存整个request范围内的bean的状态,例如Tomahawk's t:saveState