`
techno_it
  • 浏览: 54613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Struts2.0中使用JSON结合DWR和EXT

阅读更多

如题,大家在Struts2.0中使用json是一般都选择了jsonplugin,我对jsonplugin不太熟悉,因此我选择了json-lib这个jar包。不知道jsonplugin对bean的支持是不是很好,还是只能对action进行序列化。好了现在说一下我的思路。

我先用Json-lib将我的bean进行序列化,当然此过程是放在了我的一个service中的。然后配置DWR公开service的接口。在EXT调用DWR的过程中可能会有些小麻烦,因为EXT官方的程序中没有支持DWR做数据源。在网上找到一个强人写的可做EXT数据源的DWRJS略加修改就成了我的DWRJSONJS,只是小小的改动了一下。下面贴一下布分代码。

这是我改过的JS:

js 代码
  1. Ext.data.DWRProxy = function(dwrCall, pagingAndSort)   
  2. {   
  3.     Ext.data.DWRProxy.superclass.constructor.call(this);   
  4.     this.dwrCall = dwrCall;   
  5.     //this.args = args;   
  6.     this.pagingAndSort = (pagingAndSort!=undefined ? pagingAndSort : true);   
  7. };   
  8.   
  9. Ext.extend   
  10. (   
  11.     Ext.data.DWRProxy,    
  12.     Ext.data.DataProxy,    
  13.     {   
  14.     load : function(params, reader, callback, scope, arg)    
  15.     {   
  16.         if(this.fireEvent("beforeload"this, params) !== false)    
  17.         {   
  18.             var sort;   
  19.   
  20.             if(params.sort && params.dir)    
  21.                 sort = params.sort + ' ' + params.dir;   
  22.             else    
  23.                 sort = '';   
  24.   
  25.             var delegate = this.loadResponse.createDelegate(this, [reader, callback, scope, arg], 1);   
  26.             var callParams = new Array();   
  27.   
  28.             if(arg.arg)    
  29.             {   
  30.                 callParams = arg.arg.slice();   
  31.             }   
  32.   
  33.             if(this.pagingAndSort)    
  34.             {   
  35.                 callParams.push(params.start);   
  36.                 callParams.push(params.limit);   
  37.                 callParams.push(sort);   
  38.             }   
  39.   
  40.             callParams.push(delegate);   
  41.             this.dwrCall.apply(this, callParams);   
  42.         }    
  43.         else    
  44.         {   
  45.             callback.call(scope || thisnull, arg, false);   
  46.         }   
  47.     },   
  48.   
  49.     loadResponse : function(listRange, reader, callback, scope, arg)    
  50.     {   
  51.         var result;   
  52.         try    
  53.         {   
  54.             result = reader.readRecords(listRange.evalJSON());   
  55.         }    
  56.         catch(e)    
  57.         {   
  58.             this.fireEvent("loadexception"thisnull, response, e);   
  59.             callback.call(scope, null, arg, false);   
  60.             return;   
  61.         }   
  62.         callback.call(scope, result, arg, true);   
  63.     },   
  64.   
  65.     update : function(dataSet){},   
  66.   
  67.     updateResponse : function(dataSet)   
  68.     {}   
  69.     }   
  70. );   
  71.   
  72. Ext.data.ListRangeReader = function(meta, recordType)   
  73. {   
  74.     Ext.data.ListRangeReader.superclass.constructor.call(this, meta, recordType);   
  75.     this.recordType = recordType;   
  76. };   
  77. Ext.extend   
  78. (   
  79.     Ext.data.ListRangeReader,    
  80.     Ext.data.DataReader,    
  81.     {   
  82.         getJsonAccessor: function()   
  83.         {   
  84.             var re = /[\[\.]/;   
  85.             return function(expr)    
  86.             {   
  87.                 try    
  88.                 {   
  89.                     return(re.test(expr))? new Function("obj""return obj." + expr): function(obj){return obj[expr];};   
  90.                 }   
  91.                 catch(e)   
  92.                 {}   
  93.                 return Ext.emptyFn;   
  94.             };   
  95.         }(),   
  96.   
  97.         read : function(o)   
  98.         {   
  99.             var recordType = this.recordType, fields = recordType.prototype.fields;   
  100.             //Generate extraction functions for the totalProperty, the root, the id, and for each field   
  101.             if (!this.ef)    
  102.             {   
  103.                 if(this.meta.totalProperty)    
  104.                 {   
  105.                     this.getTotal = this.getJsonAccessor(this.meta.totalProperty);   
  106.                 }   
  107.   
  108.                 if(this.meta.successProperty)    
  109.                 {   
  110.                     this.getSuccess = this.getJsonAccessor(this.meta.successProperty);   
  111.                 }   
  112.   
  113.                 if (this.meta.id)    
  114.                 {   
  115.                     var g = this.getJsonAccessor(this.meta.id);   
  116.                     this.getId = function(rec)    
  117.                     {   
  118.                         var r = g(rec);   
  119.                         return (r === undefined || r === "") ? null : r;   
  120.                     };   
  121.                 }    
  122.                 else    
  123.                 {   
  124.                     this.getId = function(){return null;};   
  125.                 }   
  126.                 this.ef = [];   
  127.                 for(var i = 0; i < fields.length; i++)   
  128.                 {   
  129.                     f = fields.items[i];   
  130.                     var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;   
  131.                     this.ef[i] = this.getJsonAccessor(map);   
  132.                 }   
  133.             }   
  134.             var records = [];   
  135.             var root = o.data, c = root.length, totalRecords = c, success = true;   
  136.   
  137.             if(this.meta.totalProperty)   
  138.             {   
  139.                 var v = parseInt(this.getTotal(o), 10);   
  140.                 if(!isNaN(v))   
  141.                 {   
  142.                     totalRecords = v;   
  143.                 }   
  144.             }   
  145.   
  146.             if(this.meta.successProperty)   
  147.             {   
  148.                 var v = this.getSuccess(o);   
  149.                 if(v === false || v === 'false')   
  150.                 {   
  151.                     success = false;   
  152.                 }   
  153.             }   
  154.   
  155.             for(var i = 0; i < c; i++)   
  156.             {   
  157.                 var n = root[i];   
  158.                 var values = {};   
  159.                 var id = this.getId(n);   
  160.                 for(var j = 0; j < fields.length; j++)   
  161.                 {   
  162.                     f = fields.items[j];   
  163.                     var v = this.ef[j](n);   
  164.                     values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue);   
  165.                 }   
  166.                 var record = new recordType(values, id);   
  167.                 records[i] = record;   
  168.             }   
  169.   
  170.             return{   
  171.                 success : success,   
  172.                 records : records,   
  173.                 totalRecords : totalRecords   
  174.             };   
  175.         }   
  176.     }   
  177. ); 

注:上面程序中的reader没有作用了。我用的是EXT中的JSONREADER。

下面是EXTGrid的代码:

js 代码
  1. <#macro ext name dwrclass dwrfunction>   
  2.     <script type=< span="">"text/javascript" src="<@s.url value='/pubjs/ext-dwr.js'/>"></script>   
  3.     <script type='text javascript' src="&lt;/span">"<@s.url value='/dwr/interface/${dwrclass}.js'/>"></script>   
  4.     <script type='text javascript' src="&lt;/span">"<@s.url value='/dwr/engine.js'/>"></script>   
  5.     <script type='text javascript' src="&lt;/span">"<@s.url value='/dwr/util.js'/>"></script>      
  6.     <script type=< span="">"text/javascript">   
  7.   
  8.  var ds;   
  9.     var GridUI = function()   
  10.     {          
  11.         var grid; //component   
  12.         var columnModel; // definition of the columns   
  13.         if('${name}'=='userList')   
  14.         {   
  15.             function initDataSource()    
  16.             {   
  17.                   ds = new Ext.data.Store({   
  18.                     proxy: new Ext.data.DWRProxy(${dwrclass}.${dwrfunction}, true),   
  19.                        
  20.                     reader: new Ext.data.JsonReader(   
  21.                     <@s.property value="listDetail"/>),   
  22.                     remoteSort: false  
  23.                   });   
  24.        
  25.                     ds.on("load"function () {   
  26.                     });        
  27.             }   
  28.   
  29.             function getColumnModel()    
  30.             {   
  31.                 if(!columnModel) {   
  32.                     columnModel = new Ext.grid.ColumnModel(   
  33.                         <@s.property value="listClounmModel"/>   
  34.                     );   
  35.                     columnModel.defaultSortable = true;   
  36.             }   
  37.                 return columnModel;   
  38.             }      
  39.     }   
  40.     else if('${name}'=='roleList')   
  41.     {   
  42.         function initDataSource()    
  43.             {   
  44.                   ds = new Ext.data.Store({   
  45.                     proxy: new Ext.data.DWRProxy(${dwrclass}.${dwrfunction}, true),   
  46.                        
  47.                     reader: new Ext.data.JsonReader(   
  48.                     <@s.property value="roleDetail"/>),   
  49.                     remoteSort: false  
  50.                   });   
  51.        
  52.                     ds.on("load"function () {   
  53.                     });        
  54.             }   
  55.   
  56.             function getColumnModel()    
  57.             {   
  58.                 if(!columnModel) {   
  59.                     columnModel = new Ext.grid.ColumnModel(   
  60.                         <@s.property value="roleClounmModel"/>   
  61.                     );   
  62.                     columnModel.defaultSortable = true;   
  63.             }   
  64.                 return columnModel;   
  65.             }      
  66.     }      
  67.     else if('${name}'=='permList')   
  68.     {   
  69.         function initDataSource()    
  70.             {   
  71.                   ds = new Ext.data.Store({   
  72.                     proxy: new Ext.data.DWRProxy(${dwrclass}.${dwrfunction}, true),   
  73.                        
  74.                     reader: new Ext.data.JsonReader(   
  75.                     <@s.property value="PermissionDetail"/>),   
  76.                     remoteSort: false  
  77.                   });   
  78.        
  79.                     ds.on("load"function () {   
  80.                     });        
  81.             }   
  82.   
  83.             function getColumnModel()    
  84.             {   
  85.                 if(!columnModel) {   
  86.                     columnModel = new Ext.grid.ColumnModel(   
  87.                         <@s.property value="PermissionClounmModel"/>   
  88.                     );   
  89.                     columnModel.defaultSortable = true;   
  90.             }   
  91.                 return columnModel;   
  92.             }      
  93.     }              
  94.         function buildGrid()    
  95.         {                  
  96.             grid = new Ext.grid.Grid(   
  97.                 '${name}',   
  98.                 {   
  99.                     ds: ds,   
  100.                     cm: getColumnModel(),   
  101.                     autoSizeColumns: true,   
  102.                     selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),   
  103.                     loadMask: true  
  104.                 }   
  105.             );   
  106.                
  107.                
  108.             grid.render();   
  109.             grid.getSelectionModel().selectFirstRow();   
  110.             //鍙抽敭鑿滃崟   
  111.             grid.addListener('rowcontextmenu', contextmenu);   
  112.             var gridFoot = grid.getView().getFooterPanel(true);   
  113.             var paging = new Ext.PagingToolbar   
  114.             (   
  115.                 gridFoot,   
  116.                 ds,   
  117.                 {   
  118.                     pageSize:<@s.property value="perPageCount"/>,   
  119.                     displayInfo:true,   
  120.                     beforePageText:'<@s.text name="System.list.page"/>',   
  121.                     afterPageText:'<@s.text name="System.list.pagedetails"/>',   
  122.                     displayMsg: '<@s.text name="System.list.gridList"/>'   
  123.                 }   
  124.             );   
  125.             /*paging.add  
  126.             (  
  127.                 '_',  
  128.                 {  
  129.                     pressed: true,  
  130.                     enableToggle:true,  
  131.                     text: '<@s.text name="System.list.details"/>',  
  132.                     cls: 'x-btn-text-icon details',  
  133.                     toggleHandler: toggleDetails  
  134.                 }  
  135.             );*/  
  136.         }   
  137.        
  138.         function toggleDetails(btn, pressed)   
  139.         {   
  140.             if(pressed)   
  141.             {   
  142.                 alert('Oh!Who hit me?');   
  143.             }   
  144.         }   
  145.        
  146.         return{   
  147.             init : function() {   
  148.                 initDataSource();   
  149.                 ds.load({params:{start:0, limit:<@s.property value="perPageCount"/>}, callback:callme});               
  150.                 buildGrid();   
  151.             },   
  152.                
  153.             getStore: function() {   
  154.                 return ds;   
  155.             }   
  156.         }   
  157.     }();   
  158.     function callme(tt)   
  159.     {   
  160.     }   
  161.     Ext.onReady(GridUI.init, GridUI, true);    
  162.     </script>   
  163.   

以下是业务程的代码。

java 代码
  1. public JSONObject getPageData(String queryString, int cpage, int pageSize,Serializable[] params) throws DFLogError   
  2.     {   
  3.         List results;   
  4.         JPage pageData = null;   
  5.         int total;   
  6.         Session s = this.getSession();   
  7.         try  
  8.         {   
  9.             Query query = this.getQuery(queryString, params, s);   
  10.             total = query.list().size();   
  11.             results = query.setFirstResult(cpage).setMaxResults(pageSize).list();   
  12.             pageData = new JPage(total, cpage);   
  13.             pageData.setData(results);   
  14.             return JSONObject.fromBean(pageData,StringUtils.commaDelimitedListToStringArray("roles,authorities"));   
  15.         }   
  16.         catch (HibernateException e)   
  17.         {   
  18.             log.error("Error in BaseDao.getPageData(String hql, int cpage, int pageSize)",e);   
  19.             throw new DFLogError("Error in BaseDao.getPageData(String hql, int cpage, int pageSize)",e);   
  20.         }   
  21.         finally  
  22.         {   
  23.             this.closeSession(s);
分享到:
评论
3 楼 siyuan 2008-04-24  
那么用到struts2了?
2 楼 popzwk 2008-03-31  
    
1 楼 yangxuesong 2007-11-09  
你好,想问下,ext的form要怎么提交给action呢?我做的数据可以提交上去,但是页面还是原来的页面,据说是要返回一个{success:true},请问是怎么操作的呢??

相关推荐

    ssh实验代码 dwr ext3 struts2 spring3 json都有

    在这个实验代码中,可能包含了这些技术的集成与应用示例,例如如何配置SSH框架、如何使用DWR进行Ajax通信、如何在EXT3文件系统上部署应用、如何利用JSON进行数据交换以及如何设置和使用Ehcache。这些代码可以作为...

    ssh+ext+json+dwr技术实现的动态树

    在IT行业中,SSH、EXT、JSON和DWR都是重要的技术和工具,它们在Web开发领域有着广泛的应用。这个名为“ssh+ext+json+dwr技术实现的动态树”的项目结合了这些技术,为我们提供了一个生动的示例,展示了如何在实际项目...

    ssh整合例子(spring3 + struts2 + hibernate4+dwr+ext+json)

    内含 ext+dwr+freemark+jasperreort+ireport+echance+oscache+velocite等技术 展示例子:http://zz563143188.iteye.com/blog/1462413 若要下载chm格式请到http://user.qzone.qq.com/563143188 程序源码下载地址10MB...

    ext+Json+dwr+spring+hibernate整合项目实例与资源

    而今天我们要做的一个demo是一个简化的HRMS(人力资源管理系统),在SSH上因为Spring本身有自己的MVC框架实现,所以我们用它来代替struts,在Ajax上我们采用两大框架组件extjs和dwr,前者可以做出非常炫目的页面效果,...

    Extjs Tree + JSON + Struts2 示例源代码

    JSON的优势在于它的结构与JavaScript对象相似,可以直接在JavaScript中使用,减少了数据处理的复杂性。 3. **Struts2**: Struts2 是一个基于MVC设计模式的Java Web应用框架。它提供了一种处理HTTP请求、控制业务...

    Struts In Action中文修正版

    7. **Ajax集成**:探讨如何利用Ajax技术增强用户体验,如使用DWR(Direct Web Remoting)和JSON与Struts的结合。 8. **异常处理**:讲述如何在Struts中有效地捕获和处理异常,提供统一的错误页面和反馈机制。 9. *...

    整合--Struts2为extjs提供server数据

    在描述中提到,这种整合可以替代原本使用Extjs与Dwr(Direct Web Remoting)的组合,Dwr通常用于实时双向通信,但在某些场景下,Struts2可能更适合处理数据提供任务。 整合的过程主要涉及以下几个步骤: 1. **定义...

    真实项目:Hibernate3.3.2+Spring3.0+Struts2.2.3+ext3.4.0

    项目配置:Hibernate3.3.2+Spring3.0+Struts2.2.3 + ext3.4.0,真实项目实现,项目中可参考经典权限设计,通用数据录入,批量数据处理(poi),统一的JSON格式封装,灵活的组合模式设计,EXTJS面向组件编程参考......

    程序员从初级到高级知识汇集

    - **Spring MVC实例**:结合JSON和Linechart展示了Spring MVC在实际应用中的数据展示和图表绘制,对于Web应用的前端展现有很好的参考价值。 - **SSH代码生成工具**:这两部分介绍了可以自动生成SSH框架下各层代码...

    ajax十大框架

    DWR 与 Spring 和 Struts 等其他 Java 框架集成良好,可以快速构建高性能的 Web 应用程序。此外,DWR 还支持 JSON 数据格式,便于前后端之间的数据交换。 ### 6. Buffalo Buffalo 是一种新型的 Ajax 框架,它通过在...

    技术博客珍藏版

    DWR用于提供异步更新,Ext是一个JavaScript库,JSON则是数据交换格式。 - SSI整合:Struts2、Spring和Ibatis的集成,Ibatis是一个轻量级的ORM框架,比Hibernate更灵活。 - 代码生成工具:在基于SSH的多层结构中,...

    JavaEE学习课程分享精英强化班腾科.doc

    - **AJAX**: AJAX基础知识、JSON技术、常用框架(JQuery、DWR、EXT)。 - **全真实战项目**: 腾科BBS系统、装饰师设计平台、邮件客户端系统。 #### 四、JavaEE框架企业级应用开发 - **Struts2**: - MVC模式介绍及...

Global site tag (gtag.js) - Google Analytics