Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 334|回复: 0

[AJAX学习]AJAX+JSP实现基于WEB的文件上传的进度控制

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-13 02:49:19 | 显示全部楼层 |阅读模式
    1.引言
         
         
          2.实现代码
         
          
         
       
         
         
          2.1.
          服务器端代码
         
          
         
       
         
         
          2.1.1. 文件上传状态类(FileUploadStatus)
         
         
          2.1.2. 文件上传状态侦听类(FileUploadListener)
         
         
          2.1.3. 后台服务类(BackGroundService)
         
         
          2.1.4. 文件上传状态控制类(BeanControler)
          
         
       
         
          2.2. 客户端代码
         
          
         
       
         
         
          2.2.1. AjaxWrapper.js
         
         
          2.2.2. fileUpload.HTML
         
         
          2.2.3. result.jsp
         
         
          2.2.4. fileUpload.css
          
         
       
         
          2.3. 配置文件
          
         
       
         
          3. 结语
          
         
       
       
       
       
       

       
      
      
      
       
         
         
                          BODY {
            MARGIN: 15px; FONT: 13px Georgia, "Lucida Grande", Arial, sans-serif; COLOR: #000; LETTER-SPACING: 0.01em; BACKGROUND-COLOR: white
    }
                         
          
          
          
            1. 引言
          
          
          基于浏览器的文件上传,特别是对于通过<input type="file">标签来实现上传的情况, 存在着严重的性能问题,因为用户提交了文件之后,在浏览器把文件上传到服务器的过程中,界面看上去似乎是静止的,如果是小文件还好些,如果不幸需要上传的是几兆、几十兆甚至上百兆的文件,我相信那是一种非常痛苦的体验,我们中间的很多人应该都有过此种不堪的经历。(一笑)
          现在我就针对这个问题给出一个解决方案,我们将实现一个具有监控能力的WEB上传的程序――它不仅把文件上传到服务器,而且"实时地"监视文件上传的实际过程。
         解决方案的基本思路是这样的:  
          
           在Form提交上传文件同时,使用AJAX周期性地从Servlet轮询上传状态信息
           然后,根据此信息更新进度条和相关文字,及时反映文件传输状态
           如果用户取消上传操作,则进行相应的现场清理工作:删除已经上传的文件,在Form提交页面中显示相关信息
           如果上传完毕,显示已经上传的文件内容(或链接)  
          
         在介绍源代码之前,我们先来看看程序运行界面:

      
          
          
            2. 实现代码
          
          
          实现代码想当然的有服务器端代码和客户端代码(呵呵),我们先从服务器端开始。
          
          
            2.1. 服务器端代码
          
          
          
          
             2.1.1. 文件上传状态类(FileUploadStatus)
          
          
          使用FileUploadStatus这个类记录文件上传状态,并将其作为服务器端与web客户端之间通信的媒介,通过对这个类对象提供上传状态作为服务器回应发送给web客户端, web客户端使用javaScript获得文件上传状态。源代码如下:
       
    1. /**
    2. * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。
    3. * 如果需要转载本例程,请您注明作者。
    4. *
    5. * 作者: 刘作晨
    6. * EMail:liuzuochen@gmail.com
    7. */
    8. package liuzuochen.sample.upload;
    9. import java.util.*;
    10. public class FileUploadStatus {
    11.     //上传用户地址
    12.     private String uploadAddr;
    13.     //上传总量
    14.     private long uploadTotalSize = 0;
    15.     //读取上传总量
    16.     private long readTotalSize = 0;
    17.     //当前上传文件号
    18.     private int currentUploadFileNum = 0;
    19.     //成功读取上传文件数
    20.     private int successUploadFileCount = 0;
    21.     //状态
    22.     private String status = "";
    23.     //处理起始时间
    24.     private long processStartTime = 0l;
    25.     //处理终止时间
    26.     private long processEndTime = 0l;
    27.     //处理执行时间
    28.     private long processRunningTime = 0l;
    29.     //上传文件URL列表
    30.     private List uploadFileUrlList = new ArrayList();
    31.     //取消上传
    32.     private boolean cancel = false;
    33.     //上传base目录
    34.     private String baseDir = "";
    35.     public FileUploadStatus() {
    36.     }
    37.     public String getBaseDir() {
    38.         return baseDir;
    39.     }
    40.     public void setBaseDir(String baseDir) {
    41.         this.baseDir = baseDir;
    42.     }
    43.     public boolean getCancel() {
    44.         return cancel;
    45.     }
    46.     public void setCancel(boolean cancel) {
    47.         this.cancel = cancel;
    48.     }
    49.     public List getUploadFileUrlList() {
    50.         return uploadFileUrlList;
    51.     }
    52.     public void setUploadFileUrlList(List uploadFileUrlList) {
    53.         this.uploadFileUrlList = uploadFileUrlList;
    54.     }
    55.     public long getProcessRunningTime() {
    56.         return processRunningTime;
    57.     }
    58.     public void setProcessRunningTime(long processRunningTime) {
    59.         this.processRunningTime = processRunningTime;
    60.     }
    61.     public long getProcessEndTime() {
    62.         return processEndTime;
    63.     }
    64.     public void setProcessEndTime(long processEndTime) {
    65.         this.processEndTime = processEndTime;
    66.     }
    67.     public long getProcessStartTime() {
    68.         return processStartTime;
    69.     }
    70.     public void setProcessStartTime(long processStartTime) {
    71.         this.processStartTime = processStartTime;
    72.     }
    73.     public long getReadTotalSize() {
    74.         return readTotalSize;
    75.     }
    76.     public void setReadTotalSize(long readTotalSize) {
    77.         this.readTotalSize = readTotalSize;
    78.     }
    79.     public int getSuccessUploadFileCount() {
    80.         return successUploadFileCount;
    81.     }
    82.     public void setSuccessUploadFileCount(int successUploadFileCount) {
    83.         this.successUploadFileCount = successUploadFileCount;
    84.     }
    85.     public int getCurrentUploadFileNum() {
    86.         return currentUploadFileNum;
    87.     }
    88.     public void setCurrentUploadFileNum(int currentUploadFileNum) {
    89.         this.currentUploadFileNum = currentUploadFileNum;
    90.     }
    91.     public String getStatus() {
    92.         return status;
    93.     }
    94.     public void setStatus(String status) {
    95.         this.status = status;
    96.     }
    97.     public long getUploadTotalSize() {
    98.         return uploadTotalSize;
    99.     }
    100.     public String getUploadAddr() {
    101.         return uploadAddr;
    102.     }
    103.     public void setUploadTotalSize(long uploadTotalSize) {
    104.         this.uploadTotalSize = uploadTotalSize;
    105.     }
    106.     public void setUploadAddr(String uploadAddr) {
    107.         this.uploadAddr = uploadAddr;
    108.     }
    109.     public String toJSon() {
    110.         StringBuffer strJSon = new StringBuffer();
    111.         strJSon.append("{UploadTotalSize:").append(getUploadTotalSize()).append(
    112.                 ",")
    113.                 .append("ReadTotalSize:").append(getReadTotalSize()).append(",")
    114.                 .append("CurrentUploadFileNum:").append(getCurrentUploadFileNum()).
    115.                 append(",")
    116.                 .append("SuccessUploadFileCount:").append(
    117.                         getSuccessUploadFileCount()).append(",")
    118.                 .append("Status:"").append(getStatus()).append("",")
    119.                 .append("ProcessStartTime:").append(getProcessStartTime()).
    120.                 append(",")
    121.                 .append("ProcessEndTime:").append(getProcessEndTime()).append(
    122.                         ",")
    123.                 .append("ProcessRunningTime:").append(getProcessRunningTime()).
    124.                 append(",")
    125.                 .append("Cancel:").append(getCancel()).append("}");
    126.         return strJSon.toString();
    127.     }
    128. }
    复制代码

          
          
             2.1.2. 文件上传状态侦听类(FileUploadListener)
          
          
          使用Common-FileUpload 1.2版本(20070103)。此版本提供了能够监视文件上传情况的ProcessListener接口,使开发者通过FileUploadBase类对象的setProcessListener方法植入自己的Listener。 FileUploadListener类实现了ProcessListener,在整个文件上传过程中,它对上传进度进行监控,并且根据上传 情况实时的更新上传状态Bean。源代码如下:
       
    1. /**
    2. * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。
    3. * 如果需要转载本例程,请您注明作者。
    4. *
    5. * 作者: 刘作晨
    6. * EMail:liuzuochen@gmail.com
    7. */
    8. package liuzuochen.sample.upload;
    9. import org.apache.commons.fileupload.ProgressListener;
    10. import javax.servlet.http.HttpServletRequest;
    11. public class FileUploadListener implements ProgressListener{
    12.         private HttpServletRequest request=null;
    13.         public FileUploadListener(HttpServletRequest request){
    14.                 this.request=request;
    15.         }
    16.         /**
    17.          * 更新状态
    18.          */
    19.         public void update(long pBytesRead, long pContentLength, int pItems){
    20.                 FileUploadStatus statusBean= BackGroundService.getStatusBean(request);
    21.                 statusBean.setUploadTotalSize(pContentLength);
    22.                 //读取完成
    23.             if (pContentLength == -1) {
    24.                statusBean.setStatus("完成对" + pItems +"个文件的读取:读取了 " + pBytesRead + " bytes.");
    25.                statusBean.setReadTotalSize(pBytesRead);
    26.                statusBean.setSuccessUploadFileCount(pItems);
    27.                statusBean.setProcessEndTime(System.currentTimeMillis());
    28.                statusBean.setProcessRunningTime(statusBean.getProcessEndTime());
    29.             //读取中
    30.             } else {
    31.                statusBean.setStatus("当前正在处理第" + pItems +"个文件:已经读取了 " + pBytesRead +
    32.                   "/" + pContentLength+ " bytes.");
    33.                statusBean.setReadTotalSize(pBytesRead);
    34.                statusBean.setCurrentUploadFileNum(pItems);
    35.                statusBean.setProcessRunningTime(System.currentTimeMillis());
    36.             }
    37.             BackGroundService.saveStatusBean(request,statusBean);
    38.         }
    39. }
    复制代码

          
          
             2.1.3. 后台服务类(BackGroundService)
          
          
          BackGroundService这个Servlet类负责接收Form Post数据、回应状态轮询请求、处理取消文件上传的请求。 尽管可以把这些功能相互分离开来,但为了简单明了,还是将它们放到Servlet中,只是由不同的方法进行分割。 源代码如下:
       
    1. /**
    2. * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。
    3. * 如果需要转载本例程,请您注明作者。
    4. *
    5. * 作者: 刘作晨
    6. * EMail:liuzuochen@gmail.com
    7. */
    8. package liuzuochen.sample.upload;

    9. /**
    10. * Title: 后台服务
    11. * * Description: 为客户端提供上传及文件传输状态查询服务
    12. *
    13. */
    14. import java.io.File;
    15. import java.io.IOException;
    16. import java.util.List;
    17. import javax.servlet.ServletException;
    18. import javax.servlet.http.HttpServletRequest;
    19. import javax.servlet.http.HttpServletResponse;
    20. import org.apache.commons.fileupload.FileItem;
    21. import org.apache.commons.fileupload.FileUploadException;
    22. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    23. import org.apache.commons.fileupload.servlet.*;
    24. public class BackGroundService extends javax.servlet.http.HttpServlet implements
    25.         javax.servlet.Servlet {
    26.     public static final String UPLOAD_DIR = "/upload";
    27.     public static final String DEFAULT_UPLOAD_FAILURE_URL = "./result.jsp";
    28.     public BackGroundService() {
    29.         super();
    30.     }
    31.     protected void doGet(HttpServletRequest request,
    32.                          HttpServletResponse response) throws ServletException,
    33.             IOException {
    34.         doPost(request, response);
    35.     }
    36.     /**
    37.      * 从文件路径中取出文件名
    38.      */
    39.     private String takeOutFileName(String filePath) {
    40.         int pos = filePath.lastIndexOf(File.separator);
    41.         if (pos > 0) {
    42.             return filePath.substring(pos + 1);
    43.         } else {
    44.             return filePath;
    45.         }
    46.     }
    47.     /**
    48.      * 从request中取出FileUploadStatus Bean
    49.      */
    50.     public static FileUploadStatus getStatusBean(
    51.             HttpServletRequest request) {
    52.         BeanControler beanCtrl = BeanControler.getInstance();
    53.         return beanCtrl.getUploadStatus(request.getRemoteAddr());
    54.     }
    55.     /**
    56.      * 把FileUploadStatus Bean保存到类控制器BeanControler
    57.      */
    58.     public static void saveStatusBean(
    59.             HttpServletRequest request,
    60.             FileUploadStatus statusBean) {
    61.         statusBean.setUploadAddr(request.getRemoteAddr());
    62.         BeanControler beanCtrl = BeanControler.getInstance();
    63.         beanCtrl.setUploadStatus(statusBean);
    64.     }
    65.     /**
    66.      * 删除已经上传的文件
    67.      */
    68.     private void deleteUploadedFile(HttpServletRequest request) {
    69.         FileUploadStatus satusBean = getStatusBean(request);
    70.         for (int i = 0; i < satusBean.getUploadFileUrlList().size(); i++) {
    71.             File uploadedFile = new File(request.getRealPath(UPLOAD_DIR) +
    72.                                          File.separator +
    73.                                          satusBean.getUploadFileUrlList().
    74.                                          get(i));
    75.             uploadedFile.delete();
    76.         }
    77.         satusBean.getUploadFileUrlList().clear();
    78.         satusBean.setStatus("删除已上传的文件");
    79.         saveStatusBean(request, satusBean);
    80.     }
    81.     /**
    82.      * 上传过程中出错处理
    83.      */
    84.     private void uploadExceptionHandle(
    85.             HttpServletRequest request,
    86.             String errMsg) throws ServletException, IOException {
    87.         //首先删除已经上传的文件
    88.         deleteUploadedFile(request);
    89.         FileUploadStatus satusBean = getStatusBean(request);
    90.         satusBean.setStatus(errMsg);
    91.         saveStatusBean(request, satusBean);
    92.     }
    93.     /**
    94.      * 初始化文件上传状态Bean
    95.      */
    96.     private FileUploadStatus initStatusBean(HttpServletRequest
    97.             request) {
    98.         FileUploadStatus satusBean = new FileUploadStatus();
    99.         satusBean.setStatus("正在准备处理");
    100.         satusBean.setUploadTotalSize(request.getContentLength());
    101.         satusBean.setProcessStartTime(System.currentTimeMillis());
    102.         satusBean.setBaseDir(request.getContextPath() + UPLOAD_DIR);
    103.         return satusBean;
    104.     }
    105.     /**
    106.      * 处理文件上传
    107.      */
    108.     private void processFileUpload(HttpServletRequest request,
    109.                                    HttpServletResponse response) throws
    110.             ServletException, IOException {
    111.         DiskFileItemFactory factory = new DiskFileItemFactory();
    112.         //设置内存缓冲区,超过后写入临时文件
    113.         factory.setSizeThreshold(10240000);
    114.         //设置临时文件存储位置
    115.         factory.setRepository(new File(request.getRealPath("/upload/temp")));
    116.         ServletFileUpload upload = new ServletFileUpload(factory);
    117.         //设置单个文件的最大上传值
    118.         upload.setFileSizeMax(102400000);
    119.         //设置整个request的最大值
    120.         upload.setSizeMax(102400000);
    121.         upload.setProgressListener(new FileUploadListener(request));
    122.         //保存初始化后的FileUploadStatus Bean
    123.         saveStatusBean(request, initStatusBean(request));
    124.         String forwardURL = "";
    125.         try {
    126.             List items = upload.parseRequest(request);
    127.             //获得返回url
    128.             for (int i = 0; i < items.size(); i++) {
    129.                 FileItem item = (FileItem) items.get(i);
    130.                 if (item.isFormField()) {
    131.                     forwardURL = item.getString();
    132.                     break;
    133.                 }
    134.             }
    135.             //处理文件上传
    136.             for (int i = 0; i < items.size(); i++) {
    137.                 FileItem item = (FileItem) items.get(i);
    138.                 //取消上传
    139.                 if (getStatusBean(request).getCancel()) {
    140.                     deleteUploadedFile(request);
    141.                     break;
    142.                 }
    143.                 //保存文件
    144.                 else if (!item.isFormField() && item.getName().length() > 0) {
    145.                     String fileName = takeOutFileName(item.getName());
    146.                     File uploadedFile = new File(request.getRealPath(UPLOAD_DIR) +
    147.                                                  File.separator + fileName);
    148.                     item.write(uploadedFile);
    149.                     //更新上传文件列表
    150.                     FileUploadStatus satusBean =
    151.                             getStatusBean(request);
    152.                     satusBean.getUploadFileUrlList().add(fileName);
    153.                     saveStatusBean(request, satusBean);
    154.                     Thread.sleep(500);
    155.                 }
    156.             }
    157.         } catch (FileUploadException e) {
    158.             uploadExceptionHandle(request, "上传文件时发生错误:" + e.getMessage());
    159.         } catch (Exception e) {
    160.             uploadExceptionHandle(request, "保存上传文件时发生错误:" + e.getMessage());
    161.         }
    162.         if (forwardURL.length() == 0) {
    163.             forwardURL = DEFAULT_UPLOAD_FAILURE_URL;
    164.         }
    165.         request.getRequestDispatcher(forwardURL).forward(request, response);
    166.     }
    167.     /**
    168.      * 回应上传状态查询
    169.      */
    170.     private void responseStatusQuery(HttpServletRequest request,
    171.                                               HttpServletResponse response) throws
    172.             IOException {
    173.         response.setContentType("text/xml");
    174.         response.setHeader("Cache-Control", "no-cache");
    175.         FileUploadStatus satusBean = getStatusBean(request);
    176.         response.getWriter().write(satusBean.toJSon());
    177.     }
    178.     /**
    179.      * 处理取消文件上传
    180.      */
    181.     private void processCancelFileUpload(HttpServletRequest request,
    182.                                          HttpServletResponse response) throws
    183.             IOException {
    184.         FileUploadStatus satusBean = getStatusBean(request);
    185.         satusBean.setCancel(true);
    186.         saveStatusBean(request, satusBean);
    187.         responseStatusQuery(request, response);
    188.     }
    189.     protected void doPost(HttpServletRequest request,
    190.                           HttpServletResponse response) throws ServletException,
    191.             IOException {
    192.         boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    193.         if (isMultipart) {
    194.             processFileUpload(request, response);
    195.         } else {
    196.             request.setCharacterEncoding("UTF-8");
    197.             if (request.getParameter("uploadStatus") != null) {
    198.                 responseStatusQuery(request, response);
    199.             }
    200.             if (request.getParameter("cancelUpload") != null) {
    201.                 processCancelFileUpload(request, response);
    202.             }
    203.         }
    204.     }
    205. }
    复制代码

          
          
             2.1.4. 文件上传状态控制类(BeanControler)
          
          
          这是一个单例类,它的功能是为客户端保存文件上传状态,这里我没有使用Session来存储文件上传状态,因为对于AJAX这种异步调用,服务器会开启不同的Session,所以无法通过Session保存文件上传状态。 我并不认为这种方法最好,如果有更好的方法,欢迎大家一起讨论。 源代码如下:
       

    1. /**
    2. * 本例程演示了通过Web上传文件过程中的进度显示。您可以对本例程进行任何修改和使用。
    3. * 如果需要转载本例程,请您注明作者。
    4. *
    5. * 作者: 刘作晨
    6. * EMail:liuzuochen@gmail.com
    7. */

    8. package liuzuochen.sample.upload;
    9. /**
    10. * Title: 类控制器
    11. *
    12. * Description: 主要作用是对FileUploadStatus进行管理,为客户端提供相应的
    13. * FileUploadStatus类对象。这是一个单例类。
    14. *
    15. */
    16. import java.util.Vector;
    17. public class BeanControler {
    18.     private static BeanControler beanControler = new BeanControler();
    19.     private Vector vector = new Vector();
    20.     private BeanControler() {
    21.     }
    22.     public static BeanControler getInstance() {
    23.         return beanControler;
    24.     }
    25.     /**
    26.      * 取得相应FileUploadStatus类对象的存储位置
    27.      */
    28.     private int indexOf(String strID) {
    29.         int nReturn = -1;
    30.         for (int i = 0; i < vector.size(); i++) {
    31.             FileUploadStatus status = (FileUploadStatus) vector.elementAt(i);
    32.             if (status.getUploadAddr().equals(strID)) {
    33.                 nReturn = i;
    34.                 break;
    35.             }
    36.         }
    37.         return nReturn;
    38.     }
    39.     /**
    40.      * 取得相应FileUploadStatus类对象
    41.      */
    42.     public FileUploadStatus getUploadStatus(String strID) {
    43.         return (FileUploadStatus) vector.elementAt(indexOf(strID));
    44.     }
    45.     /**
    46.      * 存储FileUploadStatus类对象
    47.      */
    48.     public void setUploadStatus(FileUploadStatus status) {
    49.         int nIndex = indexOf(status.getUploadAddr());
    50.         if ( -1 == nIndex) {
    51.             vector.add(status);
    52.         } else {
    53.             vector.insertElementAt(status, nIndex);
    54.             vector.removeElementAt(nIndex + 1);
    55.         }
    56.     }
    57.     /**
    58.      * 删除FileUploadStatus类对象
    59.      */
    60.     public void removeUploadStatus(String strID){
    61.         int nIndex = indexOf(strID);
    62.         if(-1!=nIndex)
    63.             vector.removeElementAt(nIndex);
    64.     }
    65. }
    复制代码

          
          
            2.2. 客户端代码
          
          
          客户端我们采用Prototype框架。请下载。
          
          
             2.2.1. AjaxWrapper.js
          
          
          AjaxWrapper.js对Prototype进行了封装。请下载分析
          
          
             2.2.2. fileUpload.html
          
          
          fileUpload.html是文件上传界面。 请下载。  
          
          
             2.2.3. result.jsp
          
          
          result.jsp是文件上传结果显示界面。 请下载  
          
          
             2.2.4. fileUpload.css
          
          
          fileUpload.css是样式文件。 源代码如下:
         body {
       color:#000;
       background-color:white;
       font:15px Georgia, "Lucida Grande", Arial, sans-serif;
       letter-spacing:0.01em;
       margin:15px;
    }
    #controlPanel,#resultPanel{
       width:700px;
       margin:20px auto;
       padding:25px;
       border:3px solid gray;
       -moz-border-radius:10px;
       background:#f8f8f8;
    }
    #errorArea{
        width:400px;
       margin:20px auto;
       padding:25px;
       border:3px solid gray;
       -moz-border-radius:10px;
       background:red;
    }
    #normalMessageArea{
       width:400px;
       margin:20px auto;
       padding:25px;
       border:3px solid gray;
       -moz-border-radius:10px;
       background:yellow;
    }
    #progressBar { padding-top: 5px; }
       #totalProgressBarBox {
        width: 350px;
        height: 20px;
        border: 1px inset;
        background: #eee;
    }
    #totalProgressBarBoxContent {
       width: 0;
       height: 20px;
       border-right: 1px solid #444;
       background: #9ACB34;
    }
          
          
            2.3. 配置文件
          
          
          web.xml中完成Servlet的配置。
         <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>AjaxPractice</display-name>
    <servlet>
       <description></description>
       <display-name>BackGroundService</display-name>
       <servlet-name>BackGroundService</servlet-name>
       <servlet-class>liuzuochen.sample.upload.BackGroundService</servlet-class>
    </servlet>

    <servlet-mapping>
       <servlet-name>BackGroundService</servlet-name>
       <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
       <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
       <welcome-file>default.html</welcome-file>
       <welcome-file>default.htm</welcome-file>
       <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
      
          
          
            3. 结语
          
          
          整个程序到这里就介绍完了,希望它多少能为您的工作或学习带来点儿帮助。
         
       

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/13/024918625.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 06:56 , Processed in 0.384866 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表