最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Struts2實(shí)現(xiàn)文件上傳時(shí)顯示進(jìn)度條功能

 更新時(shí)間:2017年05月04日 16:27:00   作者:surmounting  
這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)文件上傳時(shí)顯示進(jìn)度條功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

       最近在做一個(gè)資源共享的項(xiàng)目中,采用了Struts2.1.8+Spring2.5.6+hibernate3.32的框架整合方式進(jìn)行開(kāi)發(fā)。在文件上傳這塊,因?yàn)樾枰獙?shí)現(xiàn)文件上傳時(shí)顯示進(jìn)度條的功能,所以嘗試了一下。怕以后忘記,先貼出來(lái)分享下。

       要在上傳文件時(shí)能顯示進(jìn)度條,首先需要實(shí)時(shí)的獲知web服務(wù)端接收了多少字節(jié),以及文件總大小,這里我們?cè)陧?yè)面上使用AJAX技術(shù)每一秒向服務(wù)器發(fā)送一次請(qǐng)求來(lái)獲得需要的實(shí)時(shí)上傳信息。但是當(dāng)我們使用struts2后怎么在服務(wù)端獲得實(shí)時(shí)的上傳大小呢?這里需要用到commons-fileupload中的progressListener接口,實(shí)現(xiàn)這個(gè)接口,然后再實(shí)現(xiàn)一個(gè)自己的解析器,并在解析器中添加自己實(shí)現(xiàn)的那個(gè)progressListener;然后再替換struts2自帶的解析器(struts2自帶的解析器類沒(méi)有添加progressListener),然后就可以了。下面看看主要的代碼(技術(shù)有限,如有不對(duì)之處,望不吝點(diǎn)解): 

監(jiān)聽(tīng)器:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.ProgressListener;

public class ResourceProgressListener implements ProgressListener {
 private HttpSession session;
 public ResourceProgressListener(HttpServletRequest request) {
  session = request.getSession();
  ResourceFileUploadStatus newUploadStatus = new ResourceFileUploadStatus();
  session.setAttribute("currentUploadStatus", newUploadStatus);

 }
 public void update(long readedBytes, long totalBytes, int currentItem) {
  ResourceFileUploadStatus status = (ResourceFileUploadStatus) session.getAttribute("currentUploadStatus");
  status.setReadedBytes(readedBytes);
  status.setTotalBytes(totalBytes);
  status.setCurrentItem(currentItem);

 }

}

上傳狀態(tài)類:

public class ResourceFileUploadStatus {
 private long readedBytes = 0L;
 private long totalBytes = 0L;
 private int currentItem = 0;

 public long getReadedBytes() {

  return readedBytes;
 }
 public void setReadedBytes(long bytes) {
  readedBytes = bytes;
 }

 public long getTotalBytes() {
  return totalBytes;
 }
 public void setTotalBytes(long bytes) {
  totalBytes = bytes;
 }
 public int getCurrentItem() {
  return currentItem;

 }

 public void setCurrentItem(int item) {
  currentItem = item;

 }

}

實(shí)現(xiàn)自己的解析器類:方法比較簡(jiǎn)單,找到struts2實(shí)現(xiàn)的解析器類,把代碼拷貝過(guò)來(lái)然后添加上監(jiān)聽(tīng)器即可。這個(gè)類代碼較多就不整個(gè)文件拷了,主要是在parse方法里添加。Parse方法代碼如下:紅色標(biāo)注部分即是需要自己添加的progressListener.

public void parse(HttpServletRequest servletRequest, String saveDir)
  throws IOException {

 System.out.println("執(zhí)行自定義MultiPartRequest");
  DiskFileItemFactory fac = new DiskFileItemFactory();
  // Make sure that the data is written to file
  fac.setSizeThreshold(0);
  if (saveDir != null) {
   fac.setRepository(new File(saveDir));
  }

  // Parse the request

  try {

   ServletFileUpload upload = new ServletFileUpload(fac);
   upload.setSizeMax(maxSize);

   ResourceProgressListener progressListener = new ResourceProgressListener(servletRequest);//新建一個(gè)監(jiān)聽(tīng)器

    upload.setProgressListener(progressListener);//添加自己的監(jiān)聽(tīng)器

   List items = upload.parseRequest(createRequestContext(servletRequest));

    for (Object item1 : items) {

    FileItem item = (FileItem) item1;
    if (LOG.isDebugEnabled()) LOG.debug("Found item " + item.getFieldName());
    if (item.isFormField()) {
     LOG.debug("Item is a normal form field");
     List<String> values;
     if (params.get(item.getFieldName()) != null) {
      values = params.get(item.getFieldName());
     } else {

      values = new ArrayList<String>();

     }
     String charset = servletRequest.getCharacterEncoding();
     if (charset != null) {
      values.add(item.getString(charset));
     } else {

      values.add(item.getString());
     }

     params.put(item.getFieldName(), values);

    } else {

     LOG.debug("Item is a file upload");

 

     // Skip file uploads that don't have a file name - meaning that no file was selected.
     if (item.getName() == null || item.getName().trim().length() < 1) {
      LOG.debug("No file has been uploaded for the field: " + item.getFieldName());
      continue;

     }
 

     List<FileItem> values;
     if (files.get(item.getFieldName()) != null) {
      values = files.get(item.getFieldName());
     } else {
      values = new ArrayList<FileItem>();

     }

 

     values.add(item);
     files.put(item.getFieldName(), values);
    }
   }
  } catch (FileUploadException e) {
   LOG.warn("Unable to parse request", e);
   errors.add(e.getMessage());

  }

} 

