如何用JsonLib 来实现EXT中的分页?

    技术2022-05-20  29

    先来看下最后我们要实现的结果是什么样?

     

     

    先说说我们传统上的做法!!!

    我们一般会在后台中拼接json格式的字符串,然后返回到前台进行解析,那样虽然能达到目的,但效率上肯定会大打折扣

    而今天我们介绍的是专门用来解析json格式的JsonLib,它所需要的jar文件如下 :

     

     

    如果有需要的,在我的资源文件中可以进行下载……

    行,废话不多说了,上代码,首先来看前台页面:

     

    Ext.onReady(function(){         var store = new Ext.data.JsonStore({                     //定义JsonStore = HttpProxy + JsonReader + Store                   url:"<%=basePath%>pageServlet",                   //定义HttpProxy所需要参数                   totalProperty:"totalProperty",                           //定义总条数和数据                   root:"root",                   fields:["id","name","sex","birthday","address","mark"]   //定义JsonReader所需要参数         });           store.load({params:{start:0,limit:6}});          //第一次加载的时候传递起始条数和每页的大小           var cm = new Ext.grid.ColumnModel([                      //定义列模型                {header:"编号",width:40,dataIndex:"id"},                {header:"姓名",width:80,dataIndex:"name"},                {header:"性别",width:80,dataIndex:"sex"},                {header:"出生日期",width:80,dataIndex:"birthday"},                {header:"家庭住址",width:80,dataIndex:"address"},                {header:"备注",width:80,dataIndex:"mark"}        ]);          var bbar = new Ext.PagingToolbar({               //定义GridPanel中的工具栏               store:store,               pageSize:6,               displayInfo:true,               displayMsg:"本页显示第{0}条到第{1}条的记录,一共{2}条记录",               emptyMsg:"没有记录"       });         var grid = new Ext.grid.GridPanel({             //创建GridPanel               title:"中国公民",              width:650,              autoHeight:true,              cm:cm,              store:store,              bbar:bbar,              renderTo:Ext.getBody()        });  });

     

     在前台页面中其它还是以前的知识,并没有和以前有多大的不同,重点在后台代码中,下面看后台代码:

     

               response.setContentType("text/html;charset=UTF-8");           PrintWriter out = response.getWriter();           int start = Integer.parseInt(request.getParameter("start"));  //得到起始条数和每页和条数           int limit = Integer.parseInt(request.getParameter("limit"));           int end = start + limit;           int totalProperty = 86;        //总数据条数            if(end>totalProperty){         //如果是数据库,这行不需要                 end = totalProperty;           }            List<Human> humanList = new ArrayList<Human>();          for(int i=start; i<end; i++){                 humanList.add(new Human("000"+ i,"杰克"+ i,"男",new Date(),"石家庄","没什么兴趣"));   ----重点1          }            PageBean pageBean = new PageBean(totalProperty,humanList);   //把数据整合到pojo类中  ----重点2          

              利用    JsonLib来解析json          JSONObject jObject = JSONObject.fromObject(pageBean,JsonUtil.configJson("yyyy-MM-dd"));    --重点3

              out.print(jObject.toString());          out.flush();          out.close();

     

    既然是用Json来解析字符串,那就不用去考虑什么字符串拼接的问题,但是,json字符串中的键也就是name:"张三"中的name我们还是要

    知道的,那么,我们定义了一个Human类来存放这些字段的信息

    重点1

    public class Human {           private String address;           private Date birthday;           private String id;           private String mark;           private String name;……

    注意要生成get和set方法,还要生成相应的构造方法

           Human(String id, String name, String sex, Date birthday, String address, String mark)

     

    重点2: 

    public class PageBean {         private List root;         private int totalProperty;

     

    ……

    注意要生成get和set方法,也要生成相应的构造方法,它是封装totalProperty和root的类

    public PageBean(int totalProperty, List root)

     

    重点3: 

     

     

    我们这里用到的是:

              JSONObject.fromObject(pageBean,JsonUtil.configJson("yyyy-MM-dd"));

     

    从上面的API中,我们可以看出这方法是将javaBean转换成json对象的方法,但不知道你注意到没,这里有一个日期处理的方法:

    注意,默认情况下jsonlib不会对日期进行处理,所以,我们还需要写一个类来专门来处理日期:

    生成JsonUtil类:

    public class JsonUtil {        public static JsonConfig configJson(String datePattern) {                  JsonConfig jsonConfig = new JsonConfig();                  jsonConfig.setExcludes(new String[] { "" });                  jsonConfig.setIgnoreDefaultExcludes(false);                  jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);                  jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor(datePattern));

                     return jsonConfig;         } }

     

    还需要一个JsonDateValueProcessor类:注意,要添加对应的构造方法(有参和无参)和get、set方法

    public class JsonDateValueProcessor implements JsonValueProcessor {           private String format = "yyyy-MM-dd HH:mm:ss";

               public Object processArrayValue(Object value, JsonConfig jsonConfig) {                  String[] obj = {};                  if (value instanceof Date[]) {                           SimpleDateFormat sf = new SimpleDateFormat(format);                           Date[] dates = (Date[]) value;                           obj = new String[dates.length];                           for (int i = 0; i < dates.length; i++) {                                  obj[i] = sf.format(dates[i]);                            }                  }                 return obj;           }

              public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {                  if (value instanceof Date) {                          String str = new SimpleDateFormat(format).format((Date) value);                           return str;                 }                 return value == null ? null : value.toString();          }

    }

     

     

     至此,我们完成了以前我们拼接字符串的复杂操作,省去了我们要进行手动拼接所带来的麻烦:

    和之前的代码进行一下比较吧:

                   String fmt = " {did: %d, dname: '%s'}";                StringBuffer s = new StringBuffer("{totalProperty:");                s.append(totalProperty).append(", root:[");                int end = start + limit;

                                  if(end>totalProperty){         //如果是数据库,这行不需要                 end = totalProperty;              }

                   for(int i = start; i < end; i ++){                     s.append(String.format(fmt, i, "部门" + i));                     if(i < end - 1){                          s.append(",");//各json 对象用“,”隔开,最后一个不要                     }                }                s.append("]}");                out.println(s.toString());

     

    相信比较一下,你就会发现哪个效率更高,哪种代码写出来更优雅一些……看看吧

     

     


    最新回复(0)