Javadream

          A long way and a dream.

          關(guān)于文件上傳的問題:
          Java Servlet沒有從根本上支持網(wǎng)絡(luò)文件上傳,這是一個(gè)極不好的也極不爽的事情.
          從而就延生了commonsUpload和cos這些東東類庫,呵.....還算好,也好用,不過沒仔細(xì)去研究他們的實(shí)現(xiàn)代碼,用起來總是心大心小的.

          也正因?yàn)檫@樣多的第三方類庫,大家的接口都不同,從而也就出現(xiàn)了讓Service層無所適從的感覺.因?yàn)椴徽撌菑腟truts還是從WebWork或者從最簡單的cos這些類庫得到的接口都是一種具體實(shí)現(xiàn),沒有統(tǒng)一的接口,如果Service層與某一種具體實(shí)現(xiàn)相關(guān)聯(lián),則必然與這種具體實(shí)現(xiàn)的框架或者類庫硬編碼綁定,以后就不好用其它類庫了,這是不好的設(shè)計(jì),真的,一點(diǎn)靈活度都沒有.

          能不能這樣呢?在Service定義一個(gè)UploadFile接口,所有Service層接受的只是UploadFile的實(shí)現(xiàn)類的實(shí)例,從而統(tǒng)一了所有Service的調(diào)用,而且也使Service可以在各種MVC或者第三方類庫中遷移.

          這里用到了一個(gè)設(shè)計(jì)模式:適配器模式.

          代碼如下:

          package org.springstudy.ch03;

          import
          java.io.InputStream;
          import
          java.io.File;

          public interface
          UploadFile?{
          ????
          public byte
          []?getBytes();
          ????
          public
          String?getContentType();
          ????
          public
          InputStream?getInputStream();
          ????
          public
          String?getName();
          ????
          public
          String?getOriginalFilename();
          ????
          public?long
          getSize();
          ????
          public?boolean
          isEmpty();
          ????
          public?void
          transferTo(File?dest);
          }



          比如這里有一個(gè)具體實(shí)現(xiàn):

          package ?org.springstudy.ch03.uploadimpl;

          import
          ?java.io.InputStream;
          import
          ?java.io.File;

          import
          ?org.springframework.web.multipart.MultipartFile;
          import
          ?org.springstudy.ch03.UploadFile;

          public?classUploadFileSpringImpl?implements
          ?UploadFile?{
          ????
          private
          MultipartFile?multipartFile;
          ????
          ????
          public
          UploadFileSpringImpl(MultipartFile?multipartFile)?{
          ????????
          this .multipartFile =
          ?multipartFile;
          ????}
          ????
          ????
          public?byte
          []?getBytes()?{
          ????????
          return?this
          .multipartFile.getBytes();
          ????}
          ????
          ????
          public
          String?getContentType()?{
          ????????
          return?this
          .multipartFile.getContentType();
          ????}
          ????
          ????
          public
          InputStream?getInputStream()?{
          ????????
          return?this
          .multipartFile.getInputStream();
          ????}
          ????
          ????
          public
          String?getName()?{
          ????????
          return?this
          .multipartFile.getName();
          ????}
          ????
          ????
          public
          String?getOriginalFilename()?{
          ????????
          return?this
          .multipartFile.getOriginalFilename();
          ????}
          ????
          ????
          public?long
          getSize()?{
          ????????
          return?this
          .multipartFile.getSize();
          ????}
          ????
          ????
          public?boolean
          isEmpty()?{
          ????????
          return?this
          .multipartFile.isEmpty();
          ????}
          ????
          ????
          public?void
          transferTo(File?dest)?{
          ????????
          this
          .multipartFile.transferTo(dest);
          ????}
          }



          你也可以寫commonsupload或者cos的實(shí)現(xiàn),Service接受的參數(shù)是UploadFile接口的,所以你必須實(shí)現(xiàn)UploadFile接口才能使用Service層的功能.

          (后話:看來學(xué)習(xí)設(shè)計(jì)模式還是很有用處的)

          主站蜘蛛池模板: 郑州市| 永善县| 肥西县| 无棣县| 安徽省| 那坡县| 丰原市| 三门峡市| 临城县| 安乡县| 临颍县| 格尔木市| 麻阳| 元阳县| 自贡市| 札达县| 花垣县| 古田县| 嵊泗县| 印江| 淮滨县| 汶上县| 清河县| 南投县| 常德市| 安图县| 金沙县| 兰西县| 南江县| 朔州市| 连江县| 布尔津县| 浦城县| 博湖县| 望都县| 奉化市| 雅江县| 宁南县| 鄯善县| 海淀区| 青河县|