目前 JSF 对于档案上传的支持很差,JSC 内更是缺少档案上传的组件
除非使用 Orcale ADF 的组件,但是 Oracle ADF 并非免费的。
本篇文章主要就是跟大家分享如何在 JSF 内使用免费的 Jakarta Commons FileUpload (http://jakarta.apache.org/commons/fileupload/ ) 组件来实作档案上传功能。
有几点注意事项,这边必须先要提出的:
1. Servlet 部分改自本讨论区 JiaYun 大大的「档案上传 JSP 小范例」,希望他不会介意!^^" (如果需要更清楚的 Jakarta Commons FileUpload 范例,那篇文章
会是更好的选择。)
2. 档案上传,必须把 form 的 enctype 更改如下:
<h:form binding="#{AttachFile.form1}" enctype="multipart/form-data" id="form1">
但是以上的 JSF 标签 compile 都会正常,但是在这个 form 里面,其它组件的 action 都会无法正常触发。所以这边仅使用一般的 JSP 页面。
3. 这篇献丑的教学其实是使用 JSF(其它页面) -> JSP(选择档案页面) -> Servlet(储存使用者上传的档案) -> JSF(其它页面) 的流程。
说穿了,只是使用旧的 JSP + Servlet 技术,请各位高手海涵。
流程一(选择档案的 JSP 页面):
<f:verbatim>
<form action="UploadFile" enctype="multipart/form-data" method="post">
File:<input name="txtFile" type="file"/><br/>
Description:<input name="txtDesc" type="text"/><br/>
<input type="checkbox" name="chkAdd"/>Add another file<br/>
<input style="height: 27px; left: 0px; top: 96px; position: absolute; width: 72px" type="submit" value="Add"/>
<input style="height: 27px; left: 96px; top: 96px; position: absolute; width: 72px" type="submit" value="Cancel"/>
</form>
</f:verbatim>
<h:form binding="#{AttachFile.form1}" id="form1"/>
1. 这个页面包含:
一个 type="file" 的 textbox
一个一般的 textbox 提供为输入档案描述
一个 checkbox,提供多重上传档案
一个 Add 及一个 Cancel 的 Button
2. 如果使用者选取 checkBox,在后面的 Servlet 处理完,则回到这一页 ,选择另一个上传的档案。 如果没有勾选,则前进到其它的 JSF 页面。
3. UploadFile 为后面要处理档案储存的 Servlet 名称。
4. 以上只写出修改的地方,其它 JSF 预设的 tag 就不写出来了。
流程二(web.xml):
<servlet>
<servlet-name>Upload_File</servlet-name>
<servlet-class>webapplication1.UploadFile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload_File</servlet-name>
<url-pattern>/UploadFile</url-pattern>
</servlet-mapping>
1. 请把这一段程序代码与 web.xml 内的其它 servlet tag 放在一块,比较不会出问题。
2. 这段大致的意义为:当你向 server 要求 /UploadFile 这个 URL 时, server 会使用 webapplication1.UploadFile 这个 servlet 来处理你的要求。
流程三(后端处理档案的 Servlet):
UploadFile
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
public class UploadFile extends HttpServlet{
public void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {
//取得 JSF 的 SessionBean
SessionBean1 sesBean=(SessionBean1)servletRequest.getSession().getAttribute("SessionBean1");
//取得 JSF 的 ApplicationBean
ApplicationBean1 appBean=(ApplicationBean1)getServletContext().getAttribute("ApplicationBean1");
// 宣告将上传之档案放置到服务器的 / .... /upload 目录中
//String saveDirectory = appBean.getAttachPath();
// 宣告暂存目录
//String tmpDirectory = "c:\\";
// 宣告限制上传之档案总大小为, 单位为 byte, -1 表示无限制
int maxPostSize = -1;
// 宣告储存叙述上传档案内容的变量
String FileDescription = "";
// 宣告是否接下来要继续新增档案
boolean hasMore = false;
// 宣告储存上传文件名称的变量
String FileName = "";
// 宣告储存上传档案大小的变量
long FileSize = 0;
// 宣告储存上传档案型态的变量
//String ContentType = null;
// 计算上传档案之个数
int count = 0 ;
try {
DiskFileUpload upload = new DiskFileUpload();
// 处理中文档名问题
upload.setHeaderEncoding("UTF-8");
// 设定内存存放数据的大小, 超过则写入档案, 有设定暂存目录, 暂存盘置于暂存目录下
//upload.setSizeThreshold(4096);
// 设定总上传大小限制
//upload.setSizeMax(maxPostSize);
// 设定暂存目录
//upload.setRepositoryPath(tmpDirectory);
List items =upload.parseRequest((HttpServletRequest)servletRequest);
Iterator iter = items.iterator();
FileItem fItem=null;
while(iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
// 一般字段
if(item.getFieldName().equalsIgnoreCase("txtDesc")) {
// 取得档案叙述
FileDescription = item.getString("UTF-8");
}
else if(item.getFieldName().equalsIgnoreCase("chkAdd")) {
// 取得接下来将前往的页面
hasMore = item.getString().equalsIgnoreCase("on") ? true: false;
}
}
else {
// 档案字段
// 否则取得档案信息
FileName = item.getName();
// 因为不同的浏览器会造成传递 path + filename, 有些则只有 filename
// for wintel platform
FileName = FileName.substring(FileName.lastIndexOf("\\")+1);
// for unix-like platform
FileName = FileName.substring(FileName.lastIndexOf("/")+1);
//ContentType = item.getContentType();
FileSize = item.getSize();
fItem=item;
}
}
//--Delete--
//如果需要的话
//你可以在这里使用前面取得的 SessionBean 及 ApplicationBean
//里面的参数对你的数据库做操作,并把档案描述在这里存入数据库
//写入档案
File uploadedFile = new File(appBean.getAttachPath() + FileName);
fItem.write(uploadedFile);
}
catch(Exception ex) {
//例外处理
}
//导向不同的页面
finally {
if(hasMore)
servletResponse.sendRedirect("faces/AttachFile.jsp");
else
servletResponse.sendRedirect("faces/Schedule.jsp");
}
}
}
1. 前面的取得 SessionBean1 及 ApplicationBean1,看个人需要,如果你需要取得 JSF 内的 SessionBean 及 ApplicationBean,可以参考这个用法。
2. 最后的 servletResponse.sendRedirect 会根据前面的 JSP 页面,是否有勾选 chkAdd 来决定是要回到前面的 JSP 页面来继续新增档案,或是前往其它 JSF 页面。
3. 请注意 faces/Schedule.jsp 前面的 faces ,如果不加可能可会出现 Cannot find FacesContext 的错误。
分享到:
相关推荐
下面将详细介绍如何使用JSF实现文件上传,以及涉及到的关键技术和注意事项。 ### 1. JSF的文件上传组件 JSF提供了`<h:inputFile>`组件来实现文件上传的功能。这个组件允许用户选择本地文件,并将其上传到服务器。...
为了实现JSF的大文件上传,开发者通常需要借助第三方库,如Apache Commons FileUpload或者PrimeFaces的FileUpload组件。这些组件提供了分块上传的能力,将大文件切割成小块进行传输,从而避免一次性加载整个文件到...
### 使用JSF和MyFaces实现文件上传 #### 一、理解文件上传机制 在Web开发中,文件上传主要通过HTML表单实现,其中`<input type="file">`元素用于让用户选择文件。当表单提交时,浏览器将表单数据编码为`multipart/...
jsf结合ajax实现文件上传,值得阅读
由于JSF2.0标准实现没有提供文件上传组件,而实际应用中很多时候需要上传文件,为了方便开发,我做了一个基于JSF2.0的文件上传组件,上传使用的是Apache 的commons-fileupload组件,我已经将commons-fileupload-...
总之,尽管JSF在原生支持文件上传方面存在不足,但通过开发自定义组件或利用第三方库,开发者可以有效地实现文件上传功能,以满足其应用程序的需求。理解这一过程有助于提升JSF开发者的技能,并能更好地应对实际项目...
在这个场景中,我们讨论的是如何使用JSF实现文件上传功能。 首先,为了实现文件上传,我们需要依赖几个关键的库文件。这些文件包括`tomahawk-1.1.3.jar`、`commons-fileupload-1.2.jar`和`commons-io-1.3.1.jar`。...
本文将详细介绍如何在JSF环境中实现文件上传和下载,并提供一个可直接在Eclipse下用Tomcat运行的例子。 一、文件上传 1. **依赖库**:在JSF中处理文件上传,我们需要引入Apache Commons FileUpload库,它提供了...
在JSF(JavaServer Faces)框架中实现文件上传功能,通常会涉及到多个依赖库,以处理文件上传的各个阶段,包括文件的解析、临时存储以及后续的业务逻辑处理。在这个场景下,`JSF上传文件用到的包`指的是一个项目中...
jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2...fileupload1.1)开发了一个文件上传组件。
以上就是JSF文件上传和下载的基本实现。为了确保安全性和性能,还需要考虑错误处理、文件大小限制、临时文件管理以及用户权限控制等细节。同时,现代的Web开发中,还可能结合使用CDN(内容分发网络)和云存储服务来...
// 实现文件上传逻辑 // 更新进度 // ... } public String getProgress() { // 获取当前上传进度 // ... } } ``` 3. **配置Servlet映射**:在 `web.xml` 中配置用于获取文件上传进度的Servlet。 ```...
JSF(JavaServer Faces)是Java平台上的一个用于构建用户界面的组件模型框架,尤其...总的来说,JSF文件上传涉及前端组件、后端处理、配置和库的结合,通过这种方式,开发者可以方便地在JSF应用中实现文件上传功能。
MyFaces则是一个开源的JSF实现,它扩展了JSF的基本功能,包括提供了一套丰富的UI组件,这些组件可以与Apache Commons File Upload结合使用,以实现文件上传功能。MyFaces的某些组件可能会直接使用Apache Commons ...
本篇文章将深入探讨如何使用JSF组件实现文件上传功能,并结合描述和标签来阐述这一主题。 首先,我们需要理解JSF组件的工作原理。JSF是一种基于Java的MVC(模型-视图-控制器)框架,用于构建动态的、数据驱动的Web...
其中,`<p:fileUpload>`组件是用于实现文件上传功能的一个重要元素。本篇文章将深入探讨如何使用PrimeFaces的`<p:fileUpload>`组件在JSF应用中实现实时、便捷的文件上传。 首先,让我们了解`<p:fileUpload>`的基本...
例如,我们可以利用PrimeFaces的FileUpload组件来实现文件上传功能,用户可以通过浏览器直接选择文件并将其上传到服务器。 HTML、CSS和JavaScript作为前端的基础技术,各自扮演着关键角色。HTML负责页面结构,CSS...
在本文中,我们将深入探讨如何使用JavaServer Faces (JSF) 2.0与Servlet 3.0结合实现文件上传功能。JSF是Java平台上的一种Web应用程序开发框架,而Servlet 3.0则是用于处理HTTP请求的核心Java API,两者结合可以提供...
首先,我们需要了解JSF中的文件上传组件。JSF提供了一些内置的组件,如`<h:inputFile>`,用于在用户界面中创建一个文件上传表单。用户选择Excel文件后,文件会被暂时存储在服务器的临时目录中。 接着,我们需要处理...