BOS项目05——Action层抽取重复代码(接受page,rows参数,封装到pageUtils对象中;对象转Json),批量添加数据的流程,批量删除流程(主要看前端部分),easyUI选项框(发送ajax请求从region中获取数据),JsonLib转码的原理(get方法),分页查询重复调用问题

1、Action层抽取重复代码(接受page,rows参数,封装到pageUtils对象中;对象转Json)

 1 public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
 2 
 3     // 由于T是泛型对象,所以不能实例化,要我们用构造给它传递对象
 4     protected T model;
 5 
 6     protected Integer page;
 7     protected Integer rows;
 8 
 9     protected PageUtils pageBean = new PageUtils();
10 
11     public void setPage(Integer page) {
12 //        this.page = page;
13         pageBean.setCurrentPage(page);
14     }
15 
16     public void setRows(Integer rows) {
17 //        this.rows = rows;
18         pageBean.setPageSize(rows);
19     }
20 
21     // 初始化方法,子类实例化,会调用父类的初始化方法
22     public BaseAction() {
23 
24         // 获取泛型
25         ParameterizedType pType = (ParameterizedType) this.getClass().getGenericSuperclass();
26         // 获取泛型数组
27         Type[] tList = pType.getActualTypeArguments();
28         // 取出数组中第一个值,转成字节码对象
29         Class<T> clazz = (Class<T>) tList[0];
30         // 由于model要的是一个对象,所以要将字节码对象通过反射转换成对象
31         try {
32             this.model = clazz.newInstance();
33         } catch (InstantiationException e) {
34             e.printStackTrace();
35         } catch (IllegalAccessException e) {
36             e.printStackTrace();
37         }
38 
39         // 1.创建离线对象
40         DetachedCriteria detachedCriteria = DetachedCriteria.forClass(clazz);
41         // 装进pageBean
42         pageBean.setDetachedCriteria(detachedCriteria);
43     }
44 
45     public void writeJson(Object o , String[] strings) {
46         // 4.将pagebean转成json格式,返回
47         JsonConfig jsonConfig = new JsonConfig();
48         jsonConfig.setExcludes(strings);
49         JSONObject jsonObject = JSONObject.fromObject(o, jsonConfig);
50 
51         ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");
52         try {
53             ServletActionContext.getResponse().getWriter().print(jsonObject);
54         } catch (IOException e) {
55             e.printStackTrace();
56         }
57     }
58 
59     @Override
60     public T getModel() {
61         return model;
62     }
63 }
BaseAction
1 public String pageQuery() throws Exception {
2 
3     // 3.调用service层方法执行查询
4     regionService.pageQuery(pageBean);
5 
6     super.writeJson(pageBean,new String[]{"currentPage","detachedCriteria","pageSize"});
7 
8     return "none";
9 }
调用方法

2、批量添加数据的流程

 1 <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.ocupload-1.1.2.js"></script>
 2 <script type="text/javascript">
 3 
 4 
 5     //工具栏
 6     var toolbar = [ {
 7         id : 'button-import',
 8         text : '导入',
 9         iconCls : 'icon-redo'
10     }];
11     // 定义列
12     // ...
13     
14 
15     $(function(){
16         // 先将body隐藏,再显示,不会出现页面刷新效果
17         $("body").css({visibility:"visible"});
18 
19         // 收派标准数据表格
20         $('#grid').datagrid( {
21             iconCls : 'icon-forward',
22             fit : true,
23             border : false,
24             rownumbers : true,
25             striped : true,
26             pageList: [30,50,100],
27             pagination : true,
28             toolbar : toolbar,
29             url : "${pageContext.request.contextPath}/regionAction_pageQuery.action",
30             idField : 'id',
31             columns : columns,
32             onDblClickRow : doDblClickRow
33         });
34 
35         // 添加、修改区域窗口
36         //...
37 
38     });
39 
40     function doDblClickRow(){
41         alert("双击表格数据...");
42     }
43 
44     $(function(){
45         //页面加载完成后,调用插件的upload方法,动态修改了HTML页面元素
46         $("#button-import").upload({
47             action:'regionAction_importXls.action',
48             name:'regionFile'
49         });
50     });
51 </script>
前端
 1 private File regionFile;
 2 
 3 public void setRegionFile(File regionFile) {
 4     this.regionFile = regionFile;
 5 }
 6 
 7 public String importXls() throws Exception {
 8 
 9     List<Region> regions = new ArrayList<>();
10 
11     // 包装一个Excel文件对象
12     HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(regionFile));
13     // 读取文件中第一个Sheet标签页(两种方式)
14     // HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
15     HSSFSheet sheet = hssfWorkbook.getSheet("sheet1");
16 
17     for (Row row : sheet) {
18 
19         // 1.第一行为标题行;如果行号为1,跳出本次循环
20         if (row.getRowNum() == 0){continue;}
21 
22         // 2.获取每行的数据
23         String id = row.getCell(0).getStringCellValue();
24         String province = row.getCell(1).getStringCellValue();
25         String city = row.getCell(2).getStringCellValue();
26         String district = row.getCell(3).getStringCellValue();
27         String postcode = row.getCell(4).getStringCellValue();
28         // 3.封装到region对象中
29         Region region = new Region(id,province,city,district,postcode,null,null,null);
30 
31         // 简码:河北省 石家庄市 新华区 ==> HBSJZXH
32             // 1)将省 市 区 去掉
33         province = province.substring(0, province.length() - 1);
34         city = city.substring(0, city.length() - 1);
35         district = district.substring(0, district.length() - 1);
36             // 2)拼接成一个字符串,转成简码
37         String info = province + city + district;
38         String[] headByString = PinYin4jUtils.getHeadByString(info);
39         String shortcode = StringUtils.join(headByString);
40 
41         // 城市编码:石家庄 ==> shijiazhuang
42         String citycode = PinYin4jUtils.hanziToPinyin(city,"");
43 
44         // 4.封装简码和城市编码
45         region.setShortcode(shortcode);
46         region.setCitycode(citycode);
47 
48         // 5.将region放入集合中;如果包装一个调用一次service方法,就会开很多事务(开事务也要时间的)
49         regions.add(region);
50     }
51 
52     // 6.调用service层的方法,批量保存
53     regionService.saveBatch(regions);
54 
55     return "none";  // easyui上传文件是模拟的ajax
56 }
RegionAction
1 public void saveBatch(List<Region> regions) {
2     for (Region r: regions) {
3         // 由于我们的主键使用的是手动输入类型,所以主键重复时会抛出异常
4         // regionDao.save(r);
5 
6         // 所以我们要在BaseDao中扩展一个saveOrUpdate方法
7         regionDao.saveOrUpdate(r);
8     }
9 }
RegionService
1 public void saveOrUpdate(T entity) {
2 
3     super.getHibernateTemplate().saveOrUpdate(entity);
4 
5 }
BaseDao

3、批量删除流程

4、easyUI选项框(发送ajax请求从region中获取数据),JsonLib转码的原理(get方法)

5、分页查询问题

Java对象转为json过程中,因为对象之间有相互引用关系,会发生死循环问题,解决方式,排除其中属性

原文地址:https://www.cnblogs.com/x54256/p/8576311.html