当前位置:编程学习 > JS >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,