Extjs4——实现动态的grid(即实现数据库表数据的显示)
一、服务器端的实现
由于之前已经有过实现的经验,因此服务器端的实现已经轻车熟路,下边先介绍这一块。
其实从面向对象的角度来说,特别是采用了SSH框架之后,我们可以直接通过hibernate获取对应表对象的集合,然后将集合发送至前台交给Ext处理。这样看起来挺不错,而且实际实现也不难,但是你仔细查看就会发现个很不爽的事情,每次发送的集合包含了大量的无用数据(甚至绝大多数的数据),为什么会这样呢?表关联的原因。hibernate生成的model会引入关联表的对象(或对象集合),而struts—json插件会将他们全部序列化,这在我们实际Ext的显示中不需要的。当然,你或许可以无视,但这绝对是个糟糕的设计,你将大量的网络流量耗费在了无效数据上。
那么怎么解决这个问题呢?有两个方法:一是通过struts—json提供的方法(一般用注解或result配置)指定这些数据不序列化,听着挺好,但做着费劲,你要么在model类中写入很多和这个类本身没有任何关系的注解,要么需要就在action的<result>标签内对每一个字段进行指定,这个听听都头疼;另外一种方法或许靠谱些,可以对每个model对应一个简化的model,在hibernate读取集合后将集合转化为该类型的,事实上我在处理多表关联数据显示时就用的这个方法,但是你觉得对于每个实体定义两个model合适吗?
既然这两种都不行,那么怎么处理呢?其实完全可以抛开hibernate,采用原始点的方法:先sql读取所有表名,然后根据表名读出字段名和对应数据,其中表数据使用二维数据存数即可,事实证明这种方法更灵活。
下边是实现代码:
View Code
1 /**
2 * 获取表名
3 * @return List<表明>
4 */
5 public List<MyDataBase> getTables(){
6 List<MyDataBase> mdbls=new ArrayList<MyDataBase>();
7 Session se=HibernateSessionFactory.getSession();
8 SQLQuery sq=se.createSQLQuery("show tables");
9 List<String> sls=sq.list();
10 for(String str:sls){
11 if("jbpm".equals(str.substring(0, 4)))
12 continue;
13 MyDataBase mdb=new MyDataBase();
14 mdb.setTablename(str);
15 mdbls.add(mdb);
16 }
17 return mdbls;
18 }
19
20 /**
21 * 获取字段名
22 * @param tablename 表名
23 * @return
24 */
25 public List<MyDataBase> getFields(String tablename){
26 List<MyDataBase> mdbls=new ArrayList<MyDataBase>();
27 Session se=HibernateSessionFactory.getSession();
28 SQLQuery sq=se.createSQLQuery("desc "+tablename).addScalar("Field");
29 List<String> sls=sq.list();
30 for(String str:sls){
31 MyDataBase mdb=new MyDataBase();
32 mdb.setFieldname(str);
33 mdbls.add(mdb);
34 }
35 return mdbls;
36 }
37
38 /**
39 * 获取字段
40 * @param tablename 表名
41 * @return
42 */
43 public String[] getFieldsInArray(String tablename){
44 String[] fields;
45 Session se=HibernateSessionFactory.getSession();
46 SQLQuery sq=se.createSQLQuery("desc "+tablename).addScalar("Field");
47 List<String> sls=sq.list();
48 fields=new String[sls.size()];
49 for(int i=0;i<sls.size();i++){
50 fields[i]=sls.get(i);
51 }
52 return fields;
53 }
54
55 /**
56 * 获取表内容
57 * @param tablename
58 * @return
59 */
60 public String[][] getTableContent(String tablename){
61 String[][] content=null;
62 Session se=HibernateSessionFactory.getSession();
63 SQLQuery sq=se.createSQLQuery("select * from "+tablename);
64 List<Object[]> ls=sq.list();
65 content=new String[ls.size()][getFields(tablename).size()];
66 for(int i=0;i<ls.size();i++){
67 Object[] strs=ls.get(i);
68 for(int j=0;j<strs.length;j++){
69 content[i][j]=strs[j]==null?"":strs[j].toString();
70 }
71 }
72 return content;
73 }
74
75 /**
76 * 将字段名集合处理为JSON格式的字符串
77 * @param tablename 对应表名
78 * @return 字符串数组,每一项为一个Ext中grid的一个header
79
补充:web前端 , JavaScript ,