0

以下は私の要件です- ここに画像の説明を入力

ここに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>

私のマネージドBeanは次の@ViewScopedようになります-

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.ravij.performance.model.Scenario;
@ManagedBean(name = "agent")
@ViewScoped
public class AgentInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    List<Scenario> scenarioList;
    @PostConstruct
    public void initBean() {
        this.scenarioList = new ArrayList<Scenario>();
        this.scenarioList.add(new Scenario());
    }
    public void addComponent() {
        if (this.scenarioList != null) {
            this.scenarioList.add(new Scenario());
        } else {
            this.initBean();
        }
    }
    public void deleteComponent() {
        List<Scenario> itemsToDelete = new ArrayList<Scenario>();
        if (this.scenarioList != null) {
            for (Scenario b : this.scenarioList) {
                if (b.isSelected()) {
                    itemsToDelete.add(b);
                }
            }
            this.scenarioList.removeAll(itemsToDelete);
        }
    }
    public List<Scenario> getScenarioList() {
        return scenarioList;
    }
    public void setScenarioList(List<Scenario> scenarioList) {
        this.scenarioList = scenarioList;
    }
}

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
}

マネージドBeanFileUploadController@RequestScoped

4

1 に答える 1

1

Beanhiddenの他の値で属性を保持する必要があります。現在のコードには、すべてのコンポーネントで共有さ@ViewScopedれる単一の属性がありますが、これはおそらくあなたが望んでいるものではありません。hidden<p:fileUpload

現在のコンポーネントのみを更新しているため、動作は良好に見えますがfileUpload、コードによれば、他のすべての<p:fileUploadコンポーネントは非表示になっているはずです。

また、現在の行に一致するインデックス ( using属性から取得できます) またはその他の識別子のようなものを配置することにより、アップロードされているファイルに関連する現在の行を知ることができるように、あなた<h:formをあなたに入れる必要があります。隠しインプット。<ui:repeat<ui:repeatvarStatus

#{fileUploadController.upload}隠しパラメータを取得する最も簡単な方法は、ここで説明されているように応答を取得することですFacesContext: How to get parametrs to BackingBean in jsf page in <ui:repeat>

アップデート

予想よりも少し難しかったです。問題は、<p:fileUploadすべてを囲む形式で送信することです (属性をいじろうとしませんでしたprocess)。そのため、ファイルのアップロードに関連する行を知るのが難しくなります。

<h:formまた、あなたが入れられないことも知りませんでした<ui:repeatが、すべてを1つの形式で取得することを期待しているため、削除ボタンの動作がブロックされています。

ダイアログを使用してファイルアップロードを外部に配置するための作業POCを作成しました。方法は次のとおりです。

些細な Scenario.java :

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
}

AgentInfo.java のいくつかの変更:

@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:commandButtonほとんどの変更はビューにあり、フォームでダイアログを開くために を入れました。また、ダイアログを追加しredisplay、パスワード フィールドの属性を追加しました (フォーム送信後に値を保持する場合に必要です)。指定されていない id を持つコンポーネントへの参照を削除したことに注意してくださいmessage。再導入することを忘れないでください。.xhtml :

<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>

行選択を操作するメカニズムが組み込まれているから<p:panelGridに移行することを検討する必要があります。<p:dataTable

于 2013-04-04T23:47:22.177 に答える