hibernate
org.accp.hibernate.po
org.accp.hibernate.dao
org.accp.well.delegate
4. 导入日志配置文件src/log4j.properties
5.
导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
6.
如果报错:<url>这里不能有空格或回车符</url>
二、spring整合hibernate
1.
查看applicationContext.xml有了变化,多了hibernate的配置
2. 建立表的映射
选择数据库视图,accp数据库
生成users.hbm.xml与Users.java
去掉catagory属性,否则会报错
也在applicationContext.xml中增加了映射
3.
整合hibernate有两种方式
4. 第一种方式,继承
org.springframework.orm.hibernate3.HibernateTemplate,该类是spring封装了操作
Hibernate的实现细节的类,用于代替Session的相关操作
1)在dao包中写接口IDao,
public
interface IDao {
public void save(Users u);
public List
getAll();
public boolean validate(Users u);
}
UserDao extends HibernateDaoSupport implements IDao
public class
UserDao extends HibernateDaoSupport implements IDao{
public void
save(Users u){
this.getHibernateTemplate().save(u);
}
}
2)在spring中配置UserDao,从哪取连接,property二择其一
给继承了HibernateDaoSupport的对象我们注入一个sessionFactory
对象也可以,他会自动生成一个hibernateTemplate对象
<bean id="userdao"
class="org.accp.hibernate.dao.UserDao">
<property
name="sessionFactory" ref="sessionFactory" />
<!--<property
name="hibernateTemplate"
ref="hibernateTemplate"/>-->
</bean>
3)测试
导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
去掉users.hbm.xml中的catagory属性,否则会报错
////////////////////////////////////ApplicationContext
ac = new ClassPathXmlApplicationContext("applicationContext.xml");
IDao
dele = (IDao)ac.getBean("userdao");
Users u = new Users();
u.setUid("userdao");
u.setPwd("123");
u.setVersion(2);
dele.save(u);
5. 第二种方式
1)
新建一个类UserDao2,加一成员变量HibernateTemplate
加一构造函数,注入sessionFactory
加一setter方法,注入sessionFactory
public class UserDao2 implements
IDao{
private HibernateTemplate hibernateTemplate;
public
UserDao2(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate =
hibernateTemplate;
}
public void save(Users u){
hibernateTemplate.save(u);
}
}
2)
改配置文件applicationContext.xml
<bean id="userdao2"
class="org.accp.hibernate.dao.UserDao2">
<constructor-arg>
<ref bean="hibernateTemplate"/>
</constructor-arg>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property
name="sessionFactory">
<ref
bean="sessionFactory"/>
</property>
</bean>
6.
HibernateDaoSupport与连接的管理
自动关闭连接会造成延迟加载初始化异常,此时可用OpenSessionInView模式解决。Spring提供Open
Session In View来解决这个问题
Filter,在web.xml中配置
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
加了这个配置,就要加监听器和初始文件的参数,否则报错
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
7. spring整合hibernate事务
Spring提供的事务管理可以分为两类:编程式的和声明式的。
声明式的,其DAO必须要有接口,否则声明式事务就会报错。配置文件
<bean id="userdao"
class="org.accp.hibernate.dao.UserDao">
<property
name="sessionFactory"
ref="sessionFactory"></property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref
bean="sessionFactory"/>
</property>
</bean>
<bean id="proxyTemplate"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref
bean="transactionManager"/>
</property>
<property
name="transactionAttributes">
<props>
<prop
key="save*">PROPAGATION_REQUIRED</prop>
<prop
key="query*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean
id="nameproxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list><value>userdao4</value></list>
</property>
<property name="interceptorNames">
<list>
<value>proxyTemplate</value>
</list>
</property>
</bean>
不用事务,即使报错也始终能插入进去一条。用了事务,一报错则一条都不进去。
配置完成前,将defaultAutoCommit设成false后,始终插入不进去。
配置完成后,将使用声明式事务能插入进去了。
8. sql提高,修改UserDao
// executeFind返回集合
public List query() {
return this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
return session.createQuery(
"from " +
cls.getName() + " as a order by a.uid desc").list();
}
});
}
// execute返回对象
public boolean validate(final Users u) {
List ls =
(List) this.getHibernateTemplate().execute(
new HibernateCallback()
{
public Object doInHibernate(Session session)
throws
HibernateException, SQLException {
Query qy = session
.createQuery("from Users u where u.uid=:uid and u.pwd=:pwd");
qy.setString("uid", u.getUid());
qy.setString("pwd",
u.getPwd());
List li = qy.list();
return li;
}
});
return (ls.size() > 0);
}
三、spring整合struts
1. 导入struts,选择struts1.2的jar包
建立包:org.accp.struts
copy到当前目录下
2.
在struts-config.xml中新建login用例
form/action/jsp,use case=login
3.
加上跳转页面
新增succ.jsp
succ对应succ.jsp,fail对应login.jsp
4.
引入IOC,在action中引入代理
写代理UserDelegate,有保存、验证、查询所有的记录三个方法
public class
UserDelegate {
//一定要是IDao而不是UserDao,因为有了事务,自动代理将截获后返回的是IDao
private IDao
dao;
public void setDao(IDao dao) {
this.dao = dao;
}
public
boolean validate(String uid,String pwd){
return dao.validate(uid,
pwd);
}
public List getAll() {
return dao.getAll();
}
public
void save(Users u) {
dao.save(u);
}
}
修改LoginAction,注入UserDelegate
private UserDelegate ud;
public void
setUd(UserDelegate ud) {
this.ud = ud;
}
在action中写上登陆验证代码
String uid = loginForm.getUid();
String pwd =
loginForm.getPwd();
if(ld.validate(uid, pwd))
return
mapping.findForward("succ");
return mapping.findForward("fail");
5.
在struts中引入spring
在struts-config.xml中注册,引入spring的插件,在message-resources标签后:
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/classes/applicationContext.xml"/>
</plug-in>
6. 让spring管理struts的action,有三种方式,采用第一种方式
1) 最简单的一种,改变其请求处理器:
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor"
/>
2) 在struts的action中直接继承spring的一个ActionSupport
3)
改action的配置中的type,换成spring的一个代理,这个每个action都要改,比较麻烦
<type="org.springframework.web.struts.DelegatingActionProxy" >
7.
在spring的applicationContext.xml中注册struts的action和代理
其name(不能是id)对应于struts-config.xml中的path
<bean name="/login"
class="org.accp.struts.action.LoginAction">
<property name="ud"
ref="ud"></property>
</bean>
<bean id="ud"
class="org.accp.well.delegate.UserDelegate">
<property name="dao"
ref="userdao"></property>
</bean>
四、部署运行
1. 发布
2. 如果导入spring时,没有选中web的jar包,则集成到struts会出错
3.
测试一切正常
3.
出现java.lang.NoClassDefFoundError:
org/hibernate/cfg/HbmBinder$SecondPass
错误
这个应该是MyEclipse5GA中的hibernate3.1中的hibernate-annotations.jar
版本不对导致的。最简单的解决办法是把lib目录中的hibernate-annotations.jar文件删掉。要从部署文件中删除
4.
将applicationContext.xml放到与web.xml平级目录
修改struts-config.xml的配置,改<plug-in>路径
再测试一切正常
5.
将与struts的集成改成第一种方式
改<action>标签的type
加
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor"
/>
再测试一切正常
6. 看日志,session的开闭
[http-8080-Processor25] DEBUG
org.springframework.orm.hibernate3.SessionFactoryUtils - Opening Hibernate
Session
...
[http-8080-Processor25] DEBUG org.hibernate.impl.SessionImpl
- closing session