Jsf 2 JSF2.0中带PrimeFaces 3.5的ManagedBean的自定义范围

Jsf 2 JSF2.0中带PrimeFaces 3.5的ManagedBean的自定义范围,jsf-2,primefaces,Jsf 2,Primefaces,以下是我的要求- 这里有一个p:panelGrid,可以添加和删除表中的行。网格包含一些p:inputText和各种其他PrimeFaces组件,以及每行中的p:fileUpload组件。组件p:fileUpload设置了mode=“advanced”auto=“true”属性,该属性在成功完成上传后自动上传文件并隐藏自身 整个p:panelGrid位于@ViewScoped中,因此工作正常。我将p:fileUpload组件保留在@RequestScoped中,因为对于每个上载请求,它都必须上

以下是我的要求-

这里有一个
p:panelGrid
,可以添加和删除表中的行。网格包含一些
p:inputText
和各种其他PrimeFaces组件,以及每行中的
p:fileUpload
组件。组件
p:fileUpload
设置了
mode=“advanced”auto=“true”
属性,该属性在成功完成上传后自动上传文件并隐藏自身

整个
p:panelGrid
位于
@ViewScoped
中,因此工作正常。我将
p:fileUpload
组件保留在
@RequestScoped
中,因为对于每个上载请求,它都必须上载文件,但在添加新行后,以前的状态不再保持。因此,
p:fileUpload
也开始在前面的行中可见。这就是我不想要的。我需要为它编写任何自定义范围吗? 下面是视图-|

<h:form>
    <p:panel id="agentForm" header="#{msg.AGENTS_INFORMATION}"
        style="overflow:auto;  margin-bottom: 2px">
        <div align="center" style="margin-top: 20px; margin-bottom: 2px">
            <ui:repeat value="#{agent.scenarioList}" var="c">
                <p:panelGrid>
                    <p:row>
                        <p:column>
                            <p:inputText id="ipaddress" value="#{c.machineIpAddress}"
                                style="width:90%">
                                <p:watermark for="ipaddress" value="#{msg.MACHINE_IP_ADDRESS}" />
                            </p:inputText>
                        </p:column>
                        <p:column>
                            <p:inputText id="username" value="#{c.machineUsername}"
                                style="width:90%">
                                <p:watermark for="username" value="#{msg.MACHINE_USERNAME}" />
                            </p:inputText>
                        </p:column>
                        <p:column>
                            <p:password id="passwd" value="#{c.machinePassword}">
                                <p:watermark for="passwd" value="#{msg.MACHINE_PASSWORD}" />
                            </p:password>
                        </p:column>
                        <p:column id="fileUpload">
                            <p:fileUpload rendered="#{!fileUploadController.hidden}"
                                label="Upload Script" style="font-size: 100% !important;"
                                showButtons="false"
                                fileUploadListener="#{fileUploadController.upload}"
                                mode="advanced" auto="true" sizeLimit="100000"
                                allowTypes="/(\.|\/)(py|txt)$/"
                                update="fileUpload, outPanel, :message" />
                            <p:outputPanel id="outPanel">
                            <!-- Below outputLabel will be linked to uploaded file, so that User can see the file -->
                            <p:outputLabel style="cursor: pointer" value="View uploded Script"
                                    label="View Script" rendered="#{fileUploadController.hidden}" />
                            </p:outputPanel>
                        </p:column>
                        <p:column>
                            <p:inputText id="testname" value="#{c.testName}"
                                style="width:90%">
                                <p:watermark for="testname" value="#{msg.TEST_NAME}" />
                            </p:inputText>
                        </p:column>
                        <p:column>
                            <p:spinner id="threads" value="#{c.threads}" min="1" max="500"
                                size="8">
                                <p:tooltip for="threads" value="#{msg.TEST_NAME}"
                                    showEffect="slide" hideEffect="slide" />
                            </p:spinner>
                        </p:column>
                        <p:column>
                            <p:selectBooleanCheckbox id="chkSelected" value="#{c.selected}">
                                <p:tooltip for="chkSelected" value="#{msg.CHECKBOX}"
                                    showEffect="slide" hideEffect="slide" />
                            </p:selectBooleanCheckbox>
                        </p:column>
                    </p:row>
                </p:panelGrid>
            </ui:repeat>
            <p:toolbar style="margin-top: 10px;">
                <p:toolbarGroup align="right">
                    <p:commandButton value="#{msg.ADD_IT}"
                        update=":message, agentForm"
                        actionListener="#{agent.addComponent()}" />
                    <p:commandButton value="#{msg.DELETE_IT}"
                        update=":message, agentForm"
                        actionListener="#{agent.deleteComponent()}" />
                </p:toolbarGroup>
            </p:toolbar>
        </div>
    </p:panel>
