`
gstarwd
  • 浏览: 1511589 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

extjs和struts、json的整合

阅读更多

原创   extjs和struts、json的整合 收藏

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData(&quot;text&quot;); if (text &amp;&amp; text.length &gt; 300) { text = text + &quot;\r\n\n本文来自CSDN博客,转载请标明出处:&quot; + location.href; clipboardData.setData(&quot;text&quot;, text); } }, 100); } } </script><script type="text/javascript"> function StorePage() { d = document; t = d.selection ? (d.selection.type != 'None' ? d.selection.createRange().text : '') : (d.getSelection ? d.getSelection() : ''); void (keyit = window.open('http://www.365key.com/storeit.aspx?t=' + escape(d.title) + '&amp;u=' + escape(d.location.href) + '&amp;c=' + escape(t), 'keyit', 'scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes')); keyit.focus(); }</script>

使用extjs配合struts的MVC架构是目前流行的做法,两者的整合相当简单,只需扩展Action,直接向HttpServletResponse里写xml和json格式的内容,不再需要forward到struts指定的页面。

//  取查询结果xml和总记录个数
    String xml  =  resultBuffer.getStringValue( CoreConsts.LIST_DATA_XML,  0  );
    String records 
=  resultBuffer.getStringValue( CoreConsts.TOTAL_COUNT,  0  );
    
//  替换xml中的记录个数
    xml  =  replaceRecords( xml, records );
    
    
if  ( records.equals(  " 0 "  ) )
        xml 
=   " <response success='false'> "   +  xml  +   " </response> " ;
    
else
        xml 
=   " <response success='true'> "   +  xml  +   " </response> " ;
    
    response.setContentType(
" application/xml;charset=UTF-8 " );
    PrintWriter out 
=   null ;
    
try
    
... {
        out 
=  response.getWriter();
    }

    
catch  ( IOException e )
    
... {
        e.printStackTrace();
    }

    
    out.write( xml );

 上面的java代码片端实现了一个通用的Action扩展,姑且称之为EXTJSAction,向HttpServletResponse写入 xml内容,包括(但不限于)处理结果的xml格式内容和总的记录个数(用于翻页时显示总记录个数),以及成功或失败的标记,就这么简单!

接下来要求extjs能够识别并处理EXTJSAction返回的xml内容,通常在一个Ext.form.Form里实现,请看下面的代码片段:

var  fs  =   new  Ext.form.Form( ... {
        labelAlign: 
' right ' ,
        labelWidth: 
75 ,
        buttonAlign: 
' left ' ,
        
//  reusable eror reader class defined at the end of this file
        errorReader:  new  Ext.form.XmlErrorReader()
    }
);

fs.fieldset(
        
... {legend: ' 基本信息 ' }  );
    
    dsCust 
=   new  Ext.data.Store( ... {
                proxy: 
new  Ext.data.HttpProxy( ... {url:  ' ../getCustList.do ' } ),
                reader: 
new  Ext.data.XmlReader( ... {
               
//  records will have a "customer" tag
                // root: 'response',
               record:  ' table ' ,
               totalRecords: 
' records '
                   }
,[  ' CUSTID ' ' CUSTSHORTNAME ' ]) 
        }
);
        
    comboboxCust 
=   new  Ext.form.ComboBox( ... {
            fieldLabel:
' 客户 ' ,
            typeAhead: 
true ,
            triggerAction: 
' all ' ,
            store: dsCust,
            displayField:
' CUSTSHORTNAME ' ,
            valueField: 
' CUSTID ' ,
            width:
200 ,
            forceSelection:
true ,
            name:
' clientid ' ,
            hiddenName:
' clientid ' ,
            emptyText:
' 选择一个客户... ' ,
            allowBlank:
false ,
            blankText:
' 请选择一个客户 ' ,
            pageSize: 
20
        }
);

    fs.column(
... {width: 300 } ,
        comboboxCust
      );

    fs.addButton(
' 保存并新增 ' function () ... {
        
// 组装grid的json
         /**/ /*
        var jsonData = "";
        
        for( i=0; i < ds.getCount(); i ++ )
        {
            var rec = ds.getAt( i );
            if ( rec.data.newRecord || rec.dirty ) {
                jsonData += Ext.util.JSON.encode( rec.data ) + ",";
            }
        }
        
        jsonData = jsonData.substring( 0, jsonData.length - 1 );
        //alert( jsonData )
        //console.info(jsonData);
        
*/

        
        
var  m  =  ds.modified.slice(  0  );
        
var  jsonData  =   " [ " ;
        
for  (  var  i  =   0 , len  =  m.length; i  <  len; i ++  )  ... {    
            
// alert(m[i].data["user_name"]);        
             var  ss  =  Ext.util.JSON.encode( m[i].data );
            
// alert(ss);
             if  ( i == 0  )
                   jsonData 
=  jsonData  +  ss;
               
else
                jsonData 
=  jsonData  +   " , "   +  ss;
        }

        jsonData 
=  jsonData  +   " ] " ;
        
// alert(jsonData);

        fs.submit( 
... {
            url: 
" ../addSaleOrder.do " ,
            params:
... {json:jsonData} ,
            waitMsg:
' 正在处理,请稍候... ' ,
            success:
function (form, action ) 
            
...
                Ext.MessageBox.alert(
" 销售订单! " " 保存销售订单成功! " );
                fs.reset();
                ds.modified 
=  []; // 将修改过的记录置为空,如果不清空,则修改过的数据会一直保留
                ds.removeAll();  // 从grid中移去
            }
,
            failure:
function ( form, action )
            
... {
                Ext.MessageBox.alert(
" 销售订单! " " 保存销售订单失败! " );
            }

        }
);
    }
 );

//  A reusable error reader class for XML forms
Ext.form.XmlErrorReader  =   function () ... {
    Ext.form.XmlErrorReader.superclass.constructor.call(
this ... {
            record : 
' field ' ,
            success: 
' @success '
        }
, [
            
' id ' ' msg '
        ]
    );
}
;
Ext.extend(Ext.form.XmlErrorReader, Ext.data.XmlReader);

首先定义了一个Form,这个Form有一个XmlErrorReader,能够读取EXTJSAaction返回的xml格式,判断 EXTJSAaction处理是成功还是失败。Form被提交到../addSalesOrder.do,这是我们熟悉的struts格式,将调用到 EXTJSAction,此即是extjs和struts交互的关键!

我们还注意到上面的js代码中,Form包含一个ComBoBox,用于从下拉列表中选择客户,这个ComBoBox是分页的 (pageSize:20,会自动在ComBoBox展开后下放加翻页工具栏)。客户列表的内容同样来之于EXTJSAction, 即../getCustList.do,这就是一个通用的EXTJSAction的好处,随处可使用!

请仔细体会上面的代码,extjs和struts的整合是如此的简单!

另外,Form在提交时,将Grid的内容组装成一个json格式的字符串,是为了方便成批提交Grid中的记录,那么在服务器端如何处理这个json串中的多条记录呢?需要用到json的java类库(http://www.json.org/java/ ),代码如下:

// 保存订单明细
    String json  =   this .getVariableSpace().getStringValue(  " json " 0  );
    json 
=  RequestUtil.iso2utf( json );

    
if  ( json  !=   null   ||  json.trim().length()  >   0  )
    
... {
        JSONArray jsonArr 
=   null ;
        
try
        
... {
        XmlDBService xdbs 
=  XmlDBServiceManager.getXmlDBService( Const.XMLDBSERVICE );

        jsonArr 
=   new  JSONArray( json );
        
for  (  int  i  =   0 ; i  <  jsonArr.length(); i ++  )
        
... {
            String pmgg 
=  jsonArr.getJSONObject( i ).getString(  " PMGG "  );
            String unit 
=  jsonArr.getJSONObject( i ).getString(  " UNIT "  );
            String amount 
=  jsonArr.getJSONObject( i ).getString(  " AMOUNT "  );
            String price 
=  jsonArr.getJSONObject( i ).getString(  " PRICE "  );
            
// String money = jsonArr.getJSONObject( i ).getString( "MONEY" );
            String availDate  =  jsonArr.getJSONObject( i ).getString(  " availDate "  );

            String sql 
=   " insert into sorderdetail ( sorderid, itemno, goodsid, unitid, quantity, unitprice, validdate  ) select  "
                
+  sorderid
                
+   " "   +  ( i  +   1  )  +   " , ' "
                
+  pmgg
                
+   " ', ( select unitid from goodsunit where goodsid =  "   // 取单位序号
                 +  pmgg
                
+   "  and unitname = ' "   +  unit  +   " ' ), "   +  amount  +   " "   +  price  +   " , ' "   +  availDate  +   " ' " ;

            xdbs.executeDAC( sql );
        }

        }

        
catch  ( Exception e )
        
... {
        e.printStackTrace();
        
// 加处理失败标记
         this .outputBuffer.get( CoreConsts.TOTAL_COUNT,  0  ).setValueWithString(  " 0 "  );
        }


    }

上面的java代码片段依此处理json串的多条记录,构造sql语句,将记录添加到数据库中,以json的方式处理成批提交的记录,应该是最方便的方法。

分享到:
评论

相关推荐

    extjs 跟 struts+json

    文章可能通过一个实际项目或示例,详细解释了如何将ExtJS的Grid Panel与Struts 2通过JSON进行数据交互,帮助读者理解这两种技术的整合过程。学习这些内容有助于提升Web应用的用户体验,实现数据的实时更新和交互。

    extjs与struts的整合代码

    总结来说,ExtJS与Struts的整合是现代企业级Web应用开发的一个常见方案,它结合了优秀的前端交互设计和后端架构管理,为用户提供高效、流畅的使用体验。在实际项目中,开发者应深入理解这两个框架的原理,以便更好地...

    struts2+extjs+json整合实例

    在Struts2和ExtJS整合中,JSON起到桥梁作用,将服务器端的Action产生的数据转换为JSON格式,然后由ExtJS前端解析并显示在界面上。 整合Struts2、ExtJS和JSON的步骤通常包括以下几个部分: 1. **设置Struts2的JSON...

    ExtJS与Struts2的整合工程实例

    整合ExtJS和Struts2的主要目的是利用ExtJS的前端能力增强用户界面,同时利用Struts2的后端处理能力和灵活性处理业务逻辑。具体整合步骤包括: 1. **配置Struts2**:在Struts2的配置文件(struts.xml)中定义Action,...

    Extjs+Struts整合入门实例

    本入门实例主要探讨的是如何将ExtJS与Struts进行整合,以构建一个图书管理系统的前端和后端。这样的整合使得开发者能够利用ExtJS的前端优势,提供美观且交互性强的用户界面,同时利用Struts在服务器端进行数据处理和...

    JSON.rar_JSON Hibernate_extjs_json struts ext_jsp json extjs_str

    在标签"json_hibernate extjs json_struts_ext jsp_json_extjs struts2"中,"json_struts_ext"和"jsp_json_extjs"暗示了JSON在Struts2扩展和JSP与ExtJS之间的交互作用。可能有一个配置或者插件用于让Struts2的动作类...

    struts2-hibernate-spring-Extjs-json.rar_JSON_extjs_extjs json st

    这个压缩包“struts2-hibernate-spring-Extjs-json.rar”显然包含了关于这些技术整合使用的参考资料。下面将详细阐述这些技术以及它们之间的交互。 1. **Struts2**: Struts2是一个基于MVC(模型-视图-控制器)...

    Struts2 Spring2.5 Hiberante3.3.2 +ExtJS(Struts2-json)做的CRUD

    这个DEMO是将这些技术集成在一起,以实现数据的创建(Create)、读取(Read)、更新(Update)和删除(Delete),即CRUD操作,并且利用Struts2的JSON插件来增强与前端ExtJS的交互。 首先,Struts2作为表现层框架,...

    Extjs整合struts2.doc

    在整合 Struts2 时,你需要确保添加了必要的依赖库,例如 `struts2-json-plugin-2.1.8.jar`,这个插件允许 Struts2 将结果直接转换为 JSON 格式,便于与 ExtJS 通信。 配置方面,你需在 `web.xml` 文件中设置 ...

    搭建EXTJS和STRUTS2框架(ext和struts2简单实例)

    ### 搭建EXTJS和STRUTS2框架(ext和struts2简单实例) #### 一、概述 本文档将详细介绍如何在Java Web项目中搭建EXTJS和STRUTS2框架,并通过一个简单的实例来展示如何使这两个技术协同工作。EXTJS是一个用于构建交互...

    struts2+extjs2.1+json+hibernate+spring

    上网找资料,都是一些不全的. struts2+extjs2.1+json+hibernate+spring 自己整合的例子. 当中hibernate数据源可以配置自己的.后台输送json 前台接收.

    漂亮的Extjs+struts2实现联动下拉

    ExtJS和Struts2是两种在Web开发中广泛使用的开源技术。ExtJS是一个JavaScript库,提供了丰富的用户界面组件,如数据网格、图表、表单等,用于构建富客户端应用程序。Struts2则是一个基于MVC设计模式的Java Web框架,...

    Struts2与extjs整合例子

    在实际项目中,这样的整合可以利用Struts2的强大处理能力和ExtJS的出色用户界面,创建出功能丰富且用户体验优秀的Web应用。 描述中的“Struts2与extjs整合例子”暗示我们将通过一个实际的示例来了解整合过程。这...

    Extjs+Struts2+JDBC

    ExtJS、Struts2和JDBC是Web开发中常见的技术栈,它们的结合可以构建功能丰富的交互式Web应用。这个小例子提供了一个基于这些技术的简单增删改查(CRUD)操作的实现,对于初学者来说是一个很好的学习资源。 ExtJS是...

    struts2和ExtJs整合实例

    整合Struts2和ExtJS的主要目的是利用Struts2的强大后端处理能力,结合ExtJS的前端交互性和用户体验,打造高性能、易维护的Web应用。下面将详细介绍整合过程中的一些关键知识点: 1. **Struts2与ExtJS的通信方式**:...

    Extjs+Struts2系统后台管理框架

    这种组合允许前端利用ExtJS的强大界面组件来提供美观、交互性强的用户界面,而后端通过Struts2处理业务逻辑和数据操作,实现前后端的分离。 在"Extjs+Struts2系统后台管理框架"中,"新闻列表"功能通常涉及到以下几...

    Ext+Struts1.2整合

    在IT行业中,"Ext+Struts1.2整合"是一个常见的Web开发技术组合,涉及到两个主要的开源框架:ExtJS(一个JavaScript库)和Struts1.2(一个Java服务器端MVC框架)。这两个框架的整合是为了解决前端用户界面的丰富性和...

    extjs tree struts

    这个文件名可能表示压缩包中包含了一个名为“新建文件夹”的文件夹,里面可能有相关的源代码文件、配置文件或者示例项目,供开发者参考和学习如何在实际项目中整合ExtJS的树形组件和Struts框架。 总的来说,"extjs...

    struts2+extjs整合包

    总的来说,这个整合包提供了开发基于Struts2和ExtJS的Web应用所需的基本组件,可以快速构建出高效、交互性强的Web应用。开发者需要理解这两个框架的工作原理,以及如何利用它们的优势来优化项目结构和提高用户体验。

Global site tag (gtag.js) - Google Analytics