一、分區組合條件分頁查詢
n 分區分頁查詢(沒有過濾條件)
頁面:WEB-INF/pages/base/subarea.jsp
第一步:修改jsp頁面中datagrid的URL地址
第二步:在SuareaAction中提供分頁查詢方法pageQuery
public String pageQuery(){
subareaService.pageQuery(pageBean);
this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","decidedzone","subareas"});
return NONE;
}
第三步:修改subarea.hbm.xml
n 分區分頁查詢(帶有過濾條件)
第一步:提供一個工具方法,可以將指定的form表單中所有的輸入項轉爲json數據,用於參數提交
// 定義一個工具方法,用於將指定的form表單中所有的輸入項轉爲json數據
$.fn.serializeJson=function(){
var serializeObj={};
var array=this.serializeArray();
$(array).each(function(){
if(serializeObj[this.name]){
if($.isArray(serializeObj[this.name])){
serializeObj[this.name].push(this.value);
}else{
serializeObj[this.name]=[serializeObj[this.name],this.value];
}
}else{
serializeObj[this.name]=this.value;
}
});
return serializeObj;
};
第二步:爲查詢窗口中查詢按鈕綁定事件
$("#btn").click(function(){
// 將指定的form表單中所有的輸入項轉爲json數據
var p = $("#searchForm").serializeJson();
// 調用數據表格的load方法,重新發一次ajax請求,並且提交參數
$("#grid").datagrid("load",p);
// 關閉查詢窗口
$("#searchWindow").window("close");
});
第三步:修改Action中分頁查詢方法
/**
* 分頁查詢
* @return
*/
public String pageQuery(){
DetachedCriteria dc = pageBean.getDetachedCriteria();
// 動態添加過濾條件
String addresskey = model.getAddresskey();
if(StringUtils.isNotBlank(addresskey)){
// 添加過濾條件,根據地址關鍵字模糊查詢
dc.add(Restrictions.like("addresskey","%"+addresskey+"%"));
}
Region region = model.getRegion();
if(region != null){
String province = region.getProvince();
String city = region.getCity();
String district = region.getDistrict();
// 參數一:分區對象中管關聯的區域對象屬性名稱
// 參數二:別名,可以任意
dc.createAlias("region","r");
if(StringUtils.isNotBlank(province)){
// 添加過濾條件,根據省份模糊查詢--多表關聯查詢,使用別名方式實現
dc.add(Restrictions.like("r.province","%"+province+"%"));
}
if(StringUtils.isNotBlank(city)){
// 添加過濾條件,根據市模糊查詢--多表關聯查詢,使用別名方式實現
dc.add(Restrictions.like("r.city","%"+city+"%"));
}
if(StringUtils.isNotBlank(district)){
// 添加過濾條件,根據區模糊查詢--多表關聯查詢,使用別名方式實現
dc.add(Restrictions.like("r.district","%"+district+"%"));
}
}
subareaService.pageQuery(pageBean);
this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","decidedzone","subareas"});
return NONE;
}
第四步:修改BaseDao中的分頁查詢方法
二、分區數據導出
n 頁面調整
// 導出按鈕對應的處理函數
function doExport(){
// 發送請求,請求Action,進行文件下載
window.location.href = "subareaAction_exportXLs.action";
}
n 使用POI將數據寫到Excel文件
n 通過輸出流進行文件下載
/**
* 分區數據導出功能
* @return
*/
public String exportXLs() throws IOException {
// 第一步:查詢所有的分區數據
List<Subarea> list = subareaService.findAll();
// 第二步:使用POI將數據寫到Excel文件中
// 在內存中創建一個Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
// 創建一個標籤頁
HSSFSheet sheet = workbook.createSheet("分區數據");
// 創建標題行
HSSFRow headRow = sheet.createRow(0);
headRow.createCell(0).setCellValue("分區編號");
headRow.createCell(1).setCellValue("開始編號");
headRow.createCell(2).setCellValue("結束編號");
headRow.createCell(3).setCellValue("位置信息");
headRow.createCell(4).setCellValue("省市區");
for(Subarea subarea:list){
HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
dataRow.createCell(0).setCellValue(subarea.getId());
dataRow.createCell(1).setCellValue(subarea.getStartnum());
dataRow.createCell(2).setCellValue(subarea.getEndnum());
dataRow.createCell(3).setCellValue(subarea.getPosition());
dataRow.createCell(4).setCellValue(subarea.getRegion().getName());
}
// 第三步:使用輸出流進行文件下載(一個流、兩個頭)
String filename = "分區數據.xls";
String contentType = ServletActionContext.getServletContext().getMimeType(filename);
ServletOutputStream out = ServletActionContext.getResponse().getOutputStream();
ServletActionContext.getResponse().setContentType(contentType);
// 獲取客戶端瀏覽器類型
String agent = ServletActionContext.getRequest().getHeader("User-Agent");
filename = FileUtils.encodeDownloadFilename(filename, agent);
ServletActionContext.getResponse().setHeader("content-disposition","attachment;filename="+filename);
workbook.write(out);
return NONE;
}
三、定區添加
n 定區概念
n 定區添加頁面調整
第一步:修改定區頁面中combobox下拉框URL地址
n 服務端實現
第二步:在StaffAction中提供listajax方法,查詢所有未刪除的取派員,返回json
/**
* 查詢所有未刪除的取派員,返回json
* @return
*/
public String listAjax(){
List<Staff> list = staffService.findListNotDelete();
this.java2Json(list,new String[]{"decidedzones"});
return NONE;
}
第三步:在BaseDao中擴展一個通用查詢方法
@Override
public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
}
第四步:在StaffService中擴展方法,查詢未刪除的取派員
public List<Staff> findListNotDelete() {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);
// 添加過濾條件
detachedCriteria.add(Restrictions.eq("deltag","0"));
//detachedCriteria.add(Restrictions.ne("dettag","1")); // 同上面等價
return staffDao.findByCriteria(detachedCriteria);
}
四、使用combobox展示取派員數據
n 頁面調整
第一步:修改頁面中datagrid的URL地址
n 服務端實現
第二步:在SubareaAction中提供listajax方法,查詢所有未關聯到定區的分區,返回json
/**
* 查詢所有未關聯到定區的分區,返回json
* @return
*/
public String listAjax(){
List<Subarea> list = subareaService.findListNotAssociation();
this.java2Json(list,new String[]{"decidedzone","region"});
return NONE;
}
第三步:在SubareaService中擴展方法,查詢未關聯到定區的分區
/**
* 查詢所有未關聯到定區的分區
* @return
*/
public List<Subarea> findListNotAssociation() {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);
// 添加過濾條件,分區對象中decidedzone屬性爲null
detachedCriteria.add(Restrictions.isNull("decidedzone"));
return subareaDao.findByCriteria(detachedCriteria);
}
五、保存定區
第一步:爲保存按鈕綁定事件提交表單
問題一:提交的表單存在多個id
解決方案:將datagrid的filed由id改爲subareaid
問題二:
提交的表單中subareaid參數的值爲null
解決方案:在分區類中提供getSubareaid方法
第二步:服務端實現
創建定區的Action、Service、Dao
/**
* 定區管理
* @author lee [email protected]
* @create 2018-04-21 15:12
**/
@Controller
@Scope
public class DecidedzoneAction extends BaseAction<Decidedzone>{
@Autowired
private DecidedzoneService decidedzoneService;
// 屬性驅動,接收多個分區id
private String[] subareaid;
public String[] getSubareaid() {
return subareaid;
}
public void setSubareaid(String[] subareaid) {
this.subareaid = subareaid;
}
/**
* 添加定區
* @return
*/
public String add(){
decidedzoneService.save(model,subareaid);
return LIST;
}
Service代碼
@Service
@Transactional
public class DecidedzoneServiceImpl implements DecidedzoneService{
@Autowired
private DecidedzoneDao decidedzoneDao;
@Autowired
private SubareaDao subareaDao;
/**
* 添加一個定區,同時關聯分區
* @param model
* @param subareaid
*/
public void save(Decidedzone model, String[] subareaid) {
decidedzoneDao.save(model);
for(String id : subareaid){
Subarea subarea = subareaDao.findById(id);
subarea.setDecidedzone(model);
}
}
配置struts.xml
<!--定區管理-->
<action name="decidedzoneAction_*" class="decidedzoneAction" method="{1}">
<result name="list">/WEB-INF/pages/base/decidedzone.jsp</result>
</action>
六、定區分頁查詢
第一步:修改定區jsp頁面中datagrid的URL地址
第二步:在定區Action中提供pageQuery方法
/**
* 分頁查詢定區
* @return
* @throws IOException
*/
public String pageQuery() throws IOException {
// 調用service分頁查詢
decidedzoneService.pageQuery(pageBean);
// 轉json並響應到頁面
this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","subareas","decidedzones"});
return NONE;
}
第三步:在Decidedzone.hbm.xml中修改,查詢定區對象時需要立即加載關聯的取派員對象
七、分頁問題總結
1、頁面不需要展示關聯數據時解決:將關聯對象屬性排除掉
解決:將關聯對象改爲立即加載,並且將關聯對象中的屬性排除