EXTJS4.0.7开发积累(2)

EXTJS4.0.7开发积累
有从网络上搜索到的资源,也有自己开发中的总结,侵权告知删除!

注意

var ta="'"+4+"'";

如上的表达式,在Ext.Array.remove中没用

var str='-1,2,3,4';

var arr=str.split(',');

console.info('arr:'+arr.toString());

varta=eval("'"+4+"'");

vararr1=Ext.Array.remove(arr,ta).toString();

console.info('arr new:'+arr1);

xtype:'hidden'

hidden:true

两中类型的区别

hidden类型取值要注意

if(form.down('#action_type').getValue()=='popuppage'){

    win.parentwindow.down('#popup_page_id').setValue(form.down('#popup_page_id').getValue());

}

如上代码,如果[#popup_page_id]代表的控件不是hidden类型,而是hidden:true,那么尽管有value:-1的设置,getValue()后只能获得null值,不能获得-1

java的eval

JDK自带的类可以实现调用JS的功能,可以实现执行字符串中的运算公式的功能。


public classrunString { 

    static ScriptEngine jse = newScriptEngineManager().getEngineByName("JavaScript"); 

 

    /**

     * @param args

     */ 

    public static void main(String[] args){ 

        String strs ="1+1*2+(10-(2*(5-3)*(2-1))-4)+10/(5-0)"; 

        try { 

            System.out.println(jse.eval(strs)); 

        } catch (Exception t) { 

       

   

注意:如果公式中存在变量作为运算的元素的话,可以借鉴使用replaceAll()方法将相应的变量替换成实际的数值。如果是多个变量可以利用循环遍历的方式来解决。

例子:jse.eval("1+b".replaceAll("b",b.toString()));

(a >= 0 && a <= 5)

a是变量

jdk1.6中可以直接这样用

import javax.script.*;

public class TestScript {

    public static void main(String[] args)throws Exception {

        String str = "(a >= 0&& a <= 5)";

        ScriptEngineManager manager = newScriptEngineManager();

        ScriptEngine engine =manager.getEngineByName("js");

        engine.put("a",4);

        Object result = engine.eval(str);

       

        System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);

    }

}

取消column定义设置的unique属性

字段定义:treeId   varchar(256) unique not null

取消方法:alter table menutree drop indextreeId;

 

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

mysql 767 Bytes

[ERROR 1071 (42000): SpecifiedKey was too Long; Max Key Length is 767 Bytes]

example

CREATE TABLE department

 (

    id INT,

    name VARCHAR(1000)

  );

ALTER TABLE department

 ADD PRIMARY KEY (id, name);

                                  

ERROR 1071 (42000) at line 8: Specifiedkey was too long; max key length is 767 bytes[alter table department  engine=innodb;也会报相同的错误]

 

Cause

The maximum key length for theMySQL database for InnoDB Engine is 767 bytes. The key length includes the sumlengths of all the columns included in the key.

Solutions

There are several solutions forthis issue:

Changing the size of somecolumns. For example, if VARCHAR(300) is used tostore last names, you can reduce its size to 100 with minimal risk of dataloss.

Specifying the partial column length for the charactercolumns in the key. For example, for VARCHAR(1000) column, you canspecify only 100 characters to be used in the key.

避免用户重复提交的实现方法

一:采用Ext.MessageBox.wait('后台正在执行...','请稍候...');方法,不使用Ext.LoadMask方法,不使用form.submit的waitMsg方法。

LoadMask有被控件自身使用(类似grid/chart等),使用Ext.MessageBox.wait好区分开
Ext.MessageBox=Ext.Msg(两者是同一个东西,写法不一样而已)
Ext.Msg是Singleton instance of Ext.window.MessageBox.
前面有“正在执行”的提示框,如果执行完成后,有完成提示,都不用代码执行前面“正在执行”的隐藏或者关闭,因为是单实例对象,会被后面的完成提示覆盖和重写。

执行完成没有完成提示的,需要代码关闭“正在执行”的提示

二:form.submit里面有waitMsg : 'Loading...' 也可以实现同样的功能,但是英文,title是英文的,为统一样式,不使用submit的该属性。

三:当完成提示关闭后,再想显示前面的“正在执行”提示,会报错误的,Ext.Msg对象已经不存在了

Ext.form.FormPanel 中的 form.submit有一个   waitMsg:'正在操作,请稍后...' 属性可以做到这个效果.
那么Ext.Ajax.request可以通过设置什么属性来做到这个效果呢?  waitMsg不行..
Ext.Ajax.request的前一行执行Ext.MessageBox.wait('正在操作','请稍后...');

Ext.Ajax.requestcallback方法中第一行执行Ext.MessageBox.hide();


退出时

在Ext.Ajax.request直接跳转到登录页面

Ext.Ajax.request({

                 url:'logout.action',

                callback:function(options,success,response) {

//                  var respText =Ext.JSON.decode(response.responseText);

     //             Ext.Msg.alert('提示',respText.message,function(){

     //                   location.href='/beimi/index.html';

     //                });

                 window.location.href='/beimi/index.html';

//                  Ext.Msg.show({

//                         title:'退出成功',

//                         msg: respText.message,

//                         buttons: Ext.Msg.OK,

//                         icon: Ext.Msg.INFO

                         fn:function(){

                          location.href='/beimi/index.html';

                          }

//                  });

                 }

             });

 

1:不用alter,样子太难看

2:不显示退出成功提示,基本看不到,没有必要保留这段代码了

3:show点击后也可以跳转到登录页面,但点击前页面上的信息还再,不安全

4:request返回后就直接重定位到登录界面,安全高效

Ext.Array.merge

Ext.Array.union

merge&union相同功能

var x_array=[

              {'action_type':1},

              {'action_type':2},

              {'action_type':3}

        ];

 var y_array=[

               {'action_type':1},

               {'action_type':2},

               {'action_type':3}

         ];

 

 var arr= Ext.Array.merge(x_array,y_array);

 for(var key=0 in arr){

 console.info('arr:'+key+':'+arr[key].action_type);

 }

输出123123

 

var x_array=[

              1,2,3

        ];

 var y_array=[

              1,2,3

         ];

 

 var arr= Ext.Array.merge(x_array,y_array);

 for(var key=0 in arr){

 console.info('arr:'+key+':'+arr[key]);

 }

输出123

 

比较上面两段代码,{'action_type':1}以对象方式处理,所以尽管有两个{'action_type':1}也不可能相同,纯数字就不同了。

前台中文查询条件处理

1、需要到db层的查询

2、不需要的db层的查询

1、condition=CommUtils.getUTF8str(getRequest().getParameter("condition"));

2、condition=getRequest().getParameter("condition");

注:getUTF8str转换new String(str.getBytes("ISO-8859-1"),"UTF-8");

1用于前台获取的中文字符要到数据库查询

2是前台获取的中文字符不需要到数据库查询,在数据库外的list对象中使用contains查询

mysql事务

service同层之间不要调用

DAO可以和SQL合并为一个Service,事务共享



默认情况下,mysql使用innodb引擎,但是建表默认情况下是使用不支持事务的MyISAM。如果需要对表的操作支持事务,比如通过jdbc。那需要建表中指定innodb引擎,比如:
create table USERS ( ID int not null auto_increment, NAME varchar(100) not null, BIRTHDAY date, PHOTO longblob,primary key(ID) )engine=innodb;
针对已经创建的表,可以:
ALTER TABLE USERS TYPE=INNODB;
另外,可以通过以下命令查看全局事务隔离级别:
SELECT@@global.tx_isolation;
或者,查看会话事务隔离级别:
SELECT@@tx_isolation;
在使用事务的时候,如果是通过命令行工具,需要先关闭自动提交:
setautocommit=off;
 
1 查看系统支持的存储引擎
show engines;
2 查看表使用的存储引擎
两种方法:
a、show table status from db_name where name='table_name';
b、show create table table_name;
如果显示的格式不好看,可以用\g代替行尾分号
有人说用第二种方法不准确,我试了下,关闭掉原先默认的Innodb引擎后根本无法执行show create table table_name指令,因为之前建的是Innodb表,关掉后默认用MyISAM引擎,导致Innodb表数据无法被正确读取。
3 修改表引擎方法
alter table table_name engine=innodb;
4 关闭Innodb引擎方法
关闭mysql服务: net stop mysql
找到mysql安装目录下的my.ini文件:
找到default-storage-engine=INNODB 改为default-storage-engine=MYISAM
找到#skip-innodb 改为skip-innodb
启动mysql服务:net start mysql
 
通过实验,可以有如下:
把每个表的engine由MyISAM修改iinodb后就可以支持事务。
事务配置在service方法上时,不要调用同层的service非法。尽管事务嵌套事务,最里面的事务依然是单独提交,和外面的事务没有关系。
jdbcDAO执行的sql语句可以和DAO的合并在一个service方法里面执行,配置在service方法上的事务控制可以统管sql语句事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值