</h:form>
Scenario对象包含一行的所有信息。下面是代码-

package org.ravij.performance.model;
import java.io.Serializable;
public class Scenario implements Serializable {
    private String machineIpAddress;
    private String machineUsername;
    private String machinePassword;
    private String uploadedFilePath;
    private String testName;
    private int threads = 1;
    private boolean selected = false;

    //Below are the getters and setter w.r.t all the above variables
    //I am not putting it, to make the code short
}

托管bean
FileUploadController
位于
@requestscope

中,您只需将
属性与
@ViewScoped
bean中的其他值一起隐藏即可。您当前的代码有一个与所有
共享的
hidden
属性。谢谢您……请您详细介绍一下
@ViewScoped
bean中的
hidden
字段。我的bean
包含
用户
对象的列表。它很传统也很简单。你能根据我的观点提供修改后的代码吗?当然,将
addComponent()
deleteComponent()
代码从你的
agent
bean添加到你的问题中,我将用一个工作示例更新我的答案。用所需的代码更新问题。请仔细查看。更新后,如果您缺少什么,请随时发表评论。这不完全是你想要的,但我希望它能满足你的需要你做到了。。。非常感谢。工作很好。。酷。非常感谢你。我在
fileUpload
中做了一些更改。我添加了
oncomplete=“uploadDialogWidget.hide();”
,并从bean中删除了它。但是你的黑客技术太棒了。拥有一个
currentScenario
真是奇迹。
package org.ravij.performance.model;
import java.io.Serializable;
public class Scenario implements Serializable {
    private String machineIpAddress;
    private String machineUsername;
    private String machinePassword;
    private String uploadedFilePath;
    private String testName;
    private int threads = 1;
    private boolean selected = false;

    //Below are the getters and setter w.r.t all the above variables
    //I am not putting it, to make the code short
}
public class Scenario implements Serializable {

    private String machineIpAddress;
    private String machineUsername;
    private String machinePassword;
    private String uploadedFilePath;
    private String testName;
    private int threads = 1;
    private boolean selected = false;
    private boolean hidden = false; // This is new

    // + Getters/Setters
}
@ManagedBean(name = "agent")
@ViewScoped
public class AgentInfo implements Serializable {

    private List<Scenario> scenarioList;

    private Scenario currentScenario; // This is new

    // I removed the @PostConstruct which I rarely use

    public void addComponent() {
        if (this.scenarioList != null) {
            this.scenarioList.add(new Scenario());
        }
    }

    public void deleteComponent() {
        if (this.scenarioList == null) {
            return;
        }

        List<Scenario> itemsToDelete = new ArrayList<Scenario>();

        for (Scenario scenario : this.scenarioList) {
            if (scenario.isSelected()) {
                itemsToDelete.add(scenario);
            }
        }

        this.scenarioList.removeAll(itemsToDelete);
    }

    // This is new, it must be called before opening the upload dialog
    // in order to keep a pointer on the current scenario you are working on
    public void prepareUpload(Scenario scenario) {
        this.currentScenario = scenario;
    }

    // I put the upload method here
    public void upload(FileUploadEvent event) {
        // Do what you need to do here
        this.currentScenario.setHidden(true);
        RequestContext.getCurrentInstance().execute("uploadDialogWidget.hide()");
    }

    public List<Scenario> getScenarioList() {
        if (this.scenarioList == null) {
            this.scenarioList = new ArrayList<Scenario>();
            this.scenarioList.add(new Scenario());
        }

        return scenarioList;
    }

