栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JSF 2.0文件上传

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JSF 2.0文件上传

首先,这个(旧的)问答假设为JSF 2.0 / 2.1。从JSF 2.2开始,有了一个本机

<h:inputFile>
组件,而无需第三方组件库。另请参阅如何使用
JSF 2.2 <h:inputFile>
上传文件?保存的文件在哪里?

最简单的方法是将Tomahawk用于JSF 2.0。它提供了一个

<t:inputFileUpload>
组件。

这是一个分步教程:

为Servlet 3.0和JSF 2.0创建一个空白的动态Web项目。在

web.xml
必须遵守的Servlet 3.0规范,已经包含了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>

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

<?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>

下载适用于JSF 2.0的

Tomahawk 1.1.10
。解压缩zip文件,转到/lib文件夹,然后将所有
*.jar
文件复制到中
/WEB-INF/lib

它是18页的文件,其中

batik*.jar和xml*.jar
是不必要的单独使用t:inputFileUpload的组件。您可以将它们丢掉。

在中配置Tomahawk扩展过滤器

web.xml
。它是负责处理
multipart/form-data
请求的人员,该请求是能够通过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>

请注意,

<servlet-name>
必须完全匹配
<servlet-name>
FacesServlet
与您
在definied web.xml

创建一个简单的

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>

注意上的

enctype="multipart/form-data"
属性
<h:form>
,这对于能够使用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;import org.apache.commons.io.FilenameUtils;import org.apache.myfaces.custom.fileupload.UploadedFile;@ManagedBean@RequestScopedpublic 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;    }}

应该的。通过

http:// localhost:8080 / projectname / upload.xhtml
打开它。

关于您的具体问题:

我应该怎么做才能将文件从JSF传递到托管bean,然后将其转换为byte [](以便能够将其处理到EJB)?

上面已经回答了。

servlet如何帮助我?

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

我需要一个servlet来做到这一点吗?

在JSF环境中,FacesServlet必选。但是API已经提供了它,您不需要自己编写。但是,为了能够从数据库下载文件,另一个servlet绝对有用。您可以在此处找到一个基本示例:用于提供静态内容的Servlet。

我也发现在某个博客中提到了servlets 3.0,但是我不知道我的工作环境是否正在使用它,如果我正在使用servlets 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的一部分。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号