JSF 2.0文件上传 [英] JSF 2.0 File upload

查看:119
本文介绍了JSF 2.0文件上传的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在看几个博客,试图找到如何使用JSF 2.0
上传文件,但所有的解决方案都混淆了我。我想知道什么是我需要能够成功上传文件(MP3,PDF,视频...什么类型),并将其作为@Lob存储在数据库中。
这是我迄今为止所做的:


  • 我创建了一个实体,其类型为byte [ ],它也用@Lob注解来注解。我创建了一个EJB来引入实体,其中的方法有一个byte []作为参数一个参数,并使用EntityManager类(persist方法)将其插入到数据库中。

  • 我创建了一个带有file类型的输入标签的JSF页面,一个提交按钮
  • 我准备了一个托管bean,以便与JSF页面交换关于该文件的信息。




现在我被卡住了,我有很多疑问:


  • 我应该怎样将文件从JSF传递到托管bean,然后将其转换为字节[](为了能够处理到EJB)?

  • servlet如何帮助我?

  • 我需要一个servlet来完成这个吗?

  • 有些博客提到了关于servlet 3.0的一些问题,但是我不知道我的工作环境是否正在使用它,如何使用servlet 3.0(我正在使用JEE6)呢?


我之前从来没有做过文件上传,而且我对servlets也不是很熟悉。我很困惑,有人可以给我一些启动提示,请问? 首先,这(老)问题和答案假定JSF 2.0 / 2.1。由于JSF 2.2有一个本地< h:inputFile> 组件,而不需要第三方组件库。另请参阅如何使用JSF 2.2< h:inputFile>上传文件?保存的文件在哪里?






最简单的方法是使用 Tomahawk for JSF 2.0 。它提供了 < t:inputFileUpload> 组件。



