毕业设计之错误集锦(八)

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语句

如下是查找不同时间

毕业设计之错误集锦(八)_第1张图片

如下是按照时间(月份)来统计

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');

毕业设计之错误集锦(八)_第2张图片

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;
					}
				});
	}

结果一执行,什么也没发生,就像没执行过一样,设置断点之后才发现出现如下错误

毕业设计之错误集锦(八)_第3张图片

不能执行?不对啊,我直接复制sql语句可以在oracle中正常执行的,为什么放在java中就不行了呢?搞了两个过小时之后找到了答案,结果让我大跌眼镜,居然是sql‘语句多了一个分号,而在oracle中有分号是可以执行的,而在java中它会把分号当初sql语句的一部分去翻译,结果翻译到oracle中时,sql语句已经不是原来可执行的sql语句了。好吧,程序员伤不起啊,一波未平一波又起,之后可以执行,查出了数据,但是又发生如下错误

毕业设计之错误集锦(八)_第4张图片

这是由于数据库中查出来的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

毕业设计之错误集锦(八)_第5张图片
起初我以为是因为我觉得从数据库里查出来的百万级别的数据,故int类型会溢出,因此用bigdecimal会好一点,但是谁曾想就是这个想法害的我以为是myeclipse出错了呢,原因是这样的,我看到这个错误之后就直接在数据库的sql语句上把查询出来的结果除了一百万,这样出来用int就可以了,可是之后不管我怎么重启tomcat,重新部署项目,报的错还是上边的那个,我误以为myeclipse为什么不更新代码,后来实在没办法的时候,仔细想了一下,哦,原来这个是数据库自己映射过来的,我查询的字段类型是number类型,java会自动转换成逼供的bigdecimal类型的,不管这个数值的大小,我和java的这个相同行为,是我误以为是我自己转换的bigdecimal无法消除了,才去怀疑myeclipse的,而这个问题说到底就是不能强之外转换,从bigdecimal到string可以用toString方法或者string.valueOf方法,但是不能直接强制转换。

你可能感兴趣的:(java,毕业设计)