1. 程式人生 > >BOS物流管理系統_03_區域資料匯入

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

="${pageContext.request.contextPath }/js/jquery.ocupload-1.1.2.js"></script>

第二步:在頁面中提供任意一個元素

第三步:呼叫外掛提供的upload方法,動態修改HTML頁面元素

<script type="text/javascript">

         $(function(){

                   //頁面載入完成後,呼叫外掛的upload方法,動態修改了HTML頁面元素

                   $("#myButton").upload({

                            action:

'xxx.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);
	}