• 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过程中,因为对象之间有相互引用关系,会发生死循环问题,解决方式,排除其中属性

  • 相关阅读:
    Sublime Text 3 安装及常用插件配置
    利用事件对象实现线程同步
    基于UDP(面向无连接)的socket编程
    基于TCP(面向连接)的socket编程
    基于TCP(面向连接)的socket编程
    响应式布局之媒体查询 @media
    (function($){})(jQuery)---Javascript的神级特性:闭包
    noConflict()
    $.extend()与$.fn.extend()
    Web中的宽和高
  • 原文地址:https://www.cnblogs.com/x54256/p/8576311.html
Copyright © 2020-2023  润新知