目前 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结合ajax实现文件上传,值得阅读
由于JSF2.0标准实现没有提供文件上传组件,而实际应用中很多时候需要上传文件,为了方便开发,我做了一个基于JSF2.0的文件上传组件,上传使用的是Apache 的commons-fileupload组件,我已经将commons-fileupload-...
教你使用JSF和MyFaces实现文件上载。
jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2...fileupload1.1)开发了一个文件上传组件。
该资源能够直接对上传大文件,速度比较快。部署后即可使用。
jsf实现基于ajax的上传例子
我个人还是比较推崇apache的Struts2的,当然了,apache的JSF实现和JSF组件也是相当地杠杠的!!!!JSF更贴近事件比较多的web前端处理机制。想想我们一般要接收和处理页面的各种事件是用什么:js函数+ajax处理是吧...
用户可以很方便使用浏览器上传文件,但是当前的Java Web标准(如servlets, JSP, and JSF)并没有提供任何上传的功能。幸好第三方框架,比如 Apache Commons File Upload, Apache MyFaces, and Oracle ADF Faces,...
利用JSF2.0和servlet3.0做的上传的例子,并实现单个文件上传的组件,虽然有些小限制,但是对单个上传功能完全可以实现。花了一整天的时间来研究啊,不容易!顶起吧。有什么想法请发表评论
JSF+rich 实现 fileUpload java代码实现上传文件和图片,代码已经测试过,架包完整,下载后可以直接运行
JSF工程实例源代码,包含实现文件上传与下载的全部源代码和文档,数据库使用oracle10g
功能涵盖了试题模块管理、试题管理、题库导入导出、公式编辑、图片上传、考试管理、成绩管理、班级管理、考场管理、用户管理、信息发布与讨论区管理、管理员操作日志管理、用户个人文件管理等绝大多数在线考试管理...
2.6 jsf框架的实现 2.7 ajax框架的实现 2.8 使用jdbc连接数据库 2.9 小结 第3章 实现各种框架的集成 3.1 spring框架与其他框架的集成原理 3.2 实现ssh三种框架环境集成 3.3 实现spring与...
项目的工作逻辑: 它是根据授权顺序上传到站点的文件列表,并向用户显示。 -有关项目和数据库中完成的信息-14表3 M2M关系表已创建。 对于O2M关系和M2M关系,CRUD程序已完全完成。 进行了单数阅读。 项目中的CRUD...
蝙蝠论坛是基于JSF2 Spring3 JPA2等JAVA技术构建的一个小型论坛系统,内置了无处不在的AJAX能力,简洁易用,功能涵盖版面管理、版主设置、发贴、回复、置顶、屏蔽、内部邮件等常用论坛功能,既可以作为非商业性的...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动...支持本地化(Locale)解析、主题(Theme)解析及文件上传等;
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC...支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格 式化和数据绑定机制;
2.11.1 FileUpload 上传文件 67 2.11.2 FileDownload 下载文件 69 2.11.3 IdleMonitor 屏幕凝滞 70 2.11.4 Terminal 70 2.12 辅助功能(辅助其它JSF组件,给它们添加新的功能和行为): 71 2.12.1 Ajax Engine 71 ...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...