ExtJS列表控件实现CRUD操作

来源:互联网 发布:node.js php 对比 编辑:程序博客网 时间:2024/06/03 09:40

ExtJS列表控件实现CRUD操作


首先这是一个人员与机构信息的管理模块,在这里主要是为了阐述一下利用ExtJS与SSH进行前后台交互的几种方式:

下面我就把页面中所用用到的一些业务逻辑类贴一下:

请求action类:

Java代码  收藏代码
  1. @Controller("personAction")  
  2. @Scope("prototype")  
  3. public class PersonAction extends BaseAction implements ModelDriven{  
  4.   
  5.     @Resource  
  6.     private PersonManager personManager;  
  7.       
  8.     private Person person;  
  9.       
  10.     private int orgId;  
  11.       
  12.     private int[] ids;  
  13.       
  14.     public Object getModel() {  
  15.         if(person == null){  
  16.             person = new Person();  
  17.         }  
  18.         return person;  
  19.     }  
  20.   
  21.     public void execute(){  
  22.         //{"datas":[{id:xx},{name:xx},{...}],"totals":xx}  
  23.         toJSON(personManager.searchPersons());  
  24.           
  25.     }  
  26.       
  27.     public void save() {  
  28.   
  29.         if(person.getId() == null || person.getId() == 0){  
  30.             personManager.addPerson(person, orgId);  
  31.         }else{  
  32.             personManager.updatePerson(person, orgId);  
  33.         }  
  34.           
  35.         //需要向客户端应答成功或失败  
  36.         Map success = new HashMap();  
  37.         success.put("success"true);  
  38.         //{success:true}  
  39.         toJSON(success);  
  40.         //return "pub_add_success";  
  41.     }     
  42.     public void updateInput() {  
  43.         Person p = personManager.findPerson(person.getId());  
  44.           
  45.         //Ext表单加载模型  
  46.         ExtLoadModel elm = new ExtLoadModel();  
  47.         elm.setSuccess(true);  
  48.         elm.setData(p);  
  49. //        
  50. //      也可以采用Map的方式:  
  51. //      Map map = new HashMap();  
  52. //      map.put("success",true);  
  53. //      map.put("data", p);  
  54.         //转换后格式:{success:true,data:{id:xx,name:xxx,sex:xx,address:xx}}  
  55.         toJSON(elm);  
  56.     }  
  57.     public void del() {  
  58.         //person!del.action?ids=24&ids=21&  
  59.         System.out.println(ids.toString());  
  60.         if(ids != null){  
  61.             for(int i=0; i<ids.length; i++){  
  62.                 personManager.delPerson(ids[i]);  
  63.             }  
  64.         }     
  65.     }  
  66.     public int getOrgId() {  
  67.         return orgId;  
  68.     }  
  69.     public void setOrgId(int orgId) {  
  70.         this.orgId = orgId;  
  71.     }  
  72.     public int[] getIds() {  
  73.         return ids;  
  74.     }  
  75.     public void setIds(int[] ids) {  
  76.         this.ids = ids;  
  77.     }  
  78. }  

 

下面贴一下在我们action类中所用到一下类:

基类BaseAction

Java代码  收藏代码
  1. public class BaseAction {  
  2.     static{  
  3.         //避免对象的解释陷入死循环,添加自己的JsonMapper解释器  
  4.         JSONMapper.addHelper(new MyJsonObjectMapper());  
  5.     }  
  6.     /** 
  7.      * 将一个对象转换为JSON的字符串,并写入HTTP SERVLET OUTPUT STREAM 
  8.      * @param o 
  9.      */  
  10.     protected void toJSON(Object o){  
  11.         try {  
  12.             ServletActionContext.getResponse().setCharacterEncoding("GB18030");  
  13.             ServletActionContext.getResponse().setContentType("text/html");  
  14.               
  15.             //System.out.println(JSONMapper.toJSON( o ).render(true));  
  16.                   
  17.             ServletActionContext.getResponse().getOutputStream().write(  
  18.                 JSONMapper.toJSON( o ).render(false).getBytes("GB18030")  
  19.             );  
  20.               
  21.         } catch (UnsupportedEncodingException e) {  
  22.             e.printStackTrace();  
  23.         } catch (MapperException e) {  
  24.             e.printStackTrace();  
  25.         } catch (IOException e) {  
  26.             e.printStackTrace();  
  27.         }finally{  
  28.             //清空  
  29.             MyJsonObjectMapper.clean();  
  30.         }  
  31.     }  
  32. }  

 

