1

私は、glassfifh3.1で実行されているNB7.2.1を使用して、JSF / Primefaces3.4Webアプリを開発しています。したがって、multipart-form enctypeを送信する場合、「FileUploadListener」によって発生するイベントでは、別のクラス属性(他のJSF inputTextの名前や年齢など)をロードできません。なんで?

ビューは次のとおりです。

  <h:form enctype="multipart/form-data">
    <p:outputLabel value="Nome" for="nome" />
    <p:inputText value="#{controller.nome}" id="nome" />
    <br />
    <p:fileUpload mode="advanced" multiple="true" fileUploadListener="#{controller.doSubmit}" />
  </h:form>

これがBeanです:

@ManagedBean
@SessionScoped
public class Controller {

  private String nome;

  public String getNome() {
    return nome;
  }
  public void setNome(String nome) {
    this.nome = nome;
  }

  public Controller() {
  }

  public void doSubmit(FileUploadEvent event) {
    System.out.println(getNome());
  }
}

以前の「getName()」呼び出しでは、nullが返されました。したがって、すべてが同じ形式になります。event.getFile()を取得でき、getNome()を取得できないのはなぜですか?

4

3 に答える 3

5

「アップロード」ボタンはフォーム全体を送信しません。ファイルをアップロードするだけです。
フォーム全体を送信するには、通常の送信ボタンが必要です。

ファイルアップロードリスナーメソッドでは、ビュースコープのBeanで変数としてファイルを取得するだけで、通常の送信ボタンに関連付けられたアクションメソッドで必要なビジネスロジックを実行できます。他の入力値。

例えば

<h:form enctype="multipart/form-data">
    <p:outputLabel value="Nome" for="nome" />
    <p:inputText value="#{controller.nome}" id="nome" />
    <br />
    <p:fileUpload mode="advanced" multiple="true" fileUploadListener="#{controller.handleUpload}" />
    <p:commandButton value="submit" action="#{controller.doSubmit}" />
</h:form>

@ManagedBean
@ViewScoped
public class Controller {

    private String nome;
    private List<File> files; // Whatever you need to get hold of all files.

    @PostConstruct
    public void init() {
        files = new ArrayList<File>();
    }

    public void handleUpload(FileUploadEvent event) {
        File file = save(event.getUploadedFile()); // Do your thing to save it.
        files.add(file);
    }

    public void doSubmit() {
        // Look, here you do the business job.
        System.out.println("Entered name: " + nome);
        System.out.println("Saved files: " + files);
    }

    // ...
}
于 2013-01-29T00:58:30.863 に答える
1

PrimeFaces fileupload要素のprocess属性を使用して、同様の状況を解決することができました。ファイルのアップロード後に「送信」したいすべてのコンポーネントをフォームにリストしましたが、個別のボタンはなく、3つしかありませんでした。このソリューションは、ファイルがアップロードされた後、リストされている順序で、処理中にリストされているコンポーネントの値を「送信」することに注意してください。同様に、ファイルのアップロードが完了した後、update属性を使用してコンポーネントを更新しました。この場合、process = "name"を追加すると、必要な処理が実行されます。

  <h:form enctype="multipart/form-data">
    <p:outputLabel value="Name" for="name" />
    <p:inputText value="#{controller.name}" id="name" />
    <br />
    <p:fileUpload process="name" mode="advanced" multiple="true" fileUploadListener="#{controller.handleUpload}" />
  </h:form>

管理対象Beanは次のようになります。

    @ManagedBean
    @ViewScoped
    public class Controller {

        private String name;
        private List<File> files; // Whatever you need to get hold of all files.

        @PostConstruct
        public void init() {
            files = new ArrayList<File>();
        }

        public void handleUpload(FileUploadEvent event) {
            File file = save(event.getUploadedFile()); // Do your thing to save it.
            files.add(file);
        }

        public void setName(String name) {
            this.name = name;

            if(!files.isEmpty()) {
               // ... do something with name and files ...
            }
        }
   }
于 2014-10-28T13:54:53.500 に答える
0

私はpartialSubmit="true"processを使用して同様の状況を解決することができました。部分的に処理されたコンポーネントをajaxリクエストポストに送信します。

<h:outputLabel for="saType" value="Sa Type"/>
                <p:selectOneMenu id="saType" required="true" value="#{saUploadController.saDetails.listType}">
                    <p:ajax event="change" partialSubmit="true"/>
                    <f:selectItem itemLabel="--select Type--"  itemValue=""/>
                    <f:selectItems value="#{saUploadController.saTypes}"/>
                </p:selectOneMenu>
                <h:outputLabel value="*select a file :"/> 
                <p:fileUpload id="uploadedFile1" value="#{saUploadController.uploadedFile}" mode="advanced" fileUploadListener="#{saUploadController.handleFileUpload}" allowTypes="/(\.|\/)(xml)$/" update="add:msgsAdd add:saType" process="saType"/>                      
                <p:message for="uploadedFile1" display="icon"/>

を使用し<p:ajax event="change" partialSubmit="true"/> て、ドロップダウン値を部分的に送信できます。これによりprocess="saType"、handleFileUploadメソッドのドロップダウンアイテム値が取得されます。

于 2019-03-19T12:06:17.613 に答える