納稅服務系統二POI、用戶唯一性校驗
前言
用戶模塊:本文主要的知識點有以下:
使用POI來操作Excel,對數據進行導入和導出
對用戶進行唯一性校驗,不能同時出現相同的用戶
POI基礎
再次回到我們的用戶模塊上,我們發現還有兩個功能沒有完成:
這裡寫圖片描述
對於將網頁中的數據導入或導出到excel文件中,我們是完全沒有學習過的。但是呢,在Java中操作excel是相對常用的,因此也有組件供我們使用
JAVA中操作Excel的有兩種比較主流的工具包
JXL
POI
這次我們主要學習的是POI操作excel。
JXL有一個缺陷,只能操作03或以前版本的excel,而POI可以操作97-07版本的。
面向對象看excel
首先,要用Java來操作excel的話,肯定用對象來指定excel相關的內容的。我們來看看excel由什麼組成:
這裡寫圖片描述
POI是這樣看的:
整個excel稱作為工作薄
工作薄下可以創建很多張表,稱作為工作表
工作表有非常多的行
行又可細分單元格【指定行的列就可以定位到工作表任意的位置了】
給我們一頓分析以後,我們發現它們之間是有從屬關係的:
工作表從屬於工作薄
行從屬於工作表
單元格從屬於行
操作Excel步驟
導入POI開發包:
poi-ooxml-3.10.1-20140818.jar,
poi-ooxml-schemas-3.10.1-20140818.jar,
以及複製在ooxml-lib目錄下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar【dom4j一般在項目導入的時候已經存在了】。
poi-ooxml-3.11-20141221.jar
創建Excel並寫入數據
這裡寫圖片描述
這裡寫圖片描述
讀取Excel的數據
這裡寫圖片描述
這裡寫圖片描述
03與07版本
03版本使用的是HSSFWorkbook這麼一個類來操作03的Excel數據
07版本使用的是XSSFWorkbook這麼一個類來操作07的Excel數據
其實他們的方法都是一樣的,僅僅是類的不同。而使用哪個對象,我們可以根據後綴名來判斷創建哪個對象【是03還是07】
Excel樣式
回到我們的需求中,當我們使用POI導出數據的時候,Excel應該要有樣式才好看的。類似下面的模板:
這裡寫圖片描述
在POI中可以利用格式化對象來格式化excel文檔;也即設置excel內容的樣式。
POI中主要的格式化對象常用的有:
合併單元格
設置單元格樣式
設置單元格字體
居中
背景顏色等
POI的樣式對象明顯是屬性工作薄的。應用於工作表
這裡寫圖片描述
合併單元格
屬於工作薄,應用於工作表
創建合併單元格對象的時候要給出4個參數,它們分別表示:
行的起始位置
行的結束位置
列的起始位置
列的結束位置
這裡寫圖片描述
設置單元格樣式
上面的圖我們可以發現,我們已經實現了合併單元格,但是一般我們都是將字體設置成居中、字體大小等等。POI也提供了相對應的對象給我們實現:
設置居中
樣式屬於工作薄,應用於單元格:
這裡寫圖片描述
設置字體
字體屬於工作薄,應用於樣式【和css是類似的】
這裡寫圖片描述
實現導出功能
綁定按鈕事件,請求Action處理導出,打開一個輸入框給用戶下載
Action處理
Service實現
效果
這裡寫圖片描述
優化一
我們來看下面這段代碼,他們都要設置居中,字體就除了大小不同。其他都相同。卻佔用了這麼多代碼!!!
於是我就抽取成一個方法來得到樣式
需要工作薄來創建樣式
只有字體的大小是變化的
當使用的時候,代碼就變成了這樣調用:
優化二
我們的Service業務層的代碼看起來太多了。這樣我們維護起來就不方便了。
我的做法是:把代碼抽取成Utils的方法,Service層調用就好了。
實現導入功能
現在我有這麼一個Excel文件,要把信息存儲到資料庫中,並且在瀏覽器顯示出來
這裡寫圖片描述
其實導入Excel就是文件上傳,只不過不用把文件保存在伺服器的硬碟數據中而是保存在資料庫中,輸出到瀏覽器就行了。
Action封裝文件上傳
Action處理
主要判斷有沒有上傳文件。給Service層處理
Utils封裝成集合返回
Service調用
用戶唯一性校驗
接下來是對其進行補充…主要完成用戶唯一性校驗的問題。
我們發現:在新增或編輯頁面的時候用戶的賬號是可以重複的,這是不符合我們的邏輯的。
這裡寫圖片描述
當用戶新增賬號的時候,如果該賬號已經存在了,就應該告訴用戶該賬號重複,不能使用該賬號。
分析
用戶在填寫完賬戶的時候,就應該去做校驗了。【使用AJAX】
校驗的工作是什麼呢????其實就是去查找資料庫有沒有對應的賬戶記錄,如果有,那麼就告訴用戶存在了。如果沒有,就沒問題了。
上面已經說了有兩處需要校驗用戶唯一性的問題:
新增頁面
修改頁面
新增頁面和修改頁面是有不同的處理方案的,因為在修改頁面時,如果用戶不修改賬戶,該用戶的賬戶本來就存在了。因此我們要排除該用戶的當前賬戶相同的問題,其實也很簡單。
在修改頁面時是需要id傳遞過去的,而新增用戶是不需要的。在查詢資料庫的時候,看看有沒有id,如果有id就多一個條件即可!
條件就是不把本賬戶的算進去
前台使用AJAX處理
為賬戶的輸入框添加事件
當賬戶的輸入框修改時,就去資料庫查詢有沒有相同的賬戶名字。
值得注意的是:本來我是在控制項上添加一個id,使用Jquery得到id所在的控制項,然後綁定事件,但是用不了。
2017年9月24日19:30:50更新。我覺得當時很可能就是沒有在$(function(){});內進行判定。
所以,我只能在控制項上綁定一個靜態方法了。
把賬號的值傳遞給伺服器,接受伺服器返回的值
編寫Dao方法
我們使用的是Hibernate,編寫的HQL語句是FROM 實體,並不是"SELECT * FROM….. "
Service調用Dao
Action處理
由於經常要判斷傳遞過來的數據時候為null,是否為"",我們使用StringUtils來進行判斷:
前台提示
GIF
這裡寫圖片描述
完善
上面只是完成了校驗用戶名是否唯一的功能,但是如果用戶不聽我的勸告,照樣去提交表單,還是可以完成的。
於是在提交表單的時候要判斷是否合法才能讓用戶提交:
把submit按鈕改成是button,提供單擊事件
改成是同步的主要原因是:我們的數據值要依賴與Ajax的返回值。由於Ajax是無刷新的訪問,因此我們需要改成是同步的。
editUI
在editUI上唯一區別就是需要把id傳遞過去給伺服器端。
GIF
這裡寫圖片描述
總結
導入就是用戶上傳一個Excel文件,我們讀取Excel文件的數據,封裝成對象,存進資料庫中
導出就是將我們資料庫的數據寫到Excel文件中,讓用戶能夠進行下載
指定我們的返回類型是excel
工作表從屬於工作薄,行從屬於工作表,單元格從屬於行
在POI組件中,Excel文件我們又分為了兩類,03版和07版的,他倆對應了不同的對象,但這兩個對象的API都是一樣的。因此我們可以通過文件的後綴來判斷使用哪個對象
我們的Excel還是應該有樣式才好看的。POI也提供了對應的API給我們修改樣式
合併單元格,從屬於工作薄,應用與工作表
設置居中、字體的大小都是屬於樣式的。從屬於工作薄,應用與單元格。
TAG:Java3y |