学习Struts&Hibernate笔记
在一个叫做《协同办公平台》的实训项目中我们在需求分析和界面原型完成后在进入设计阶段时候我们经过讨论决定使用Struts&Hibernate框架来进行程序的编写工作,但是由于组员中很多人都是初学者即使在之前学过也都谈不上精通,所以在使用的过程中我们遇到了很多问题,(在此提一句我们使用的数据库是Oracle,如果在以后的说明中使用了数据库请以此数据库为准)在此做一个较为简单的总结,希望在后面的熟悉过程中大家都能共同进步,能够进一步的完成变成的学习和理解。Hibernate作为创建Java对象持久化技术的重要后盾我们在程序中的应用也可以大大的减少代码量,在开发过程中使用Struts&Hibernate框架可以减少大概1/3的代码这样大大的提高了开发的速度和质量,我们现在就从Hibernate的基础开始学习起来。把对象持久化到关系数据库中,需要进行对象-关系的映射(Object/Relation Mapping,建成ORM)这样的映射是一项繁琐的工作但是它也为后面数据库的操作提供了良好的基础。Hibernate是一个基于Java的开放源代码的持久化中间件,它对JDBC做了轻量级的封装,不仅提供ORM映射服务,还提供数据查询和数据缓存功能,Java开发人员可以方便地通过Hibernate API来操纵数据库。
<hibernate-configuration>
<session-factory>
<property name="connection.username">system</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:table
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="myeclipse.connection.profile">
driverClassName
</property>
<property name="connection.password">manager</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<mapping resource="com/icss/po/Userinfo.hbm.xml" />
</session-factory>
以上是Hibernate的简单配置文件内容,username等信息依据个人不同做改变。
在程序的编写过程中做了一个修改密码的小功能,可就是这样一个简单的功能使我出现了问题,刚开始很郁闷问同学也不知道怎么回事,问题提示是session中出现了相同的内容,要访问的对象已经被访问大概就是这么一个意思,后来上网一查很多人都遇到过类似的问题,大概的问题原因就是在一次活动中使用了两次不同的session做事,结果在需要得到或者事需要访问session的时候就出现了问题例如下边这个程序:
public List matchchpwd(Loading loading){
List list = null;
Session session=HibernateSessionFactory.getSession();//开启连接
Query q = session.createQuery("from Loading where question=:question and answer=:answer");
q.setString("question", loading.getQuestion());
q.setString("answer", loading.getAnswer());
list=q.list();
System.out.println("size是 "+list.size());
session.clear();
return list;
}
public boolean mdfPassword(Loading loading) {//修改密码
Session session=HibernateSessionFactory.getSession();//开启连接
try {
if(matchchpwd(loading).isEmpty()) return false;
else
{
System.out.println("question "+ loading.getQuestion());
System.out.println("answer "+loading.getAnswer());
org.hibernate.Transaction tx = session.beginTransaction(); //开启事务
session.update(loading);
tx.commit();
}
} catch (HibernateException e) { //捕捉例外
e.printStackTrace();
}finally
{
HibernateSessionFactory.closeSession();
}
return true;
}
这是一个已经把问题解决了的程序,如果程序中你使用了两个session遇到这样的问题,其中的一个session应该只有暂时的作用,只要在其生命周期完成后及时的关闭或者清理出去就好,以免造成session内容或者访问冲突出现类似的问题。
以下是写网页时候遇到的一个问题,提示说<form>标签没有定义或者是没有匹配等,类似的一些提示经常出现在用Struts构架中,我也在程序中遇到了相似的问题,其中问题的集中度还是较大,特别是对于初次使用这个架构的人员来说会觉得不好下手,不知道自己哪里错了,其实很简单,我们知道使用这个架构自动生成的标签都如<html:form>有时候就是因为你少了个“html:”就出问题了,其他类似问题还是很多,还有就是在写程序时候的粗心,这样造成的问题就更多了。
在struts-config.xml的映射文件中,如果你要删除JSP页面和一些action或者是form待删除后重新建立会因为在这个文件开头的这个语句给你带来一些麻烦所以请你记住他,用的时候很友好,删除的时候更不能忘记:
<form-bean name="queryEmForm" type="com.icss.struts.form.QueryEmForm" />
下面就是这个文件中映射关系带来的麻烦了:
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="com.icss.struts.action.LoginAction">
<forward name="success" path="/success.jsp" />
<forward name="fail" path="/fail.jsp" />
</action>
在这里的映射关系已经很清楚了,值得提醒的是
type="com.icss.struts.action.LoginAction">
<forward name="success" path="/success.jsp" />
<forward name="fail" path="/fail.jsp" />
这三个语句是经常都会做修改,在修改的过程中要记得大小写,只要大小写弄好那么这里的Struts也就不是什么问题了。勇敢的用吧,真的很好用。
系统报出500错误如下:
No getter method available for property scrnDisplay for bean under name org.apache.struts.taglib.html.BEAN
其实这是一个还算为常见的错误,原因是form中没有与传入数据对应的接受方法
错误描述:
org.hibernate.QueryException: could not resolve property:
遇到这样的错误基本是属于粗心大意所致,在这个架构中我们经常使用list使其能够很好的封装,但是得到一个null值是让人很郁闷的事,我遇到这个问题的时候就是出现了空值,具体由于在操作的时候在DAO层访问数据库的时候没有其变量没有与po里的变量对应没有准确的映射到需要查询的值出现了问题,希望各位在做对数据库操作的时候细心一点,保持变量名一致性这些类似的问题就可以尽量减少。
对于初学者在配置struts的时候还会遇到一些小问题:
请注意一下您的以下这些语句是否还存在映射关系,如果存在可能是他买导致的问题,也要注意一下你的专接等映射是否能够具体的进行准确的操作:
<form-beans >
<form-bean name="loginForm" type="com.atoz.struts.form.LoginForm" />
<form-bean name="changepasswordForm" type="com.atoz.struts.form. " />
<form-bean name="viewmyinfoForm" type="com.atoz.struts.form. " />
<form-bean name="changemyinfoForm" type="com.atoz.struts.form. " />
<form-bean name="queryEmForm" type="com.atoz.struts.form. " />
<form-bean name="querytheEmForm" type="com.atoz.struts.form. " />
<form-bean name="queryotherForm" type="com.atoz.struts.form. " />
</form-beans>
如果你在设计中删除相关信息再新建可能会出现文件已经存在的信息,请你查询这里看看,是否把映射关系页删除了。虽然这不是一个大的错误也基本一般不会范这样的错这里只是作为一个例子告诉大家请在编写程序时细心,在删除相关程序是也要把它完全删除,否则在每一个不起眼的地方都会造成BUG,以后再来改那就需要花费太多的时间。