首先声明:该文从我自己的网易博客“敏敏的博客”(现已不再更新)整理过来,仍属原创。
-------------------------------------------------------------------------------------------------------------------------------------------------
经过暑期两个月对ssh2的学习和OA项目的实战训练,我对J2EE技术中著名的三大框架ssh2已渐渐有所理解和掌握。从搭建ssh2框架环境开始到写出第一个简单的ssh2登陆程序,到最后整个OA项目的实战, 期间遇到了重重困难和阻碍, 就连搭建环境就花了整整一天的功夫,而成功运行第一个ssh2程序更花了好几天,当然我相信这是大部分学习ssh2这门技术都会经历的过程,相信也是每个程序员学习任何一门新的技术都会走的路程。如今,项目已成功收尾,在这欣喜之余,我也愿意将我学习ssh2中遇到的一些常见异常问题总结如下,希望大家可以少走一些弯路,或者在遇到问题时可以及时解决。
原因:是JAR包的冲突,包 antlr2.7.2 与 antlr2.7.6 冲突(一个是tomcat下的包,一个是自己引入ssh2的包)
解决方案:删除包antlr2.7.2 即可,具体方法:
在MyEclipse下,windows-->preferences-->在文本框中搜索struts2-->选择antlr2.7.2-->remove
或者直接在tomcat该应用的目录WEB-INF\lib 删除 antlr2.7.2.jar
原因:空指针异常产生的主要原因如下:
(1) 当一个对象不存在时又调用其方法会产生异常
obj.method() // obj对象不存在
(2) 当访问或修改一个对象不存在的字段时会产生异常
obj.method() // method方法不存在
解决方案:调试,找出异常产生的具体原因,再根据具体原因具体解决
原因:struts2的过滤器映射路径写错
解决方案:在web.xml中配置struts2的过滤器如下:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:<url-pattern>这里一定要是 /*
(JDBCExceptionReporter.java:101) - Unknown type '246 in column 2 of 6 in binary-encoded result set.
原因:用mysql数据库时,某些字段值使用类型decimal、bigint等
解决方案:用mysql数据库时,避免字段值用decimal、bigint等,否则用hibernate执行hql语句时就会出现上面的异常
原因:经过action跳转后页面的路径改变了,不是你页面存放路径
解决方案:最好用绝对路径来引入css和js,如引入css可用
<link href="${pageContext.request.contextPath}/css/css.css" rel="stylesheet" type="text/css" />
PS:也可使用项目名称来作为绝对路径,如项目名称为OA,则上面引入也可如下:
<link href="/OA/css/css.css" rel="stylesheet" type="text/css" />
似乎更简介,但个人不推荐使用,因为一旦你的项目名更换后,所有页面中的OA都要跟着替换,十分繁琐。
原因:初学struts2,在头脑中一直在想一个问题,就是对于struts2 ,当应用其自身的标签时,例如:
<s:form>
<s:textfield name="a"></s:textfield>
</s:form>
当查看源代码时为:
<form>
<table>
<tr><td><input type="text" name=a/></td></tr>
</table>
</form>
自动添加了table tr td 标签,所有不能一行显示多个文本框。
解决方案:在struts2中加入了theme(主题)的概念,通过设置不同的主题,可以让struts的代码输出不同的html代码,你也就相应得到不同的布局效果。
疑问1、Struts2有哪些主题?
Struts2提供了三种主题,ajax, simple, xhtml,它默认的是xhtml主题,当然你可以写任意个你自己的主题,我们称之为自定义主题
疑问2、Struts2主题怎么改?
有两种方法可以解决.
1.简单的方法(也很实用)
在Struts.xml中,加上下一行代码就可以了
<constant name="struts.ui.theme" value="simple" />
代表所有的页面采用的都是 simple主题了,这时它输出的页面,不回添加任何多余的代码,比如 table tr td 等,我们就可以像其他编辑页面的方式编辑页面的风格。
或者 在 <s:form 中添加 theme
<s:form theme="simple"></s:form>
struts2每个标签都有theme属性
2.自定义 theme,还未研究》。。。。
原因:hibernate配置错误
解决方案:Hibernate中设置事务自动提交
即在Hibernate配置文件中进行如下设置 :
<property name="connection.autocommit">true</property>
(<!-- 设置事务自动提交(默认为false,false的话,程序对数据库的操作都不会作为事务提交) -->)
一切就OK了。
原因如下:
@Resource(name="userDao")
protected UserDaoImpl userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
原来在定义Dao时,没有用接口,而直接使用的是Dao的实现类
解决方案:改为如下:
@Resource(name="userDao")
protected UserDao userDao;
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
问题得到了解决
原因:对于自增字段的主键通常不能自动将值传递到页面,即在更新时缺少主键,需要手动设置
解决方案:在页面中加上下面这句即可:
<s:hidden name="book.bookId"></s:hidden>(不会在页面显示出来,但值传递过来了)
解决方案:使用img标签的onerror属性来处理默认图片,示例如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>替换示例</title>
</head>
<body>
<img id="img" src="001.jpg" onerror="showerrimg(this);" >
<script language="JavaScript">
function showerrimg(obj){
var errorimg = "error.jpg";//替换图片地址
obj.src = errorimg;
}
</script>
</body>
</html>