1.Ext.Ajax.request获取值
今天用到一个功能需要到action中取值到页面,就想到了Ext.Ajax.request,于是一切搞好之后,居然不显示返回值,虽然我都已经解析成json数据类型了,debug也显示action中已经取到值了,可就是发到js中就丢值了,也就是说ajax没取到值,那ajax是怎么取值的呢,也就是说ajax怎么跟后台沟通?setter和getter方法!对,这是框架的通用做法,extjs也不例外,想到这一点,赶紧看了一下自己的变量声明,结果还真是只有声明,没有提供跟外界沟通的接口,这下算是把setter和getter的作用更深入的理解了一下。关于ajax取值的方法也记录一下,如下:
//发送异步请求 Ext.Ajax.request({ url:"ApplyInfo!findReg.action",//请求地址 params:{id:id}, //参数,ids success:function(result){ //与服务器交互成功 var jsonStr = Ext.util.JSON.decode(result.responseText) idRegReview = jsonStr.idReg; Ext.MessageBox.alert("成功idRegReview",idRegReview); }, failure:function(result){ //与服务器交互不成功 var jsonStr = Ext.util.JSON.decode(result.responseText) Ext.MessageBox.alert("失败",jsonStr.msg); } });
后台action
public String findReg() throws Exception { idReg = applyInfoDao.findById(new BigDecimal(id)).getIdReg(); return this.SUCCESS; }//记住idReg对象要能有可以沟通的setter和getter!2.action类中的方法名命名问题
今天想用ajax从action中取一个字段的值出来,于是在action中写了一个如下方法
public String getUpCredit() throws Exception { to do..... return this.SUCCESS; }
结果不需要去访问这个方法的时候,这个方法也执行了,也就是说只要用到这个action类,不管你有没有调用这个方法,这个方法都会执行的,研究了半天才发现,这是java的命名习惯,因为我们写的setter和getter方法就是这样的,因此它会把getXXX和setXXX中的XXX当成是一个对象,只要访问到action这个类的时候,他就会把对象初始化,所以才发生了刚才的那一幕,因此以后再action中慎用以get或者set开头的方法名
3.could not get next sequence value; SQL [select hibernate_sequence.nextval from dual];
这个错误估计用oracle数据库的遇到的多,如果用的是非oracle数据库,只要把主键的生产方式改成非sequence类型即可;在mysql、mssql等数据库中可以直接设置主键自增,但是oracle中需要设置单独的序列来实现,这样在hibernate中主键的生成方式就是sequence类型,需要在主键生成方式的xml配置文件中配置这个sequence参数
<id name="idPermit" type="java.math.BigDecimal">
<column name="ID_PERMIT" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">PERMIT_SEQ</param>
</generator>
</id>
但是立马又出错了:
this id generator generates long, integer, short or string;悲剧啊,hibernate的主键只认识long, integer, short or string类型,不认识BigDecimal,只能换成其他的了,但是数据库不需要动了;分析了一下,在oracle数据库中用到序列的时候大家还是尽量选择varchar2()类型吧,原因有二:第一,要是用number的话,myeclipse会转换成BigDecimal类型,而这个类型hibernate不认识,而oracle数据库中又没有int类型,再者即使用long类型,hibernate认识,但是有时候序列的大小会超出long类型的范围。第二:用string的话,不管序列有多大都可以,而且string在页面与后台之间不需要转换,省去了不必要的麻烦,再者,string转其他类型是最容易的
<id name="idPermit" type="java.lang.String"> <column name="ID_PERMIT"/> <generator class="sequence"> <param name="sequence">PERMIT_SEQ</param> </generator> </id>
4.extjs字体在不同浏览器中的不同
这几天用不同的浏览器来浏览项目的时候,突然发现不同的浏览器下字体的大小会不同,例如在IE和google下都比较大,但是在firefox下却比较小,让人看得不太爽, 原来是这样:Extjs 在很多情况下使用 11px 字体,11px 大小是一种边缘字体,不同的浏览器对 11px 的渲染各不相同,IE 的渲染和12px 相似,而在 Firefox 中,则和 10px相似,导致字体在FF 中过小的问题。为了能够彻底的解决字体大小问题,直接打开ext-all.css,查找所有的11px并替换为12px,就OK了
5.oracle中的有关统计的sql语句
如下是查找不同时间
如下是按照时间(月份)来统计
select to_char(apply_time,'yyyy-mm') as time,sum(approve_quota) as total from APPLY_INFO group by to_char(apply_time,'yyyy-mm') order by to_char(apply_time,'yyyy-mm');
6.org.hibernate.exception.DataException: could not execute query
在继承HibernateDaoSupport的时候,也就是spring和hibernate结合的时候的一种方式,有些情况下不得不用原生的sql去操作,试了好久才搞出来,如下:
@Override public List<Object[]> nonPerforming() { return getHibernateTemplate().execute( new HibernateCallback<List<Object[]>>() { @Override public List<Object[]> doInHibernate(Session session) throws HibernateException, SQLException { SQLQuery query = session .createSQLQuery("select to_char(apply_time,'yyyy-mm') as time," + "sum(approve_quota)/1000000 as total from APPLY_INFO " + "group by to_char(apply_time,'yyyy-mm') " + "order by to_char(apply_time,'yyyy-mm')"); List<Object[]> results = query.list(); return results; } }); }
不能执行?不对啊,我直接复制sql语句可以在oracle中正常执行的,为什么放在java中就不行了呢?搞了两个过小时之后找到了答案,结果让我大跌眼镜,居然是sql‘语句多了一个分号,而在oracle中有分号是可以执行的,而在java中它会把分号当初sql语句的一部分去翻译,结果翻译到oracle中时,sql语句已经不是原来可执行的sql语句了。好吧,程序员伤不起啊,一波未平一波又起,之后可以执行,查出了数据,但是又发生如下错误
这是由于数据库中查出来的object类型,而我却强制转换成string类型,导致出错,注意,这里查询了两列,故是object[]数组类型。代码如下:
/* * 不良贷款额柱状图 */ public String nonPerformBarChart() throws Exception { // 设置数据 DefaultCategoryDataset data = new DefaultCategoryDataset(); List<Object[]> list = riskInfoUserDao.nonPerforming(); System.out.println("list大小"+list.size()); for (int i = 0; i < list.size(); i++) { Object[] row = (Object[]) list.get(i); data.addValue(Double.parseDouble(row[1].toString()), "不良贷款额", (String)row[0]); } chart = ChartFactory.createBarChart3D("不良贷款额", "月份", "额度", data, PlotOrientation.VERTICAL, true, true, false); return this.SUCCESS; }
心想,这下总归好了吧,但是天不遂人愿啊,又是如下错误java.math.BigDecimal cannot be cast to java.lang.String
起初我以为是因为我觉得从数据库里查出来的百万级别的数据,故int类型会溢出,因此用bigdecimal会好一点,但是谁曾想就是这个想法害的我以为是myeclipse出错了呢,原因是这样的,我看到这个错误之后就直接在数据库的sql语句上把查询出来的结果除了一百万,这样出来用int就可以了,可是之后不管我怎么重启tomcat,重新部署项目,报的错还是上边的那个,我误以为myeclipse为什么不更新代码,后来实在没办法的时候,仔细想了一下,哦,原来这个是数据库自己映射过来的,我查询的字段类型是number类型,java会自动转换成逼供的bigdecimal类型的,不管这个数值的大小,我和java的这个相同行为,是我误以为是我自己转换的bigdecimal无法消除了,才去怀疑myeclipse的,而这个问题说到底就是不能强之外转换,从bigdecimal到string可以用toString方法或者string.valueOf方法,但是不能直接强制转换。