用struts+hibernate做网站中遇到的问题与解决过程[原创]

环境:tomcat5+struts1.1+hibernate2.1

1.如果:去除web.xml,或web.xml中
action
    org.apache.struts.action.ActionServlet
 写错。
则:报错信息:
javax.servlet.ServletException: Cannot find message resources under key org.apache.struts.action.MESSAGE
web.xml在tomcat启动时读取。

2.net.sf.hibernate.MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml
如果出现这行错误说明你的hibernate的XML配置文件有错


3.net.sf.hibernate.MappingException: Resource: hibernate/Hello_Bean.hbm.xml not found
如果出现这行错误说明hibernate的XML配置文件没有找到,你应该把XML文件放在与你的类文件同个目录下,本文中是放在hibernate/classes/hibernate/目录下,也就是跟Hello_Bean.c

lass类文件一起。

4.net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean
如果出现这行错误说明你的xml文件里设置的字段名name的值与Hello_Bean.java类里的getXXX或setXXX方法不一致。

5.net.sf.hibernate.HibernateException: JDBC Driver class not found: org.gjt.mm.mysql.Driver
如果出现这行错误说明你的MYSQL驱动没有加进JB库里或者不在CLASSPATH里。

6.报错:
javax.servlet.ServletException: Exception creating bean of class cn.org.sppc.ipmanager.struts.form.LoginForm: {1}
分析:
在WEB-INF/classes中找不到相对应的LoginForm文件,或者LoginForm没有继承ActionForm类。

7.报错:
javax.servlet.ServletException: persistent class not found: User
分析:
类名User没有在User.hbm.xml文件中写上包名全称,或类持久化类没有找到。


8.报错:
javax.servlet.ServletException: JDBC Driver class not found: org.gjt.mm.mysql.Driver

[WARN] SessionFactoryImpl - -No dialect set - using GenericDialect: Dialect class not found:
   net.sf.hibernate.dialect.MySQLDialect
  
[FATAL] DriverManagerConnectionProvider - -JDBC Driver class not found:
   org.gjt.mm.mysql.Driver
  
[WARN] RequestProcessor - -Unhandled Exception thrown: class net.sf.hibernate.HibernateException

 将hibernate.cfg.xml: net.sf.hibernate.dialect.MySQLDialect
  改成:net.sf.hibernate.dialect.MySQLDialect

9.报错:
javax.servlet.ServletException: Cannot find bean articles in any scope
分析:
可能的原因:
1。和tomcat/common/lib/数据库连接jar有关
2。和tomcat/conf/server.xml数据库连接参数有关,ip地址,数据库名称,用户名,密码错误
3。和数据库用户权限更改,权限缩小有关。******重要关系
4。和连接数据库专用class有关。
5。和hibernate.properties中的参数有关。数据库名称,用户名,密码错误。

10.报错:
[FATAL] DatasourceConnectionProvider - -Could not find datasource: java:comp/env/jdbc/soos

Context>javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
分析:
和tomcat/conf/server.xml数据库连接参数有关。ip地址,数据库名称,用户名,密码错误。


11.javax.servlet.ServletException: Servlet execution threw an exception
[FATAL] DatasourceConnectionProvider - -Could not find datasource: java:comp/env/jdbc/soos

Context>javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
分析:
和tomcat/conf/server.xml数据库连接参数有关。ip地址,数据库名称,用户名,密码错误。
和tomcat/conf/server.xml中的有关


12.net.sf.hibernate.QueryException: could not resolve property type: username [select user.password from cn.org.sppc.ipmanager.User user where user.username=?]
解决方法:username在Form类中、在Hibernate的xml文件中和相对应的PO对象中名称都要保持一致(包括大小写)。包括struts-config.xml中的。


13.javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN
username名称在jsp文件中和在Form类中的不一致。包括struts-config.xml中的。


14.[ERROR] ManagerBase - -IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:
org.apache.commons.logging.impl.SimpleLog org.apache.commons.logging.impl.SimpleLog>java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:
org.apache.commons.logging.impl.SimpleLog
Caused by: java.io.NotSerializableException: org.apache.commons.logging.impl.SimpleLog

