貌似好几天都没有总结错误了,有两方面的原因,第一:万事开头难,后面会顺利很多,因此碰到的错误就少了;第二:后面碰到的问题一般都比较难,还没有结束。不过,估计以后会有很多错误的,先做好心理准备,这不今天就来了
想做的好一点的系统,统计图表那是必须的,如果是用就是就是jsp做的话,那就简单了,jfreechart以来全搞定,但是........我现在是用ExtJs,想着去年出的4.0版本自带图表功能,就不需要用第三方包了,于是下了一个ExtJs4.1版本,学习了一下图表的做法,发现也很简单的,于是就自己写了一个,谁想出乎我的意料啊,4.X版本居然不兼容2.X版本,呜呼.......这不是坑我吗,难道要让我推倒重来吗,显然不可能,看来只能因循守旧,用第三方jar包了。这个不着急,先来看看其他的问题
1.ExtJs和spring、hibernate一起时的分页问题
之前做系统的时候没有涉及到分页,第一次做分页,第一反应就是select top ........,可是,oracle居然没有top子句,要用的话只能用其他语句代替了,看了一下太麻烦了,就想着直接在前台分页得了,可是貌似没成功,好吧,这个时候突然发现用hibernate来做分页特别简单,只需要区区3句代码,如下:
Query q = session.createQuery("from table"); q.setFirstResult(0); q.setMaxResults(10); List l = q.list();如果是有spring,dao继承自HibernateSupportDao的话,那就如下:
/** * 使用HQL语句进行分页查询操作 * offset 第一条记录的索引 * pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final int offset, final int pageSize){ List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { List result = session.createQuery(hql).setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; }而extjs页面只需要这样
/** * 使用HQL语句进行分页查询操作 * offset 第一条记录的索引 * pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ public List findByPage(final String hql, final int offset, final int pageSize){ List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { List result = session.createQuery(hql).setFirstResult(offset) .setMaxResults(pageSize) .list(); return result; } }); return list; }碉堡了,有木有,太强大了,震撼中................
2.struts跳转访问jsp页面与直接访问jsp页面的区别
之前做项目是为了加快速度,因此就跳过了登录模块,直接去请求index.jsp页面,功能都做的差不多的时候把登录模块和index页面整合到一起的时候出现错误了,之前心想着不就是struts跳转一下吗,结果做起来之后才发现,struts跳转过去之后index页面加载的东西都找不到,可是明明直接访问index页面的时候好好的,仔细想了一下之后才发现,原来两者是有区别的,从struts跳转是从外到里加载文件,而直接访问index的话,是从里到外加载文件,出发点不同导致了路径不同
3.DWR框架出现erro弹出框问题
这两天毕业设计只剩下两个技术难点了,一个是权限管理,一个是统计图表。对于权限管理,难点在于在js文件里取到权限值,一般用ajax就可以返回data,但是为了使自己的毕设有技术含量,遂决定采用全新的dwr框架,这样也有挑战性一点,可谁曾想一个error弹出框居然花了我两天的时间,呜呼,这挑战性代价也太大了吧,不过还好总算是出来了,先庆祝一下哈!如下就是那个error弹出框所对应的的http响应(这里我想说的还是那句话,要主动去找错,就像这次,除了弹出一个error对话框之外,myeclipse没有保存,firefox没有报错,即使是用firebug,控制台什么的都没错,最后居然是在网络下的XHR里面的请求连接下响应里面才找到的,不容易啊,就这一个线索,居然会藏这么深,这是考验我的编程经验哈)废话不说了,如下图所示
经历了这个错误,发现自己对于百度和google的依赖性太强了,以至于有多个错误出现的时候没能分析出错误的根本原因,而是一股脑的就去百度或者google了,而且不巧的是,dwr这个框架的信息在网络上很有限,用汉语表述的就更少了,以至于只能一直头皮看英语的了。
网上对于这个问题都集中在dwr和spring的结合上,当时我就在想,我不结合可以吗,我不就是想用一下吗,有必要这么麻烦吗?但是网上都这么说,再加上自己也没什么好方法,也就只能试一下了,废了好半天把dwr和spring结合在一起了,一运行,还是一样的error,继续搜索,结果有人说如果在spring总遇到了aop(面向切面编程),结合的时候又多出一些东西,好吧,那就这能再加东西吧,好不容易整合好了,一运行,还是那个熟悉的error,此时真有点绝望了,一天就这样过去了,洗洗睡吧。
今天早上起来,重新审视这个问题的时候,发现自己有点“当局者迷了”,何不跳出当前的困境,静下心来想想,而不是被网络所左右想到这里,果断关掉搜索框,静静的看着这个错误,开始分析,既然弹出error,那么在什么地方产生这个error的呢,上图中很明显,javaClassName:java.lang.Throwable,message:error,而对比那些成功的项目,这个地方出现的应该是你要获得的值,也就是说你的这个值出现问题了,而在程序当中值出现问题,无非两种情况,null和类型转换出错,既然这样,那我们就一一试验,首先测试了一下目标值,非空,再看类型,由于在oracle数据库中这个字段是序列的,为number类型,映射到java中就是bigdecimal,而这个值在java中不太常见,会不会是这儿出错了?那就直接转换成string类型得了,结果还是error,那就换成最常见的int吧,结果.....结果就没有error了,成功了!这一刻不容易啊,写下来,纪念一下。等等,突然发现自己return的时候已经限定成了integer类型,天啊,瞬间感觉自己有多傻了,唉,时间已经浪费了,只能以此为教训了。
废话不说了,下面就把配置dwr的过程写一下,做个备份吧
第一步:dwr.jar(如果要与spring结合的话,还需要spring-web-servlet.jar)
第二步:配置web.xml
<!--dwr框架设置 --> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>第三步:配置dwr.xml(一般与web.xml同一目录级别)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create javascript="Permission" creator="new">//这里的javascript是之后自动生成的js文件名,保持一致就可以了, //creator如果是和spring结合的话就选spring,name就是beanName了 <param name="class" value="com.shiep.dwr.Permission"></param>//如果不和spring结合那就name是class了, //value的话就是你要调用的java方法所在的类了 </create></allow> </dwr>第四步:编写上文提到的java方法
package com.shiep.dwr; import javax.servlet.http.HttpSession; import org.springframework.context.ApplicationContext; public class Permission { public int getIdRole(HttpSession session){ return (Integer) session.getAttribute("idRole"); } }第五步:html或者jsp页面引入dwr的js文件
<script type='text/javascript' src='../dwr/interface/Permission.js'></script>//这里就是自动生成的js文件,名字与dwr.xml中的保持一致就可以了 <script type='text/javascript' src='../dwr/engine.js'></script>第六步:在js页面调用java方法
var idRole; DWREngine.setAsync(false); Permission.getIdRole(load); DWREngine.setAsync(true); function load(data) { idRole = data; } alert(idRole);OK!至此一切搞定!