    public void setScenarioList(List<Scenario> scenarioList) {
        this.scenarioList = scenarioList;
    }

    public Scenario getCurrentScenario() {
        return currentScenario;
    }

    public void setCurrentScenario(Scenario currentScenario) {
        this.currentScenario = currentScenario;
    }
}
<h:form id="agentForm">
    <p:panel header="#{msg.AGENTS_INFORMATION}"
        style="overflow:auto;  margin-bottom: 2px">
        <div align="center" style="margin-top: 20px; margin-bottom: 2px">
            <ui:repeat value="#{agent.scenarioList}" var="c">
                <p:panelGrid>
                    <p:row>
                        <p:column>
                            <p:inputText id="ipaddress" value="#{c.machineIpAddress}"
                                style="width:90%">
                                <p:watermark for="ipaddress" value="#{msg.MACHINE_IP_ADDRESS}" />
                            </p:inputText>
                        </p:column>
                        <p:column>
                            <p:inputText id="username" value="#{c.machineUsername}"
                                style="width:90%">
                                <p:watermark for="username" value="#{msg.MACHINE_USERNAME}" />
                            </p:inputText>
                        </p:column>
                        <p:column>
                            <p:password id="passwd" value="#{c.machinePassword}" redisplay="true">
                                <p:watermark for="passwd" value="#{msg.MACHINE_PASSWORD}" />
                            </p:password>
                        </p:column>
                        <p:column id="fileUpload">
                            <p:commandButton icon="ui-icon-arrowthick-1-n" value="Upload"
                                             actionListener="#{agent.prepareUpload(c)}"
                                             update=":uploadDialog"
                                             oncomplete="uploadDialogWidget.show()"
                                             rendered="#{!c.hidden}" />
                            <p:outputPanel id="outPanel">
                            <!-- Below outputLabel will be linked to uploaded file, so that User can see the file -->
                            <p:outputLabel style="cursor: pointer" value="View uploded Script"
                                    rendered="#{c.hidden}" />
                            </p:outputPanel>
                        </p:column>
                        <p:column>
                            <p:inputText id="testname" value="#{c.testName}"
                                style="width:90%">
                                <p:watermark for="testname" value="#{msg.TEST_NAME}" />
                            </p:inputText>
                        </p:column>
                        <p:column>
                            <p:spinner id="threads" value="#{c.threads}" min="1" max="500"
                                size="8">
                                <p:tooltip for="threads" value="#{msg.TEST_NAME}"
                                    showEffect="slide" hideEffect="slide" />
                            </p:spinner>
                        </p:column>
                        <p:column>
                            <p:selectBooleanCheckbox id="chkSelected" value="#{c.selected}">
                                <p:tooltip for="chkSelected" value="#{msg.CHECKBOX}"
                                    showEffect="slide" hideEffect="slide" />
                            </p:selectBooleanCheckbox>
                        </p:column>
                    </p:row>
                </p:panelGrid>
            </ui:repeat>
            <p:toolbar style="margin-top: 10px;">
                <p:toolbarGroup align="right">
                    <p:commandButton value="#{msg.ADD_IT}" update="agentForm"
                                     actionListener="#{agent.addComponent()}" />
                    <p:commandButton value="#{msg.DELETE_IT}" update="agentForm"
                        actionListener="#{agent.deleteComponent()}" />
                </p:toolbarGroup>
            </p:toolbar>
        </div>
    </p:panel>
</h:form>
<p:dialog id="uploadDialog" widgetVar="uploadDialogWidget" header="File upload">
    <h:form rendered="#{!empty agent.currentScenario}">
        <p:fileUpload
            label="Upload Script" style="font-size: 100% !important;"
            showButtons="false"
            fileUploadListener="#{agent.upload}"
            mode="advanced" auto="true" sizeLimit="100000"
            allowTypes="/(\.|\/)(py|txt)$/"
            update=":agentForm">
        </p:fileUpload>
        <p:commandButton value="Cancel" onclick="uploadDialogWidget.hide();" onstart="return false;" />
    </h:form>
</p:dialog>