[ERROR] ManagerBase - -Exception loading sessions from persistent storage java.io.NotSerializableException: org.apache.commons.logging.impl.SimpleLog>java.io.WriteAbortedException: writing aborted;
java.io.NotSerializableException: org.apache.commons.logging.impl.SimpleLog
Caused by: java.io.NotSerializableException: org.apache.commons.logging.impl.SimpleLog

和其他web服务中有logging服务有关。


15.问题:从jsp表单中提交的中文到了action 中从ActionForm中获得的,以及从request.getParameter()中获得的都是乱码的问题。
解决:虽然打印在tomcat console上的是乱码,但是写到数据库中的却是正确的。

16.Missing message for key  XXXX.XXXX
1.检查 struts-config.xml中是否包含
 
2.在WEB-INF/classes/com/abcde/ApplicationResources.properties是否存在。注意在struts-config.xml中没有properties。
3.检查ApplicationResources.properties是否存在XXX.XXX,我就是因为名字太长没仔细看,一直以为写的是正确的,其实有一个字母写错。查了老半天。
总结:
在没有软件检查语法的地方,首先要仔细检查单词是否写错。例如eclipse不检查非java的代码,除非你装了某个插件。
即使是java代码,eclipse不会告诉你,request.getParameter()中的string参数是否正确,
不会告诉你sql语句是否正确。


17.自己程序中的log.trace, log.info, log.warn等,都没有显示在console中。
原因:发现eclipse没有保存时候自动编译,修改eclipse设置。


18.
<%
String s="ttt.ddd.txt";
String fileNameArray[]=s.split(".");

out.println(fileNameArray.length);
for (int i = 0;i{
 out.println(fileNameArray[i]);
}
%>
想把文件名分别保存,做了以上的jsp程序,发现不行。想了老半天原来应该这么写。
<%
String s="ttt.txt.abc.yyy.ssdsd";
String fileNameArray[]=s.split("//.");

out.println(fileNameArray.length);
for (int i = 0;i{
 out.println(fileNameArray[i]);
}
%>
以后玩字符串的时候要注意一些字符的转义了。


19.No action instance for path /dispatchwebshow could be created
解决方法:
struts.config.xml中的相关action 有名称写错,例如:type参数的值有错误。


20.在mysql数据库里定义index这种sql语句关键字作为数据库字段出错。

21.[DEBUG] RequestProcessor - - Looking for Action instance for class cn.org.sppc.ipmanager.struts.action.LogonAction
javax.naming.NameNotFoundException: Name hibernate_connection_factory is not bound in this Context

估计是修改*.hbm.xml文件后发生*.hbm.xml文件语法错误。
研究后发现是hbm.xml和Java之间的不匹配。
子类xml文件中的many-to-one 中name应该写子类中对应的父类属性,class=父类。
子类Java文件中应该定义 父类,和 父类的id号,
父类xml文件中的set中name应该是子类的集合。
父类java文件中应该定义 子类的集合属性.
否则就可能报以上错误。

22.hibernate 2个表联合查询的问题。
在编程过程中发现需要修改表结构,对某个表增加一个id来关联另一个表的主键。
表结构修改后,就开始写hibernate HQL语句,然后取出联合查询的结果,发现另一个表里的数据没有读出,老是报错:java.lang.NullPointException。
我一直以为要么是HQL语句语法错误,要么是HQL语句逻辑上写错,造成读出null数据来。
断断续续对着HQL语句写法搞了一天,终于查出原因,原本新建的用来关联另一个表的主键id,还没有手工添加数据,查出数据来倒真的成了怪事了。
看来还是HQL语句不熟练的问题,否则早就应该自信的想到是其他原因。

23.
HQL语法正确: 
String queryString = "select type.typeid, type.typeName, type.comment, type.index, " +
   " type.parentTypeid, type.department.departmentName " +
   " ,type" + //有没有此对象都可以读出其他数据
   " from  cn.org.sppc.ipmanager.hibernate.Type as type " +        
   " inner join type.department as department " +
   " where type.parentTypeid=? "+
   //" and type.department.departmentid=type.departmentid "+//此处错误
   " order by type.index";

以下HQL也能得到同样的数据
   String queryString="select type,type.department " +
    " from cn.org.sppc.ipmanager.hibernate.Type as type"+
    " where type.parentTypeid=? "+
    " order by type.index " ;

你可能感兴趣的:(java)