struts2.1.8+hibernate2.5.6+spring3.0常见异常原因息争决方案
副标题#e#
颠末暑期两个月对ssh2的进修和OA项目标实战练习,我对J2EE技能中著名的三大框架ssh2已徐徐有所领略和把握。从搭建ssh2框架情况开始到写出第一个简朴的ssh2登岸措施,到最后整个OA项目标实战, 期间碰着了重重坚苦和阻碍, 就连搭建情况就花了整整一天的工夫,而乐成运行第一个ssh2措施更花了好几天,虽然我相信这是大部门进修ssh2这门技能城市经验的进程,相信也是每个措施员进修任何一门新的技能城市走的旅程。如今,项目已乐成收尾,在这欣喜之余,我也愿意将我进修ssh2中碰着的一些常见异常问题总结如下,但愿各人可以少走一些弯路,可能在碰着问题时可以实时办理。
PS:我的编程运行情况是MyEclipse8.6 + Tomcat6.1.3 + MySql
问题一:呈现异常 java.lang.NoSuchMethodError: antlr.collections.AST.getLine()问题
原因:是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
问题二:异常java.lang.NullPointerException
原因:空指针异常发生的主要原因如下:
(1) 当一个工具不存在时又挪用其要了解发生异常
obj.method() // obj工具不存在
(2) 当会见或修改一个工具不存在的字段时会发生异常
obj.method() // method要领不存在
办理方案:调试,找出异常发生的详细原因,再按照详细原因详细办理
问题三:异常The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. – [unknown location]
原因:struts2的过滤器映射路径写错
办理方案:在web.xml中设置struts2的过滤器如下:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
留意:<url-pattern>这里必然要是 /*
问题四:org.hibernate.util.JDBCExceptionReporterorg.hibernate.util.JDBCExceptionReporter.logExceptions
(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的样式引入不能应用
原因:颠末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的标签<s:textfield />时,不能在一行显示多个文本框(一个textfield占一行)
原因:初学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代码,你也就相应获得差异的机关结果。
#p#副标题#e#
疑问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,还未研究》。。。。
#p#分页标题#e#
问题七:通过页面表单提交一些要修改数据库中数据的操纵,表单提交之后,措施运行一切正常,并且,靠山也打印出了sql语句,譬喻:insert into SYS.HNCITEM05 (SNAME, BATE, SONO, SDATE, SNO) values (?, ?, ?, ?, ?),可是,数据库中却查不到适才插入的数据。就是说:数据并没有真正写入数据库。
原因:hibernate设置错误
办理方案:Hibernate中配置事务自动提交
即在Hibernate设置文件中举办如下配置 :
<property name="connection.autocommit">true</property>
(<!– 配置事务自动提交(默认为false,false的话,措施对数据库的操纵都不会作为事务提交) –>)
一切就OK了。
问题八:异常Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named ‘userDao’ must be of type [com.changetech.dao.impl.UserDaoImpl], but was actually of type [$Proxy16]
原因如下:
@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;
}
问题获得了办理
问题九:更新时报错 (The given object has a null identifier)
原因:对付自增字段的主键凡是不能自动将值通报到页面,即在更新时缺少主键,需要手动配置
办理方案:在页面中加上下面这句即可:
<s:hidden name="book.bookId"></s:hidden>(不会在页面显示出来,但值通报过来了)
问题十:js实现图片不能显示时利用替换图片显示
办理方案:利用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>
问题十一:MyEclipse中修改项目名称后,如何从头陈设到 tomcat?
办理方案:首先修改工程名(直接按F2即可),然后选择工程名–右键–Properties–MyEclipse–Web–把Web Context-root的名字改成新的项目名称, 再把tomcat的工程删除了,最后从头陈设下即可。
问题十二:在jsp页面顶用request方法向struts的action中通报不了中文参数,譬喻下面代码:
<silver;mso-highlight:silver;mso-font-kerning:0pt;" > a href="findBooksByConditionAction.action?page=<s:property value="%{pageBean.currentPage+1}" /> &property=0pt;" ><%=session.getAttribute(0pt;" >"property")mso-font-kerning:0pt;" >%>&condition=mso-font-kerning:0pt;" > <%=session.getAttribute(mso-font-kerning:0pt;" >"condition")color:#BF5F3F;mso-font-kerning:0pt;" >%> &category=0pt;" ><%=session.getAttribute(0pt;" >"category")mso-font-kerning:0pt;" >%>&subCategory=mso-font-kerning:0pt;" > <%=session.getAttribute(mso-font-kerning:0pt;" >"subCategory")color:#BF5F3F;mso-font-kerning:0pt;" >%>0pt;" >" class="right-font08">下一页</background:silver;mso-highlight:silver;mso-font-kerning:0pt;" >amso-font-kerning:0pt;" >>
这样通报已往的中文是乱码。
办理方案:放在input文本域内里通报已往,即
<input type="hidden" name="condition" value="<%=session.getAttribute("condition")%>" /> <input type="hidden" name="category" value="<%=session.getAttribute("category")%>" /> <input type="hidden" name="subCategory" value="<%=session.getAttribute("subCategory")%>" /> <input type="hidden" name="property" value="<%=session.getAttribute("property")%>" />
然后直接
<a href="findBooksByConditionAction.action?page=<s:property value="%{pageBean.currentPage+1}" />"class="right-font08">下一页</a>
#p#分页标题#e#
但发明值竟然没有传已往(空指针报错),经问同过后知道,要想input里的值传已往必需提交表单才可,仅回收这种超链接方法举办跳转的值是传不外去的,于是将超链接换为
<a href="javascript:queryByConn(‘<s:property value="%{pageBean.currentPage+1}" />’);" class="right-font08">下一页</a>
js中相应加上该函数的实现:
function queryByConn(page) { document.bookForm.action="findBooksByConditionAction.action?page="+page; document.bookForm.submit(); }
在js中将表单提交即可,这样乱码问题就办理了。
问题十三:hibernate中呈现异常:
org.hibernate.LazyInitializationException: could not initialize proxy – no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
原因:hibernate设置中 many-to-one的默认选项是 lazy = "proxy"
办理要领:<many-to-one> 及 <set> 中配置 lazy="false"即可
问题十四:如何成立svn处事器
办理方案:首先虽然要安装客户端svn(小乌龟TortoiseSVN )和处事器端svn(Subversion),然后在呼吁行下输入以下呼吁:
1、svnadmin oa(oa是存放各个版本信息的文件夹名称,自界说)
2、svnserve –d –r oa(打开svn处事器)
PS:大概碰着的问题
authorized failed(权限认证失败)
办理方案:在oa目次下找到passwd文件,在内里加上几个用户
用户名=暗码(本身界说用户名和暗码)
并将svnserve.conf里的password-db = passwd这句前面的#去掉即可(前面不能留有空格)