BOS物流管理系統_03_區域資料匯入
- 內容摘要:本篇文章包括 使用OCUpload外掛上傳檔案、使用POI讀上傳的Excel檔案、使用EasyUI中combobox完成下拉列表框選擇資料、在基礎類中增加一個通用的分頁查詢方法。
- OCUpload外掛上傳檔案
1. 使用OCUpload其實這個沒什麼難的,步驟如下
第一步:將js檔案引入頁面
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src
第二步:在頁面中提供任意一個元素
第三步:呼叫外掛提供的upload方法,動態修改HTML頁面元素
<script type="text/javascript">
$(function(){
//頁面載入完成後,呼叫外掛的upload方法,動態修改了HTML頁面元素
$("#myButton").upload({
action:
name:'myFile'
});
});
</script>
- 使用POI讀上傳的Excel檔案
1. 在pom.xml 中 引入POI和pinyin4j的jar包
2. regionAction 中uploadFile方法 讀取Excel檔案,解析資料,封裝到物件
/** * 上傳並解析讀取Excel檔案 * @return * @throws Exception */ public String uploadFile() throws Exception { // 包裝一個Excel檔案物件 HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(myFile)); // 根據名稱獲得一個sheet物件 HSSFSheet sheet = workbook.getSheet("Sheet1"); // 這裡使用一個集合裝Region物件的好處是,提高效率,當所有region物件裝載完之後,再集中操作資料庫 List<Region> list = new ArrayList<Region>(); // 遍歷這一頁中所有的行 for (Row row : sheet) { int rowNum = row.getRowNum(); if(rowNum == 0){ continue; } // 獲取一行的每一列 String id = row.getCell(0).getStringCellValue(); String province = row.getCell(1).getStringCellValue(); String city = row.getCell(2).getStringCellValue(); String district = row.getCell(3).getStringCellValue(); String postcode = row.getCell(4).getStringCellValue(); // 包裝一個區域物件 Region region = new Region(id, province, city, district, postcode, null, null, null); // 去掉 省,市,區 province = province.substring(0, province.length()-1); city = city.substring(0, city.length()-1); district = district.substring(0, district.length()-1); // 拼接字串 String info = province + city + district; // 使用pinyin4j工具類獲得shortcode,citycode 這兩個是資料庫中的欄位 String[] strs = PinYin4jUtils.getHeadByString(info); String shortcode = StringUtils.join(strs); String citycode = PinYin4jUtils.hanziToPinyin(city, ""); // 封裝到region物件 region.setShortcode(shortcode); region.setCitycode(citycode); list.add(region); } regionService.saveOrUpdate(list); return NONE; }
- EasyUI中combobox過濾資料
EasyUI中combobox附帶雖然也有資料過濾功能,但是不夠強大因為它只是前臺的一個簡單搜尋,故我們打算讓它每次從後臺查詢,類似購物網站的站內搜尋功能
第一步:新增一個屬性 , 表示從後臺載入資料(遠端載入)
第二步 在後臺獲取引數q,判斷是否為空後,根據兩種情況查詢
/**
* 獲取區域列表
* @return
* @throws Exception
*/
private String q;
public String subareaList() throws Exception {
List<Region> regionList = null;
if(StringUtils.isNotBlank(q)){
regionList = regionService.findRegionListByQ(q);
}else{
regionList = regionService.findAll();
}
// 將查的集合轉成json. 在BaseAction中抽取了兩個轉json的過載方法
super.JavatoJson(regionList, new String[]{"bcSubareas","postcode","shortcode","citycode"});
return NONE;
}
我這裡用的是jsonlib
// 集合轉json
public void JavatoJson(List o,String[] excludes){
JsonConfig jsonconfig = new JsonConfig();
jsonconfig.setExcludes(excludes);
// 把pagebean物件轉換成json格式的字串,並寫回去
String json = JSONArray.fromObject(o,jsonconfig).toString();
ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");
try {
ServletActionContext.getResponse().getWriter().write(json);
} catch (IOException e) {
e.printStackTrace();
}
}
// 物件轉json
public void JavatoJson(Object o,String[] excludes){
JsonConfig jsonconfig = new JsonConfig();
jsonconfig.setExcludes(excludes);
// 把pagebean物件轉換成json格式的字串,並寫回去
String json = JSONObject.fromObject(o,jsonconfig).toString();
ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");
try {
ServletActionContext.getResponse().getWriter().write(json);
} catch (IOException e) {
e.printStackTrace();
}
}
第三步:Service層這裡不在貼程式碼了吧,就用dao呼叫個方法,傳個引數
第四步:Dao層根據引數q進行模糊查詢
/**
* 根據引數q 進行模糊查詢
*/
public List<Region> findRegionListByQ(String q) {
String hql = "from Region r where r.province like ? or r.city like ? or r.district like ? or r.shortcode like ? or r.citycode like ?";
List<Region> regionlist = (List<Region>) this.getHibernateTemplate().find(hql, "%"+q+"%","%"+q+"%","%"+q+"%","%"+q+"%","%"+q+"%");
return regionlist;
}
第五步:需要注意的是,在region.jsp頁面中有一個textField屬性和valueField屬性他們一個表示下拉列表框中顯示的內容一個表示每一項的值(聯想select中option標籤中的id)。但是,region實體中並沒有name 這個屬性,那它怎麼從json中獲得呢?解決方法是:新增一個getName方法。原理是:將實體轉json,直接找的是get方法,不會管實體中有沒有這個屬性。那我們也不需要增加一個name屬性了,直接新增一個方法就OK
// 將省市區屬性拼接
public String getName(){
return province +" "+ city +" "+ district;
}
效果
- 基礎類中增加一個通用的分頁查詢方法
思路:我們可以抽取一個工具類PageBean,這樣我們就可以在web層封裝一個pagebean物件(事實上只能封裝是三個屬性currentPage,pageSize,deCriteria.因為其他兩個需要計算或查詢資料庫才能夠獲知),然後把pagebean物件逐層傳遞到Dao層,Dao層繼續封裝total屬性和rows屬性。這樣的好處是 我們也不需要返回任何東西,一個pagebean物件封裝完畢,分頁查詢也就完成了。需要用分頁的時候直接逐層呼叫就可以了。
1. 分頁查詢一般包含以下五個屬性條件,那麼我們把它抽取到一個工具類PageBean中並生成getset方法
private int total; // 總條數
private int pageSize; // 每頁顯示多少條
private int currentPage; // 當前頁碼
private List rows; // 每頁要顯示的資料
private DetachedCriteria deCriteria; // 查詢條件
2. web層 BaseAction中 獲取頁面傳過來的rows和page兩個引數,給離線查詢物件一個當前實體
public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
protected PageBean pagebean = new PageBean();
DetachedCriteria criteria = null;
// rows 表示每頁顯示多少條
public void setRows(int rows) {
pagebean.setPageSize(rows);
}
// page表示當前頁碼
public void setPage(int page) {
pagebean.setCurrentPage(page);
}
public BaseAction() {
ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
Class<T> entityClass = (Class<T>) actualTypeArguments[0];
criteria = DetachedCriteria.forClass(entityClass);
pagebean.setDeCriteria(criteria);
}
}
3. Dao層繼續封裝pagebean
// 通用的分頁方法
public void pageQuery(PageBean pagebean) {
int currentPage = pagebean.getCurrentPage();
int pageSize = pagebean.getPageSize();
DetachedCriteria deCriteria = pagebean.getDeCriteria();
// 查詢總條數
deCriteria.setProjection(Projections.rowCount());
List list = this.getHibernateTemplate().findByCriteria(deCriteria);
Long totalcount = (Long) list.get(0);
pagebean.setTotal(totalcount.intValue());
// 查詢每頁要顯示的資料
deCriteria.setProjection(null);
int firstResult = (currentPage - 1) * pageSize;
int maxResults = pageSize;
List criteria = this.getHibernateTemplate().findByCriteria(deCriteria, firstResult, maxResults);
pagebean.setRows(criteria);
}