0

我有问题。我有一个 bean CreateProjectBean 它是 RequestScope bean。我想使用名为 Collector 的 Prime Faces 组件,因此我可以在视图 createProject 表 groupRoleAdapters 中动态更改,这是 CreateProjectBean 的一个字段。不幸的是,每次我在收集器中单击“添加”或“删除”时,都会向 bean 发送一个新请求,这意味着再次创建 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>
4

1 回答 1

0

如果您已经在 J​​SF 2.0 上,只需将 bean 放在view范围内,通过@ViewScoped注解或通过<managed-bean-scope>view</managed-bean-scope>in faces-config.xml

如果您仍在使用 JSF 1.x(我很害怕,因为您使用的是那些丑陋的 JSF 1.0/1.1-mandatory<f:verbatim>标记),那么您必须bean 放在session范围内,最终结合一个独特的请求scoped 参数,由h:inputHiddenor保留在后续请求中f:param或者使用能够为后续请求保存整个request范围 bean 状态的组件获取 3rd 方库,例如Tomahawk 的 t:saveState.

于 2010-09-29T23:59:52.640 回答