下面是一个循序渐进的教程:


  • 创建Servlet 3.0和JSF 2.0的空白动态Web项目。 web.xml 必须符合Servlet 3.0规范,并且已经包含了JSF servlet:

     <?xml version =1.0encoding =UTF-8?> 
    < web-app
    xmlns =http://java.sun.com/xml/ns/javaee
    xmlns:xsi =http://www.w3.org / 2001 / XMLSchema-instance
    xsi:schemaLocation =http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0 .xsd
    id =YourProjectNameversion =3.0>

    < display-name>您的项目名称< / display-name>

    < servlet>
    < servlet-name> Faces Servlet< / servlet-name>
    < servlet-class> javax.faces.webapp.FacesServlet< / servlet-class>
    <加载启动> 1< /加载启动>
    < / servlet>
    < servlet-mapping>
    < servlet-name> Faces Servlet< / servlet-name>
    < url-pattern> *。xhtml< / url-pattern>
    < / servlet-mapping>

    < / web-app>

    faces-config.xml 必须符合JSF 2.0规范:
    $ b

     <?xml version =1.0encoding =UTF-8 >?; 
    xmlns =http://java.sun.com/xml/ns/javaee
    xmlns:xsi =http://www.w3.org / 2001 / XMLSchema-instance
    xsi:schemaLocation =http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0 .xsd
    version =2.0>

    < / faces-config>





  • 下载 Tomahawk 1.1.10 for JSF 2.0 。解压zip文件,进入 / lib 文件夹,将所有的 *。jar 文件复制到 / WEB-INF / lib中

    这是18个文件,其中 batik * .jar xml * .jar单独使用 t:inputFileUpload 组件不需要。您可以放弃它们。




  • web.xml中配置Tomahawk扩展过滤器。它是负责处理需要能够通过HTTP发送文件的 multipart / form-data 请求的人。

    < filter>
    < filter-name> MyFacesExtensionsFilter< / filter-name>
    < filter-class> org.apache.myfaces.webapp.filter.ExtensionsFilter< / filter-class>
    < / filter>
    < filter-mapping>
    < filter-name> MyFacesExtensionsFilter< / filter-name>
    < servlet-name> Faces Servlet< / servlet-name>
    < / filter-mapping>

    请注意< servlet-name> 必须匹配< code>< code> FacesServlet< / code> c> web.xml





  • 创建一个简单的Facelet, upload.xhtml


    $ b

     <!DOCTYPE html> ; 
    xmlns =http://www.w3.org/1999/xhtml
    xmlns:f =http://java.sun。 com / jsf / core
    xmlns:h =http://java.sun.com/jsf/html
    xmlns:t =http://myfaces.apache.org/tomahawk
    xmlns:ui =http://java.sun.com/jsf/facelets>
    < h:head>
    < title> Tomahawk文件上传演示< / title>
    < / h:头>
    < h:body>
    < h:form enctype =multipart / form-data>
    < t:inputFileUpload value =#{bean.uploadedFile}/>
    < h:commandButton value =submitaction =#{bean.submit}/>
    < h:messages />
    < / h:表格>
    < / h:body>
    < / html>

    请注意 enctype =multipart / form-data属性,这对于能够使用HTTP发送文件是非常重要的





  • 创建一个简单的托管bean, com.example.Bean

      package com.example; 

    import java.io.IOException;

    import javax.faces.application.FacesMessage;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
    import javax.faces.context.FacesContext;

    导入org.apache.commons.io.FilenameUtils;
    import org.apache.myfaces.custom.fileupload.UploadedFile;

    @ManagedBean
    @RequestScoped
    公共类Bean {

    私有UploadedFile uploadedFile;
    $ b $ public void submit()throws IOException {
    String fileName = FilenameUtils.getName(uploadedFile.getName());
    String contentType = uploadedFile.getContentType();
    byte [] bytes = uploadedFile.getBytes();

    //现在你可以在DB中保存字节(也是内容类型)

    FacesContext.getCurrentInstance()。addMessage(null,
    new FacesMessage(String .format(%s'类型的文件'%s'成功上传!,fileName,contentType)));
    }

    public UploadedFile getUploadedFile(){
    return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile){
    this.uploadedFile = uploadedFile;


    $ b $ / code $ / pre
    $ b $ hr


就是这样。通过 http:// localhost:8080 / projectname / upload.xhtml 打开它。



至于你的具体问题:


我该怎么做才能通过文件从JSF到托管bean,然后将其转换为一个字节[](为了能够处理它到EJB)?

这是上面的答案。


servlet如何帮助我?


它能够处理和控制HTTP请求/响应。在JSF环境中, FacesServlet 已经完成了所有工作。



在JSF环境中, FacesServlet 是强制性的。但它已经由API提供了,你不需要自己写一个。但是,为了能够从数据库中下载文件,另一个servlet是绝对有用的。你可以在这里找到一个基本的例子:服务静态内容的Servlet


我还发现在某些博客中提到了关于servlet 3.0的一些内容,但是我不知道我的工作环境是否正在运行如果我正在使用Servlet 3.0(我正在使用JEE6)?


如果您使用的是Servlet 3.0像Glassfish 3,JBoss AS 6,Tomcat 7等容器和 web.xml 被声明为Servlet 3.0,那么你肯定使用Servlet 3.0。 Servlet 3.0是Java EE 6的一部分。


I am looking around a few blogs, to try to find how to upload files using JSF 2.0 But all the solutions kind of confuse me. I would like to know what do I exactly need to be able to successfully upload a file(MP3, PDF, video... what ever type) and store it in a database as a @Lob. This is what I have done so far:

  • I created an entity that has an attribute of type byte[] and it is also annotated with a @Lob annotation.

  • I created an EJB that will introduce the entity with with a method that has a byte[] as a parameter and inserts it into the database using the EntityManager class( persist method).

  • I created a JSF page with an input tag of type "file" and a submit button

  • I prepared a managed bean to interchange information about the file with the JSF page.

Now I am stuck, and I have lots of doubts:

  • What should I do to pass the file from the JSF to the managed bean and then transform it to a byte[](To be able to handle it over to the EJB)?

  • How can a servlet help me?

  • Do I need a servlet to do this?

  • Also I found that in some blog it mentions something about servlets 3.0, but I don't know if my working environment is using it, how can if I am using servlets 3.0 (I am using JEE6)?

I never did file upload before and also I am not very familiar with servlets. I am confused, someone could give me some starting tips, please?

解决方案

First of all, this (old) question and answer assumes JSF 2.0/2.1. Since JSF 2.2 there's a native <h:inputFile> component without the need for 3rd party component libraries. See also How to upload file using JSF 2.2 <h:inputFile>? Where is the saved File?


The easiest way would be using Tomahawk for JSF 2.0. It offers a <t:inputFileUpload> component.

Here's a step-by-step tutorial:

  • Create a blank dynamic web project for Servlet 3.0 and JSF 2.0. The web.xml must comply Servlet 3.0 spec and already contain the JSF servlet:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="YourProjectName" version="3.0">
    
        <display-name>Your Project Name</display-name>
    
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>*.xhtml</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    The faces-config.xml must comply JSF 2.0 spec:

    <?xml version="1.0" encoding="UTF-8"?>
    <faces-config
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
        version="2.0">
    
    </faces-config>
    


  • Download Tomahawk 1.1.10 for JSF 2.0. Extract the zip file, go to the /lib folder and copy all *.jar files into your /WEB-INF/lib.

    It are 18 files, of which batik*.jar and xml*.jar are unnecessary for using alone the t:inputFileUpload component. You could leave them away.


  • Configure the Tomahawk extensions filter in web.xml. It's the one who's responsible for handling multipart/form-data requests which is required to be able to send files over HTTP.

    <filter>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    

    Note that the <servlet-name> must match the exact <servlet-name> of the FacesServlet as you've definied in web.xml.


  • Create a simple Facelet, upload.xhtml:

    <!DOCTYPE html>
    <html lang="en"
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:t="http://myfaces.apache.org/tomahawk"
        xmlns:ui="http://java.sun.com/jsf/facelets">
        <h:head>
            <title>Tomahawk file upload demo</title>
        </h:head>
        <h:body>
            <h:form enctype="multipart/form-data">
                <t:inputFileUpload value="#{bean.uploadedFile}" />
                <h:commandButton value="submit" action="#{bean.submit}" />
                <h:messages />
            </h:form>
        </h:body> 
    </html>
    

    Note the enctype="multipart/form-data" attribute on <h:form>, this is very important in order to be able to send files with HTTP.


  • Create a simple managed bean, com.example.Bean:

    package com.example;
    
    import java.io.IOException;
    
    import javax.faces.application.FacesMessage;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
    import javax.faces.context.FacesContext;
    
    import org.apache.commons.io.FilenameUtils;
    import org.apache.myfaces.custom.fileupload.UploadedFile;
    
    @ManagedBean
    @RequestScoped
    public class Bean {
    
        private UploadedFile uploadedFile;
    
        public void submit() throws IOException {
            String fileName = FilenameUtils.getName(uploadedFile.getName());
            String contentType = uploadedFile.getContentType();
            byte[] bytes = uploadedFile.getBytes();
    
            // Now you can save bytes in DB (and also content type?)
    
            FacesContext.getCurrentInstance().addMessage(null, 
                new FacesMessage(String.format("File '%s' of type '%s' successfully uploaded!", fileName, contentType)));
        }
    
        public UploadedFile getUploadedFile() {
            return uploadedFile;
        }
    
        public void setUploadedFile(UploadedFile uploadedFile) {
            this.uploadedFile = uploadedFile;
        }
    
    }
    


That should be it. Open it by http://localhost:8080/projectname/upload.xhtml.

As to your concrete questions:

what should i do to pass the file from the JSF to the managed bean and then transform it to a byte[](To be able to handle it over to the EJB)?

This is answered above.

How can a servlet help me?

It is able to process and control HTTP requests/responses. In a JSF environment, the FacesServlet already does all the work.

Do i need a servlet to do this?

In a JSF environment, the FacesServlet is mandatory. But it's already provided by the API, you don't need to write one yourself. However, to be able to download files from a database, another servlet is definitely useful. You can find a basic example here: Servlet for serving static content.

Also i found that in some blog it mentions something about servlets 3.0, but i dont know if my working enviroment is ussing it, how can if i am ussing servlets 3.0(I am ussing JEE6)?

If you're using Servlet 3.0 container like Glassfish 3, JBoss AS 6, Tomcat 7, etc and the web.xml is declared as Servlet 3.0, then you're definitely using Servlet 3.0. Servlet 3.0 is part of Java EE 6.

这篇关于JSF 2.0文件上传的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