当前位置: 代码迷 >> JavaScript >> Extjs4 store load 有中文字符提交后台乱码解决办法
  详细解决方案

Extjs4 store load 有中文字符提交后台乱码解决办法

热度:549   发布时间:2012-08-21 13:00:22.0
Extjs4 store load 有中文字符提交后台乱码解决方法

?????? 最看到Exjs4很多改进的相关信息,产生用用看的想法。所以就着手4.x方面的学习。在学习的过程当中发现4.x 相对以前版本存在很多的差别。baidu或谷歌一下有一大堆讲解。 参考一些资料后着手4.x的学习与开发。本人是参照官方MVC例子着手学习的。开发一个基于java后台的增、删、改、查的例子。在做增加、更改、查询时都没有出现乱码情况。以下是增加与更改的ext代码:

Ext.define('W.gzgl.views.common.MenuAddPanel',{
	extend 		: 'Ext.window.Window',
	layout		: 'fit',
    resizable	: true,
	width		: 400,
	height  	: 300,
	title		: '菜单增加',
	closeAction : 'close',
	initComponent : function(){
		this.items = this.buildItems(this);
		this.callParent();
	},
	buildItems  : function(form){
			
		return Ext.create('Ext.form.Panel', {
	        bodyPadding		: 5,
	        border 			: false,
	        waitMsgTarget	: true,
	        fieldDefaults	: {
	            labelAlign	: 'right',
	            labelWidth	: 85,
	            msgTarget	: 'side'
	        },
			bodyStyle 		: "border-bottom: 1px solid #8db2e3;",
	        items: [{
	            xtype		: 'fieldset',
	            title		: '菜单增加',
	            defaultType	: 'textfield',
	            defaults	: {
	                width: 280
	            },
	            items		: [{
	                    fieldLabel	: '菜单序号',
	                    emptyText	: '请输入...',
	                    allowBlank	: false,
	                    name		: 'id'
	                },{
	                    fieldLabel	: '菜单名',
	                    emptyText	: '请输入...',
	                    allowBlank	: false,
	                    name		: 'name'
	                }, {
	                    fieldLabel	: '加载组件名',
	                    emptyText	: '请输入...',
	                    name		: 'componetName'
	                }, {
	                    fieldLabel	: '样式',
	                    name		: 'iconCls'
	                }, /*{
	                    fieldLabel	: '父菜单',
	                    name		: 'parentId'
	                    
	                }*/
	                Ext.create('W.gzgl.componet.common.select.MenuSelect',{
	                	fieldLabel	: '父菜单',
	                	name		: 'parentId'
	                })
	                ,{
	                    xtype		: 'radiogroup',
		                fieldLabel	: '是否叶子',
		                defaults	: {
		                    name	: 'leaf'
		                },
		                items		: [{
		                	//checked		: true,
		                    inputValue	: 'true',
		                    boxLabel	: '是'
		                }, {
		                    inputValue	: 'false',
		                    boxLabel	: '否'
		                }]
	                },{
		                xtype		: 'radiogroup',
		                fieldLabel	: '是否启用',
		                defaults	: {
		                    name: 'visible'
		                },
		                items		: [{
		                	//checked		: true,
		                    inputValue	: 'true',
		                    boxLabel	: '启用'
		                }, {
		                    inputValue	: 'false',
		                    boxLabel	: '不启用'
		                }]
		            }
	            ]
	        }],
	
	        buttons: [{
	            text	: '重 置',
	            handler	: function(){
	               /* formPanel.getForm().load({
	                    url		: 'xml-form-data.xml',
	                    waitMsg	: 'Loading...'
	                });*/
	            	this.up('form').getForm().reset();
	            }
	        }, {
	            text		: '保 存',
	            disabled	: true,
	            formBind	: true,
	            iconCls		: 'icon-delete',
	            handler		: function(){
	            	var actionUrl = form.actionType === 'create' ? 'manager/menuCreate.hs' : 'manager/menuUpdate.hs';
	                this.up('form').getForm().submit({
	                	method			: 'post',
	                    url				: actionUrl,
	                    submitEmptyText	: false,
	                    waitMsg			: '数据保存中...',
	                    success 		: function(response){
	                    	Ext.getCmp(form.gridName).getStore().load();
	                    	form.close();
	                    },
	                    failure			: function(){
	                    	
	                    }
	                });
	            }
	        }]
	    });
	}
});

??以下是数据源的定义:

Ext.define('W.gzgl.stores.common.MenuStore', {
    extend    : 'Ext.data.Store',
    pageSize  : 20,
    requires  : ['W.gzgl.models.common.MenuModel'],
    model     : 'W.gzgl.models.common.MenuModel',    
    autoDestroy: true,
    autoLoad 	: true,
    proxy : {
    	type 	: 'ajax',
    	url  	: 'manager/menuList.hs',
    	reader	: {
            type		: 'json',
            root		: 'rows',
            idProperty	: 'name'
        }
    }
});

?从代码上分析是没有存在什么问题。工程或环境的编码也都为"utf-8"。

也从网络找了一些解决方法。

一、在load提交时对字符串进行decode处理。

{name : encodeURIComponent(value)}

?

然后在后端进行反编码

?

java.net.URLDecoder.decode(name, "utf-8");

?

根据这一做法确实可以解决这一问题。但是综合比较后个人认认为这不是一个很好的解决方法。这一做法就是每一个参数都需要重复上述步骤。比较烦。在对from提交与store提交对比后发现load提交默认为“get”.参考相应说明后。在数据源定义中更改method为"post".即可解决store带中文提交乱码问题。

更改后的代码:

Ext.define('W.gzgl.stores.common.MenuStore', {
    extend    : 'Ext.data.Store',
    pageSize  : 20,
    requires  : ['W.gzgl.models.common.MenuModel'],
    model     : 'W.gzgl.models.common.MenuModel',    
    autoDestroy: true,
    autoLoad 	: true,
    proxy : {
    	type 	: 'ajax',
    	url  	: 'manager/menuList.hs',
    	actionMethods: {
    		read: 'POST'
		},
    	reader	: {
            type		: 'json',
            root		: 'rows',
            idProperty	: 'name'
        }
    }
});

?

  相关解决方案