1. 程式人生 > >別個代碼閱讀學習(一)

別個代碼閱讀學習(一)

lan 實例 div size stp wait 中一 servle await

關於CommonsMultipartFile一點點

就是個關於文件操作的類,見識於對Excel文件導入時;

使用起來很方便,需要註意的是前後端的對接:

2.html寫法註意兩點
a.input類型為

file:<input type="file" name="sealPfxFile"  id="sealPfxFile" size="24" />

b.form中增加參數enctype="multipart/form-data":

<form id="addSeal" name="addSeal" action="${root}/seal/o_add.do" enctype="multipart/form-data" method="post">

3.Service的寫法(註意與html中定義的名稱相同即可通過get方法取得需要的內容)

public String doAction(@RequestParam("sealPfxFile") CommonsMultipartFile sealPfxFile, Seal seal, ModelMap modelMap, HttpServletRequest request) throws Exception {
      //上傳文件名
      String fileName = sealPfxFile.getFileItem().getName();
  //上傳文件流
      InputStream is = sealPfxFile.getInputStream();
}

之後是數據的應用,這裏用的是HSSFWorkbook類進行的加載,比較關鍵的代碼如下:

{
            Workbook wb = loadWorkbook(inputStream);
            Sheet current = wb.getSheetAt(0);
            int lastRowNum = current.getLastRowNum();
            for (int i = 0; i <= lastRowNum; i++) {
                if(i == 0) continue;//title
                Row row = this.getRow(current, i);
                if(row == null){
                    return result;
                }
                int numOfCells = row.getPhysicalNumberOfCells();
                if (numOfCells < minCount) {
                    LOG.error("數據錯誤,行數:{}, 數據:{}", i, StringUtil.join(row.cellIterator(), ","));
                    continue;
                }
                
            String answer = getCellValue(row, categoryCount);
}
            
            ········
            
            
    protected Workbook loadWorkbook(InputStream inputStream) throws IOException {
        return new HSSFWorkbook(inputStream);
    }
    
    public String getCellValue(Row row, int column) {
        String val = null;
        try {
            Cell cell = row.getCell(column);
            val = getString(getCellValue(cell));
        } catch (Exception e) {
            //ignore
        }
        return val;
    }

總結一下:load(InputStream)——》sheet——》row——》cell;

其中又有一些細節,比如load的時候單獨拆出來的方法(每個方法關註的重點不同,去耦合,同時也有Exception的考慮!),比如重復性代碼的拆分(getCellValue)

最後再給出引用的一篇博文:CommonsMultipartFile---用Spring實現文件上傳


由StringUtils.isNumeric引發的一些思考

首先,這個方法是檢驗某個字符串是不是數字類型,這樣子後面轉int等類型比較可靠;

然後,會想到去看下StringUtils這個類,平時也是常用其中幾個方法的,但幾乎是十中一二罷了;

然後,就會想到如何學習這種類呢?死記硬背麽?肯定不行啊。

最後呢,根據兩種思路進行了求證

  • 由下到上:見證某個方法的奇妙用法,看源碼和用法,記錄積累;
  • 由上到下:對某種數據類型有某種操作需求,思考相關要求,找相關類(工具類等),找其中的方法;

這樣想了下,發現最終都是需要一個事情:多tm做事情,多tm看代碼!

具體操作,綜合兩種思路:平時有操作需求,多思考下,然後如果成行,或者有不錯的事例,記錄下來;

最後,引用兩個知乎答案:如何高效學習Java API提供的的類和方法?,Java開發人員必知必會的20種常用類庫和API


this和代碼書寫的藝術

this,這個常見,缺不是常懂。。經常就是照著已有代碼比葫蘆畫瓢;

其實很簡單,說白了就是當前對象

this的本質就是“創建好的對象的地址”! 由於在構造方法調用前,對象已經創建。因此,在構造方法中也可以使用this代表“當前對象” 。this最常的用法: 1.在程序中產生二義性之處,應使用this來指明當前對象;普通方法中,this總是指向調用該方法的對象。構造方法中,this總是指向正要初始化的對象。2.使用this關鍵字調用重載的構造方法,避免相同的初始化代碼。但只能在構造方法中用,並且必須位於構造方法的第一句。3.this不能用於static方法中。

那麽看下我這邊說的代碼書寫藝術的體現吧

new MultiBatchJob<E>(this, MAX_BATCH_SIZE, list).batchStore().awaitFinish();

前面一部分都是實例化類,然後執行awaitFinish();

所以,藝術的部分在於構造函數的利用!

public MultiBatchJob(StorageImporter storageImporter, int batchCount, List<E> list) {

    }

    public MultiBatchJob batchStore() {
        return this;
    }

只看框架就知道,構造函數,然後執行操作,再需要執行操作呢?return this!!!我了個擦。。。

一般只在構造函數以及setter中用this的簡直對此著迷!!!

無f可說,後面自己騷操作一下好麽

別個代碼閱讀學習(一)