`

JSF实现文件上传

    博客分类:
  • JSF
jsf 
阅读更多
 目前 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实现文件上传

    jsf结合ajax实现文件上传,值得阅读

    jsf2.0 文件上传组件

    由于JSF2.0标准实现没有提供文件上传组件,而实际应用中很多时候需要上传文件,为了方便开发,我做了一个基于JSF2.0的文件上传组件,上传使用的是Apache 的commons-fileupload组件,我已经将commons-fileupload-...

    使用JSF和MyFaces实现文件上载

    教你使用JSF和MyFaces实现文件上载。

    JSF自定义文件上传组件

    jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2...fileupload1.1)开发了一个文件上传组件。

    JSF实现的文件上传

    该资源能够直接对上传大文件,速度比较快。部署后即可使用。

    jsf实现基于ajax的上传例子

    jsf实现基于ajax的上传例子

    JSF+Spring+JPA(Hibernate实现)的环境搭建

    我个人还是比较推崇apache的Struts2的,当然了,apache的JSF实现和JSF组件也是相当地杠杠的!!!!JSF更贴近事件比较多的web前端处理机制。想想我们一般要接收和处理页面的各种事件是用什么:js函数+ajax处理是吧...

    用JSF和MyFaces上传文件

    用户可以很方便使用浏览器上传文件,但是当前的Java Web标准(如servlets, JSP, and JSF)并没有提供任何上传的功能。幸好第三方框架,比如 Apache Commons File Upload, Apache MyFaces, and Oracle ADF Faces,...

    jsf2.0上传组件(servlet3.0)

    利用JSF2.0和servlet3.0做的上传的例子,并实现单个文件上传的组件,虽然有些小限制,但是对单个上传功能完全可以实现。花了一整天的时间来研究啊,不容易!顶起吧。有什么想法请发表评论

    JSF+rich 实现 fileUpload

    JSF+rich 实现 fileUpload java代码实现上传文件和图片,代码已经测试过,架包完整,下载后可以直接运行

    JSF工程实例源代码

    JSF工程实例源代码,包含实现文件上传与下载的全部源代码和文档,数据库使用oracle10g

    蝙蝠在线考试系统v2.2.6 JSF2+SPRING+JPA

    功能涵盖了试题模块管理、试题管理、题库导入导出、公式编辑、图片上传、考试管理、成绩管理、班级管理、考场管理、用户管理、信息发布与讨论区管理、管理员操作日志管理、用户个人文件管理等绝大多数在线考试管理...

    JAVA WEB典型模块与项目实战大全

    2.6 jsf框架的实现  2.7 ajax框架的实现  2.8 使用jdbc连接数据库  2.9 小结  第3章 实现各种框架的集成  3.1 spring框架与其他框架的集成原理  3.2 实现ssh三种框架环境集成  3.3 实现spring与...

    GooglePlay:我们使用jsf完成的项目分配

    项目的工作逻辑: 它是根据授权顺序上传到站点的文件列表,并向用户显示。 -有关项目和数据库中完成的信息-14表3 M2M关系表已创建。 对于O2M关系和M2M关系,CRUD程序已完全完成。 进行了单数阅读。 项目中的CRUD...

    蝙蝠论坛系统 v1.1.rar

    蝙蝠论坛是基于JSF2 Spring3 JPA2等JAVA技术构建的一个小型论坛系统,内置了无处不在的AJAX能力,简洁易用,功能涵盖版面管理、版主设置、发贴、回复、置顶、屏蔽、内部邮件等常用论坛功能,既可以作为非商业性的...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    SpringMvc源码

    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动...支持本地化(Locale)解析、主题(Theme)解析及文件上传等;

    跟我学SpringMVC

    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC...支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格 式化和数据绑定机制;

    PrimeFaces学习教程

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

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

Global site tag (gtag.js) - Google Analytics