封装数据

Java代码  收藏代码
  1. /** 
  2.  * 封装数据 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class ExtLoadModel {  
  7.     private boolean success;  
  8.     private Object data;  
  9.       
  10.     public boolean isSuccess() {  
  11.         return success;  
  12.     }  
  13.     public void setSuccess(boolean success) {  
  14.         this.success = success;  
  15.     }  
  16.     public Object getData() {  
  17.         return data;  
  18.     }  
  19.     public void setData(Object data) {  
  20.         this.data = data;  
  21.     }  
  22. }  

 在基类中用到处理JSON数据的类

Java代码  收藏代码
  1. /** 
  2.  * 在jsonMapper处理之前做一个简单处理 
  3.  * 记录已经处理的对象,如果已经处理了。就不在处理否则交给jsonMapper去处理 
  4.  * @author Administrator 
  5.  * 
  6.  */  
  7. public class MyJsonObjectMapper extends ObjectMapper {  
  8.     public static ThreadLocal dealedObject = new ThreadLocal();  
  9.       
  10.     /** 
  11.      * 判断该对象是否已处理 
  12.      * 利用Map中key value来存放记录信息 
  13.      * @param o 
  14.      * @return 
  15.      */  
  16.     public static boolean hasDealed(Object o){  
  17.           
  18.         Map map = (Map)dealedObject.get();  
  19.           
  20.         if(map == null){  
  21.             map = new HashMap();  
  22.             dealedObject.set(map);//首次放到ThreadLocal中  
  23.         }  
  24.         //如果处理对象为空则不进行判断,交由父类处理  
  25.         if(o == null){  
  26.             return true;  
  27.         }  
  28.         //利用map中key记录处理对象的记录信息  
  29.         if(map.containsKey(o.toString())){  
  30.             return true;  
  31.         }else{  
  32.             //向map中添加一个key值,记录此对象  
  33.             map.put(o.toString(), null);  
  34.             return false;  
  35.         }  
  36.     }  
  37.     /** 
  38.      * 清空ThreadLocal中的数据 
  39.      */  
  40.     public static void clean(){  
  41.         dealedObject.remove();  
  42.     }  
  43.   
  44.     @Override  
  45.     public JSONValue toJSON(Object obj) throws MapperException {  
  46.         //如果该对象没有处理则交给父类ObjectMapper去处理,完成后返回json格式的对象  
  47.         if(!hasDealed(obj)){  
  48.             return super.toJSON(obj);  
  49.         }  
  50.           
  51.         return new JSONObject();  
  52.     }  
  53. }  

 下面就来看看我们js文件:看看是如何与后台进行交互数据的。