上面的類建立完成后,還需要做一項(xiàng)工作:在struts.xml中添加如下內(nèi)容:

<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="requestParser"
 class="com.zeige.ResourceMultiPartRequest" scope="default" optional="true" />
<constant name="struts.multipart.handler" value="requestParser" />

 下面就可以正常使用了,建立兩個(gè)action,一個(gè)用來(lái)接收上傳文件,以及對(duì)接收的文件作相應(yīng)處理,處理完成后,在return SUCCESS之前去除session中currentUploadStatus屬性,一個(gè)用來(lái)為頁(yè)面讀取實(shí)時(shí)上傳進(jìn)度服務(wù),這個(gè)類中只要將session中的currentUploadStatus對(duì)象拿出來(lái)按照相應(yīng)格式返回給客戶端即可。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中的取整與四舍五入方法實(shí)例

    java中的取整與四舍五入方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于java中取整與四舍五入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java Stream的基本概念以及創(chuàng)建方法

    Java Stream的基本概念以及創(chuàng)建方法

    這篇文章主要介紹了Java Stream的基本概念以及創(chuàng)建方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • Java攔截器Interceptor實(shí)現(xiàn)原理及代碼示例

    Java攔截器Interceptor實(shí)現(xiàn)原理及代碼示例

    本文詳細(xì)講解了Java攔截器Interceptor實(shí)現(xiàn)原理及代碼示例,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 解決maven常見(jiàn)錯(cuò)誤:Dependency is duplicated in file(s):

    解決maven常見(jiàn)錯(cuò)誤:Dependency is duplicated in 

    這篇文章主要介紹了解決maven常見(jiàn)錯(cuò)誤:Dependency is duplicated in file(s):問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享

    Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享

    這篇文章主要介紹了Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享,涉及攔截器的簡(jiǎn)單介紹,攔截器和過(guò)濾器的區(qū)以及攔截器實(shí)現(xiàn)代碼等相關(guān)內(nèi)容,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • SpringBoot打War包上傳到阿里云的LINUX服務(wù)器的操作方法

    SpringBoot打War包上傳到阿里云的LINUX服務(wù)器的操作方法

    這篇文章主要介紹了SpringBoot打War包上傳到阿里云的LINUX服務(wù)器,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java虛擬機(jī)之對(duì)象創(chuàng)建過(guò)程與類加載機(jī)制及雙親委派模型

    Java虛擬機(jī)之對(duì)象創(chuàng)建過(guò)程與類加載機(jī)制及雙親委派模型

    這篇文章主要給大家介紹了關(guān)于Java虛擬機(jī)之對(duì)象創(chuàng)建過(guò)程與類加載機(jī)制及雙親委派模型的相關(guān)資料,本文通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-11-11
  • java中char類型轉(zhuǎn)換成int類型的2種方法

    java中char類型轉(zhuǎn)換成int類型的2種方法

    這篇文章主要給大家介紹了關(guān)于java中char類型轉(zhuǎn)換成int類型的2種方法,因?yàn)閖ava是一門強(qiáng)類型語(yǔ)言,所以在數(shù)據(jù)運(yùn)算中會(huì)存在類型轉(zhuǎn)換,需要的朋友可以參考下
    2023-07-07
  • 使用Java接收和處理OpenTelemetry數(shù)據(jù)的完整指南

    使用Java接收和處理OpenTelemetry數(shù)據(jù)的完整指南

    在現(xiàn)代分布式系統(tǒng)中,OpenTelemetry 成為了一種常見(jiàn)的標(biāo)準(zhǔn),用于跟蹤和監(jiān)控應(yīng)用程序的性能和行為,OTLP是 OpenTelemetry 社區(qū)定義的一種數(shù)據(jù)傳輸協(xié)議,文將介紹如何使用 Java 編寫代碼來(lái)接收和處理 OTLP 數(shù)據(jù),需要的朋友可以參考下
    2024-04-04
  • IDEA如何快速構(gòu)建UML類圖

    IDEA如何快速構(gòu)建UML類圖

    UML類圖是一種用于描述軟件系統(tǒng)靜態(tài)結(jié)構(gòu)的可視化建模語(yǔ)言,它通過(guò)類、屬性、方法以及它們之間的關(guān)系來(lái)表示系統(tǒng),類圖主要用于面向?qū)ο笤O(shè)計(jì),幫助理解系統(tǒng)的結(jié)構(gòu)和類之間的關(guān)系,IDEA提供了自動(dòng)生成UML類圖的功能,但其局限性在于只能基于現(xiàn)有代碼生成
    2025-02-02

最新評(píng)論

鄱阳县| 通榆县| 东台市| 黄龙县| 平阴县| 浦北县| 南部县| 平武县| 曲靖市| 赤峰市| 新营市| 崇礼县| 铁力市| 靖宇县| 常熟市| 鹤岗市| 中西区| 建水县| 祁东县| 新郑市| 诸暨市| 和田市| 武功县| 四川省| 福安市| 宣武区| 惠水县| 临澧县| 衡水市| 名山县| 河间市| 始兴县| 霸州市| 博兴县| 沧源| 新蔡县| 鄂托克旗| 商城县| 南木林县| 荔浦县| 景谷|