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

时间:2013-01-29 00:57:03

标签: jsf primefaces

我正在使用在glassfifh 3.1上运行的NB 7.2.1来开发JSF / Primefaces 3.4网络应用程序。因此,在提交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>

这是豆子:

@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()?

3 个答案:

答案 0 :(得分:4)

“上传”按钮不会提交整个表单。它只会上传文件 要提交整个表单,您需要一个正常的提交按钮。

在文件上传监听器方法中,您只需将文件作为视图范围bean中的变量保存,以便您可以在与正常提交按钮关联的操作方法中对其执行必要的业务逻辑,以及所有其他输入值。

E.g。

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

    // ...
}

答案 1 :(得分:1)

我能够通过使用PrimeFaces fileupload元素的process属性来解决类似的情况。我在表单中列出了我想要的所有组件&#34;提交&#34;文件上传后没有单独的按钮,只有三个。请注意,此解决方案&#34;提交&#34;上传文件后的流程中列出的组件值以及列出的顺序。同样,我在文件上传完成后使用update属性更新组件。在这种情况下,add process =&#34; name&#34;它应该做你需要的。

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

答案 2 :(得分:0)

我能够使用 partialSubmit =“ true” 过程解决类似的情况。 将部分处理过的组件提交给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方法的下拉项值