Js代码  收藏代码
  1. Ext.onReady(function(){  
  2.     Ext.QuickTips.init(); //显示提示信息  
  3.       
  4.     // 相当于一个数据源  
  5.     var store = new Ext.data.JsonStore({  
  6.         url:"person.action",  
  7.         root:"datas",  
  8.         totalProperty:"total",  
  9.         fields:["id","name","sex","age","address","duty"]  
  10.     });  
  11.       
  12.     //1将向后台发出一个请求,请求中包含的参数是start和limit(每页显示的行数)  
  13.     store.load({params:{start:0,limit:20}});  
  14.   
  15.     //CheckBox选择框  
  16.     var sm = new Ext.grid.CheckboxSelectionModel();  
  17.       
  18.     //创建表单的窗口  
  19.     var createFormWindow = function(){  
  20.       
  21.         var postForm = new Ext.form.FormPanel({  
  22.             baseCls: 'x-plain',  
  23.             defaultType: 'textfield',  
  24.             items: [  
  25.                 {  
  26.                     xtype:"hidden",  
  27.                     name:"id"  
  28.                 },  
  29.                 {  
  30.                     fieldLabel:"姓名",  
  31.                     name:"name"  
  32.                 },  
  33.                 {  
  34.                     fieldLabel:"性别",  
  35.                     name:"sex"  
  36.                 },  
  37.                 {  
  38.                     fieldLabel:"年龄",  
  39.                     name:"age"  
  40.                 },  
  41.                 {  
  42.                     fieldLabel:"职务",  
  43.                     name:"duty"  
  44.                 },  
  45.                 {  
  46.                     fieldLabel:"电话",  
  47.                     name:"phone"  
  48.                 },  
  49.                 {  
  50.                     fieldLabel:"地址",  
  51.                     name:"address"  
  52.                 }  
  53.             ],  
  54.             buttons: [  
  55.                 {  
  56.                     xtype:'button',  
  57.                     text: '保存',  
  58.                     handler:function(){  
  59.                         Ext.MessageBox.show({  
  60.                            msg: '正在保存,请稍等...',  
  61.                            progressText: 'Saving...',  
  62.                            width:300,  
  63.                            wait:true,  
  64.                            waitConfig: {interval:200},  
  65.                            icon:'download'  
  66.                        });  
  67.                        postForm.form.doAction('submit',{//2通过form向后台发出请求  
  68.                          url:"person!save.action",  
  69.                          method:'post',  
  70.                          params:'',  
  71.                          success:function(form,action){  
  72.                             Ext.MessageBox.hide();  
  73.                             Ext.Msg.alert('恭喜','保存目标成功');  
  74.                             store.reload();  
  75.                             postWindow.destroy();  
  76.                          },  
  77.                          failure:function(){  
  78.                                 Ext.Msg.alert('错误','服务器出现错误请稍后再试!');  
  79.                          }  
  80.                       });                        
  81.                     }  
  82.                 },  
  83.                 {  
  84.                     text: '取消',  
  85.                     handler:function(){  
  86.                         postWindow.destroy();  
  87.                     }  
  88.                 }  
  89.             ]             
  90.         });  
  91.           
  92.           
  93.         //将表单放到一个窗口中,并显示  
  94.         var postWindow = new Ext.Window({  
  95.             title: "人员信息表单",  
  96.             width: 600,  
  97.             height:500,  
  98.             collapsible:true,  
  99.             maximizable:true,  
  100.             layout: 'fit',  
  101.             plain:true,  
  102.             bodyStyle:'padding:5px;',  
  103.             modal:true,  
  104.             items: postForm  
  105.         });  
  106.           
  107.         postWindow.show();  
  108.         return postForm;  
  109.     };    
  110.       
  111.     var tbars = [ //在GridPanel列表界面头部的按钮,包括:添加、删除按钮  
  112.         //添加按钮  
  113.         {  
  114.             text:'添加',  
  115.             tooltip:'添加记录',  
  116.             handler:createFormWindow  
  117.         },  
  118.         {xtype:'tbseparator'},  
  119.         //删除按钮  
  120.         {  
  121.             text:'删除',  
  122.             tooltip:'删除选中的记录',  
  123.             handler:function(){  
  124.             var _record = sm.getSelected();  
  125.             if(_record){  
  126.                 //提示是否删除数据  
  127.                 Ext.Msg.confirm("是否要删除?","是否要删除这些被选择的数据?",  
  128.                     function(btn){  
  129.                         if(btn == "yes"){  
  130.                             var ss = sm.getSelections();  
  131.                             var delUrl = "person!del.action?";  
  132.                             for(var i=0; i<ss.length; i++){  
  133.                                 delUrl = delUrl + "ids=" + ss[i].data.id + "&";  
  134.                                  //ds.remove(ss[i]);  
  135.                             }  
  136.                             //3发出AJAX请求删除相应的数据!  
  137.                             //delUrl=person!del.action?ids=1&ids=2&ids=3&;  
  138.                             Ext.Ajax.request({  
  139.                                 url:delUrl,  
  140.                                 success:function(){  
  141.                                     Ext.Msg.alert("删除信息成功","您已经成功删除信息!");  
  142.                                     store.reload();  
  143.                                 },  
  144.                                 failure:function(){  
  145.                                     Ext.Msg.alert('错误','服务器出现错误请稍后再试!');  
  146.                                 }  
  147.                             });  
  148.                         }  
  149.                     }  
  150.                 );  
  151.             }else{  
  152.                 Ext.Msg.alert('删除操作','您必须选择一行数据以便删除!');  
  153.             }  
  154.         }  
  155.         }  
  156.     ];        
  157.       
  158.   
  159.       
  160.     // create the Grid  
  161.     var grid = new Ext.grid.GridPanel({  
  162.         store: store,  
  163.         columns: [  
  164.             sm,  
  165.             {header: "序号", width: 50, sortable: true, dataIndex: 'id'},  
  166.             {header: "姓名", width: 275, sortable: true,  dataIndex: 'name'},  
  167.             {header: "性别", width: 100, sortable: true,  dataIndex: 'sex'},  
  168.             {header: "年龄", width: 100, sortable: true,  dataIndex: 'age'},  
  169.             {header: "地址", width: 300, sortable: true,  dataIndex: 'address'},              
  170.             {header: "职务", width: 200, sortable: true,  dataIndex: 'duty'}  
  171.         ],  
  172.         height:350,  
  173.         width:900,  
  174.         title:'人员数据信息列表',  
  175.         sm : sm,  
  176.         bbar:new Ext.PagingToolbar({  
  177.             pageSize: 20,  
  178.             store: store,  
  179.             displayInfo: true,  
  180.             displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',  
  181.             emptyMsg: "没有记录"  
  182.         }),  
  183.         tbar:tbars  
  184.     });  
  185.       
  186.     grid.on("rowdblclick",function(){  
  187.         var _record = sm.getSelected();  
  188.         if(_record){  
  189.             var postForm = createFormWindow();  
  190.             postForm.load({//4加载后台数据另一种方式  
  191.                 url : 'person!updateInput.action?id='+_record.get("id"),  
  192.                 waitMsg : '正在载入数据...',  
  193.                 method:"get",  
  194.                 failure : function(e) {  
  195.                     Ext.Msg.alert('编辑''载入失败'+e);  
  196.                 }  
  197.             });  
  198.         }else{  
  199.             Ext.Msg.alert('修改操作','您必须选择一行数据以便修改!');  
  200.         }  
  201.     });  
  202.   
  203.     grid.render('grid-example');  
  204.   
  205. });  

 在我们jsp页面中只需要引入这些js文件即可:

Html代码  收藏代码
  1. <link rel="stylesheet" type="text/css"  
  2. href="ext-3.1.1/resources/css/ext-all.css" />  
  3. <script type="text/javascript"  
  4. src="ext-3.1.1/adapter/ext/ext-base.js"></script>  
  5. <script type="text/javascript"  
  6. src="ext-3.1.1/ext-all.js"></script>  
  7. <script type="text/javascript" src="index.js"></script>  
  8. </head>  
  9. <body>  
  10. <div id="grid-example"></div>  
  11. </body>  

 关于分页,我在这里并没有贴出相关代码,因为我在前面也说了。主要是为了看看ExtJS与后台业务逻辑进行交互传递数据的方式过程,在细节方面这里还是有许多需要改进的。下面贴出效果图:



 



原创粉丝点击