JSF 2.0文件上传 [英] JSF 2.0 File upload
问题描述
上传文件,但所有的解决方案都混淆了我。我想知道什么是我需要能够成功上传文件(MP3,PDF,视频...什么类型),并将其作为@Lob存储在数据库中。
这是我迄今为止所做的:
-
我创建了一个实体,其类型为byte [ ],它也用@Lob注解来注解。我创建了一个EJB来引入实体,其中的方法有一个byte []作为参数一个参数,并使用EntityManager类(persist方法)将其插入到数据库中。
我创建了一个带有file类型的输入标签的JSF页面,一个提交按钮 -
我准备了一个托管bean,以便与JSF页面交换关于该文件的信息。
现在我被卡住了,我有很多疑问: 我应该怎样将文件从JSF传递到托管bean,然后将其转换为字节[](为了能够处理到EJB)? servlet如何帮助我? 我需要一个servlet来完成这个吗?
我之前从来没有做过文件上传,而且我对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项目。 下载 Tomahawk 1.1.10 for JSF 2.0 。解压zip文件,进入
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>
$ b
<?xml version =1.0encoding =UTF-8 >?;
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>
/ 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屋!