JSF/Prime(FileUpload 组件)multipart-form 不加载托管 bean 类参数

Bic*_*udo 1 jsf primefaces

我正在使用在 glassfifh 3.1 上运行的 NB 7.2.1 来开发 JSF/Primefaces 3.4 Web 应用程序。因此,在提交 multipart-form enctype 时,'FileUploadListener' 触发的事件不允许加载另一个类属性(如其他 JSF inputText 中的 name 或 age)。为什么?

这是视图:

  <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>
Run Code Online (Sandbox Code Playgroud)

这是豆子:

@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());
  }
}
Run Code Online (Sandbox Code Playgroud)

在之前的 'getName()' 调用中,返回了 null。因此,一切都以相同的形式存在。为什么我可以检索 event.getFile() 而不能检索 getNome() ?

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

@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);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)