`

关于ext和struts的交互

阅读更多

使用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++ )
        
...
分享到:
评论
8 楼 horizon7125 2008-02-15  
非常需要 ,希望楼主能发一份完整的demo,谢谢!
kingzz@126.com
7 楼 tod 2008-01-30  
楼主:是不是见都有份啊,现在都快被逼疯了,有的话我也要:tod_99cn@yahoo.com.cn

谢了!!!!!!!
6 楼 weboffice 2008-01-27  
我也需要呀,楼主也发给我一份吧,十分感谢,我的webeoffice@163.com
5 楼 wuyunjun 2007-12-19  
楼主你太牛了, 这几天我们老师也再给我弄这个问题,你能把你的代码给我发一份吗?我的邮箱是wuhsn@163.com。非常感谢!!!
4 楼 hudixin1987 2007-12-18  
楼主 你好  我在学习ext 能法个源码给我 借鉴下么 谢谢  非常感谢   dixinhu@yahoo.com.cn
3 楼 j357777842 2007-11-14  
楼主你好!近日我正在研究ext与struts的结合,今天搞了一天,没有一点效果,请求楼主能发一个实例,我的Email:herhun@163.com,MSN:herhun@hotmail.com,qq:4953295,我是一个SA,希望能和你好好勾通和交流!期待你能回复!谢谢!
2 楼 j357777842 2007-11-14  
楼主你好,能否发一个完整的返回json的实例代码?
1 楼 JaNer 2007-10-26  
正在研究EXTJS和Struts整合的问题,看到此帖很是兴奋。看完后有个大体的理解了,下一步动手肯定还会得来求教楼主.!

相关推荐

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

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

    ext+struts2的学生信息管理系统

    STRUTS2通过拦截器和配置文件实现了灵活的请求处理,支持多种视图技术,与EXT的集成尤为顺畅,能为前端提供强大的数据展示和交互支持。 学生信息管理系统是一个典型的业务管理系统,其主要功能包括班级管理、学生...

    struts2与Ext4.0的json交互

    这篇博客文章“Struts2与Ext4.0的json交互”可能会探讨如何在Struts2中配置和使用JSON来与前端的Ext4.0框架进行通信。 首先,我们来看Struts2中的JSON插件。这个插件允许我们在Action类中直接返回JSON对象,无需...

    Ext+struts学生管理系统

    通过集成Ext与Struts,它实现了高效的前后端交互和数据库操作。 【描述】"Ext+struts Ext学生管理系统"是基于Web的,使用了富客户端技术ExtJS,提供用户友好的图形界面。ExtJS是一个强大的JavaScript库,用于构建...

    Ext和struts2实例

    Ext 和 Struts2 是两种非常重要的 Java Web 开发框架,它们在构建企业级应用程序时起着关键作用。本文将深入探讨这两个框架的结合使用,并解决可能出现的 jar 包冲突问题。 首先,Ext(Ext JS)是一款强大的 ...

    ext整合struts2

    3. **创建EXTJS应用**:定义EXTJS的组件和布局,使用Store和Proxy与Struts2进行数据交互。 4. **Action处理请求**:在Action中处理EXTJS发送的请求,进行业务处理并返回JSON数据。 5. **结果处理**:EXTJS根据接收到...

    Ext+struts+ibatis 完整项目

    总的来说,"Ext+struts+ibatis 完整项目"是一个全面展示Java Web开发流程的实例,涵盖了前端、后端以及数据库操作的各个环节,对于学习和实践这一技术栈的开发者来说,是一个宝贵的参考资料。通过深入研究这个项目,...

    ext+struts1.2图书管理系统

    解压后,开发者可以研究其目录结构,理解 EXT 和 Struts1.2 如何协同工作,查看具体的 Action 类如何处理请求,以及 JSP 页面如何与 EXT 组件交互。此外,还可以学习到如何配置 Struts 的配置文件(struts-config.xml...

    struts与ext集成

    Struts2和EXT的集成是Java Web开发中的一个重要主题,特别是在构建用户界面时追求美观、交互性强的应用。这篇教程将深入探讨如何将这两者结合,为开发者提供一个更高效的开发环境。 **Struts2框架** Struts2是...

    ext+struts2

    EXT是一个强大的JavaScript库,它提供了丰富的用户界面组件和交互效果,而Struts2是Java EE平台上的一个MVC框架,用于处理业务逻辑和控制应用程序流程。 在EXT中,文件上传通常通过EXT.form.FileField组件实现,这...

    Ext_struts2

    Ext_struts2是一个结合了Ext JS前端框架与Struts2后端MVC框架的整合应用,旨在提升Web应用的用户体验和开发效率。Struts2是一个强大的、基于Java的开源MVC框架,它提供了模型-视图-控制器模式的实现,以帮助开发者...

    ext json struts 完整无错源码

    深入研究这些源码,你可以了解到如何配置 Struts 的 XML 配置文件,如何编写 Action 类,以及如何在 EXT 中定义组件和数据源,以及如何利用 EXT Direct 实现前后端通信。 总结来说,"ext json struts 完整无错源码...

    ext + struts2 例子

    结合EXT和Struts2,开发者可以创建出高度交互、功能丰富的Web应用。在标题描述的示例中,开发者可能使用EXT构建前端界面,包括树形视图、表格视图和选项卡导航,而Struts2负责接收并处理前端发送的请求,包括文件...

    ext+struts+spring小例子

    在整合EXT JS、Struts和Spring的项目中,通常会通过Ajax通信将EXT JS的前端交互与后台的Struts或Spring MVC进行对接。当用户在EXT JS界面执行操作时,如点击添加图书按钮,EXT JS会发送一个Ajax请求到服务器,Struts...

    Ext+Struts2的学生成绩管理系统

    总之,"Ext+Struts2的学生成绩管理系统"是两种技术的完美结合,既实现了富客户端的交互体验,又保证了后端的稳定和高效。对于学习者来说,这个项目不仅提供了实践平台,也是深入理解这两种技术的绝佳案例。

    EXT+STRUTS2 经典例子

    EXT 和 Struts2 是两种广泛使用的 Java Web 开发框架,它们在构建动态、交互式的用户界面和处理服务器端业务逻辑方面都有出色的表现。EXT 主要是前端的 JavaScript 框架,提供丰富的组件库和强大的数据绑定功能,而 ...

    Ext简单后台交互(struts2+ibatis2+mysql5.5)

    标题中的“Ext简单后台交互(struts2+ibatis2+mysql5.5)”指的是一个基于Web开发的示例项目,它使用了以下技术栈: 1. **Struts2**:Struts2是一个用于Java Web应用的开源MVC框架,它提供了模型-视图-控制器(MVC...

    SSI+EXT (Struts2+Spring+Ibatis+Ext)

    这个框架集合了Struts2作为MVC框架,Spring作为依赖注入和事务管理工具,Ibatis作为持久层解决方案,以及Ext JS作为前端用户界面组件库。下面我们将详细探讨这些技术以及它们在项目中的应用。 **1. Struts2** ...

    GWT+EXT+STRUTS2+Eclipse完整范例.rar

    这个压缩包内的“Eclipse_Ext_Tutorial”可能是一个关于如何在Eclipse中配置和使用EXT JS的教程,而“GWT+EXT+STRUTS2”可能是实际的项目源码,展示如何在同一个应用中整合这三个技术。 通过学习这个范例,开发者...

    ext struts2 swfupload 跨域文件上传

    总结起来,"ext struts2 swfupload 跨域文件上传"是关于如何使用EXTJS构建前端界面,结合Struts2处理服务器端逻辑,利用SwfUpload的跨域能力实现文件上传的一种解决方案。这个过程中涉及的技术包括JavaScript编程、...

Global site tag (gtag.js) - Google Analytics