5
回答
extjs和struts、json的整合
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
导读:

利用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 = "" + xml + "" else xml = "" + xml + ""

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 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 formsExt.form.XmlErrorReader = function(){

Ext.form.XmlErrorReader.superclass.constructor.call(this, {

record : 'field',

success: '@success' }, emi7.com [

'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://sdn.net /TrackBack.aspx?PostId=1677366
举报
红薯
发帖于9年前 5回/2K+阅
共有5个评论 最后回答: 6年前
我想请问,我在使用extjs整合struts2,他们交互的时候都是用json的,但我在struts2返回数据给ext的时候只能返回一个数组才能获 取,如果我返回一个对象数组就不行好比如下json:[used:false, op:[{id:1,name:'asd'}],user:[{id:'2',name:'asd'}]],里面的关系就不写了,里面user和op都是 一个对象组,这样我在ext就获取不到我想要op或user,当然我也希望他们可以分开传递,但我试过在struts。xmlzhong配置两个数组的返 回值就错误了,请问怎么弄呢?还有我想请问假如我返回的数据如下json:[op:[{op:[{}]}]],我需要的有效部分是op下的,但我怎么都获 取不到,用json也不能获取到,只能将其json改成op才行,请问有什么办法可以判断我的有效数据呢

引用来自“229594146”的答案

我想请问,我在使用extjs整合struts2,他们交互的时候都是用json的,但我在struts2返回数据给ext的时候只能返回一个数组才能获 取,如果我返回一个对象数组就不行好比如下json:[used:false, op:[{id:1,name:'asd'}],user:[{id:'2',name:'asd'}]],里面的关系就不写了,里面user和op都是 一个对象组,这样我在ext就获取不到我想要op或user,当然我也希望他们可以分开传递,但我试过在struts。xmlzhong配置两个数组的返 回值就错误了,请问怎么弄呢?还有我想请问假如我返回的数据如下json:[op:[{op:[{}]}]],我需要的有效部分是op下的,但我怎么都获 取不到,用json也不能获取到,只能将其json改成op才行,请问有什么办法可以判断我的有效数据呢

简单提取问题是

一、怎么让struts2可以返回多个list(就是多个对象组或不同类型的参数)呢?

二、第二个问题不知道怎么简略还是给例子吧

store中的代理中root是外层判断有效值,内层op才是真正的数据呢

proxy : {
        type : 'ajax',
        reader : {
            type : 'json',
            root : 'items'//这个是一般我们用来判断json数据中有效节点的地方,假如里面有个op或children,里面的数据菜是我需要的,这些标签之上的不是
        },
        writer : {
            type : 'json'
        }

顶部