先来看下最后我们要实现的结果是什么样?
先说说我们传统上的做法!!!
我们一般会在后台中拼接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());
相信比较一下,你就会发现哪个效率更高,哪种代码写出来更优雅一些……看看吧