- 浏览: 124264 次
- 性别:
- 来自: 部落格
文章分类
最新评论
-
只是打工的:
这文章是百度来的吧,不写个引用出处吗??
堆和栈 -
skill_job:
“主键设计有个原则,就是主键不应具有任何实际意义.”奇怪了,这 ...
数据库主键设计原则 -
zhou363667565:
写的还不错.
线程池 -
happyxuzheng:
我个人觉得选择数据类型为字符串的主键并且主键存入的是由数字进行 ...
数据库主键设计原则 -
tongfan:
都罗列出来了 可以!
js刷新页面
黄金组合之全面整合,让spring管理struts,spring管理hibernate
一、新建web工程,ssh
1. 导入struts,选择struts1.2的jar包
建立包:org.accp.struts
copy到当前目录下
2. 导入spring
选择jar包,注意不要导入hibernate2的包,其它全要。
然后是applicationContext.xml放在src下,方便后期测试
后期可以放到webRoot/web-inf下
有重复的,选择覆盖
copy到当前目录下
3. 导入hibernate,
要选3.0,spring不支持3.1
选中copy...,再next
选中生成在spring配置文件
再next,选中已经存在的配置文件
再写sessionFactory ID=sessionFactory,next
填写数据源,beanid=ds,再next
去掉create sessionFactory class代表全部由spring托管
覆盖
4. 建立包:
org.accp.hibernate
org.accp.hibernate.po
org.accp.hibernate.dao
org.accp.well.delegate
5. 导入日志配置文件src/log4j.properties
6. 导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
7. 如果报错:<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的相关操作。主要方法:
Serializable save(Object?entity) :保存记录
void update(Object?entity) :修改记录
void delete(Object?entity) :删除记录
Object get(Class?entityClass, Serializable?id)
Object load(Class?entityClass, Serializable?id)
List executeFind(HibernateCallback?action) :查询,返回集合
Object execute(HibernateCallback?action):查询,返回对象
总的说来,该类的方法和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与连接的管理
而调用getHibernateTemplate()就会自动关闭连接。
这是日志
[main] DEBUG org.springframework.orm.hibernate3.SessionFactoryUtils - Closing Hibernate Session
自动关闭连接会造成延迟加载初始化异常,此时可用OpenSessionInView模式解决。Spring提供Open Session In View来解决这个问题, 有两种方式。
1) Interceptor,在applicationContext.xml配置
<bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors" ref="openSessionInViewInterceptor"/>
<property name="mappings">
<props>
......
</props>
</property>
</bean>
2) Filter,在web.xml中配置
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<!-- 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里 -->
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</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. HibernateDaoSupport与自动提交
每执行一个sql,默认都是由spring自动提交事务。可以在数据源中插入进去
<property name="defaultAutoCommit">
<value>false</value>
</property>
8. spring整合hibernate事务
Don't call me, I will call you
更少代码,更少BUG
Spring提供的事务管理可以分为两类:编程式的和声明式的。
1) 编程式的
比较灵活,但是代码量大,存在重复的代码比较多,当你只有很少的事务操作时,编程式事务管理通常比较合适。
代码
public class UserDao3 extends HibernateDaoSupport implements IDao{
private HibernateTransactionManager transactionManager;
public void setTransactionManager(HibernateTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void save(Users u){
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try{
this.getHibernateTemplate().save(u);
//不提交插入不了
transactionManager.commit(status);
}catch(Exception e) {
transactionManager.rollback(status);
}
}
}
配置
<bean id="userdao3" class="org.accp.hibernate.dao.UserDao3">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="transactionManager" ref="transactionManager"/>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
2) 声明式的
其DAO必须要有接口,否则声明式事务就会报错。
a) 事务属性
<prop key="save*">PROPAGATION_REQUIRED,readOnly</prop>
key属性确定代理应该给哪个方法增加事务行为。 PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务,避免dirty checking。
b) 事务策略
为了实际执行事务,Spring所有的事务划分功能都通过传递适当的TransactionDefinition实例,委托给PlatformTransactionManager。
Spring具有多种PlatformTransactionManager实现,它们分为两类:
局部事务策略--针对单个资源执行事务(在多数情况下是针对单个的数据库)。
全局事务管理--执行有可能跨越多个资源的全局事务。
c) 事务代理
TransactionProxyFactoryBean是Spring2.0之前的旧版本风格的配置
TransactionInterceptor,它使用一个PlatformTransactionManager实现配合,在方法调用前后实施事务。
d) 例子
配置文件
<bean id="userdao4" class="org.accp.hibernate.dao.UserDao4">
<property name="sessionFactory" ref="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后,始终插入不进去。
配置完成后,将使用声明式事务能插入进去了。
9. 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-config.xml中新建login用例
form/action/jsp,use case=login
2. 写代理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);
}
}
配置文件
<bean id="ud" class="org.accp.well.delegate.UserDelegate">
<property name="dao" ref="userdao"></property>
</bean>
3. 加上跳转页面
新增succ.jsp
succ对应succ.jsp,fail对应login.jsp
4. 引入IOC,在action中引入代理
修改LoginAction
private UserDelegate ud;
public void setUd(UserDelegate ud) {
this.ud = ud;
}
5. 在action中写上登陆验证代码
String uid = loginForm.getUid();
String pwd = loginForm.getPwd();
if(ld.validate(uid, pwd))
return mapping.findForward("succ");
return mapping.findForward("fail");
6. 在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>
7. 让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" >
8. 采用第一种方式
在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>
四、部署运行
1. 发布
2. 如果导入spring时,没有选中web的jar包,则集成到struts会出错
3. 测试一切正常
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
一、新建web工程,ssh
1. 导入struts,选择struts1.2的jar包
建立包:org.accp.struts
copy到当前目录下
2. 导入spring
选择jar包,注意不要导入hibernate2的包,其它全要。
然后是applicationContext.xml放在src下,方便后期测试
后期可以放到webRoot/web-inf下
有重复的,选择覆盖
copy到当前目录下
3. 导入hibernate,
要选3.0,spring不支持3.1
选中copy...,再next
选中生成在spring配置文件
再next,选中已经存在的配置文件
再写sessionFactory ID=sessionFactory,next
填写数据源,beanid=ds,再next
去掉create sessionFactory class代表全部由spring托管
覆盖
4. 建立包:
org.accp.hibernate
org.accp.hibernate.po
org.accp.hibernate.dao
org.accp.well.delegate
5. 导入日志配置文件src/log4j.properties
6. 导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
7. 如果报错:<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的相关操作。主要方法:
Serializable save(Object?entity) :保存记录
void update(Object?entity) :修改记录
void delete(Object?entity) :删除记录
Object get(Class?entityClass, Serializable?id)
Object load(Class?entityClass, Serializable?id)
List executeFind(HibernateCallback?action) :查询,返回集合
Object execute(HibernateCallback?action):查询,返回对象
总的说来,该类的方法和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与连接的管理
而调用getHibernateTemplate()就会自动关闭连接。
这是日志
[main] DEBUG org.springframework.orm.hibernate3.SessionFactoryUtils - Closing Hibernate Session
自动关闭连接会造成延迟加载初始化异常,此时可用OpenSessionInView模式解决。Spring提供Open Session In View来解决这个问题, 有两种方式。
1) Interceptor,在applicationContext.xml配置
<bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors" ref="openSessionInViewInterceptor"/>
<property name="mappings">
<props>
......
</props>
</property>
</bean>
2) Filter,在web.xml中配置
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<!-- 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里 -->
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</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. HibernateDaoSupport与自动提交
每执行一个sql,默认都是由spring自动提交事务。可以在数据源中插入进去
<property name="defaultAutoCommit">
<value>false</value>
</property>
8. spring整合hibernate事务
Don't call me, I will call you
更少代码,更少BUG
Spring提供的事务管理可以分为两类:编程式的和声明式的。
1) 编程式的
比较灵活,但是代码量大,存在重复的代码比较多,当你只有很少的事务操作时,编程式事务管理通常比较合适。
代码
public class UserDao3 extends HibernateDaoSupport implements IDao{
private HibernateTransactionManager transactionManager;
public void setTransactionManager(HibernateTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void save(Users u){
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try{
this.getHibernateTemplate().save(u);
//不提交插入不了
transactionManager.commit(status);
}catch(Exception e) {
transactionManager.rollback(status);
}
}
}
配置
<bean id="userdao3" class="org.accp.hibernate.dao.UserDao3">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="transactionManager" ref="transactionManager"/>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
2) 声明式的
其DAO必须要有接口,否则声明式事务就会报错。
a) 事务属性
<prop key="save*">PROPAGATION_REQUIRED,readOnly</prop>
key属性确定代理应该给哪个方法增加事务行为。 PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务,避免dirty checking。
b) 事务策略
为了实际执行事务,Spring所有的事务划分功能都通过传递适当的TransactionDefinition实例,委托给PlatformTransactionManager。
Spring具有多种PlatformTransactionManager实现,它们分为两类:
局部事务策略--针对单个资源执行事务(在多数情况下是针对单个的数据库)。
全局事务管理--执行有可能跨越多个资源的全局事务。
c) 事务代理
TransactionProxyFactoryBean是Spring2.0之前的旧版本风格的配置
TransactionInterceptor,它使用一个PlatformTransactionManager实现配合,在方法调用前后实施事务。
d) 例子
配置文件
<bean id="userdao4" class="org.accp.hibernate.dao.UserDao4">
<property name="sessionFactory" ref="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后,始终插入不进去。
配置完成后,将使用声明式事务能插入进去了。
9. 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-config.xml中新建login用例
form/action/jsp,use case=login
2. 写代理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);
}
}
配置文件
<bean id="ud" class="org.accp.well.delegate.UserDelegate">
<property name="dao" ref="userdao"></property>
</bean>
3. 加上跳转页面
新增succ.jsp
succ对应succ.jsp,fail对应login.jsp
4. 引入IOC,在action中引入代理
修改LoginAction
private UserDelegate ud;
public void setUd(UserDelegate ud) {
this.ud = ud;
}
5. 在action中写上登陆验证代码
String uid = loginForm.getUid();
String pwd = loginForm.getPwd();
if(ld.validate(uid, pwd))
return mapping.findForward("succ");
return mapping.findForward("fail");
6. 在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>
7. 让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" >
8. 采用第一种方式
在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>
四、部署运行
1. 发布
2. 如果导入spring时,没有选中web的jar包,则集成到struts会出错
3. 测试一切正常
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
发表评论
-
CDN技术关键点
2013-10-10 14:48 854如何用BIND, GeoIP, Nginx, Varnish来 ... -
Nginx安装
2013-03-21 18:22 0Nginx作为一个后起之秀,他的迷人之处已经让很多人都投入了他 ... -
weblogic初学习
2011-12-08 09:52 1334BEA WebLogic是用于开发、集成、部署和管理大型分布式 ... -
Spring 依赖注入详解
2011-11-28 21:13 757简介: Spring 的依赖配 ... -
CentOs IP NDS的设置
2011-11-27 20:30 1367【学习如何修改centos的IP地址、DNS以及网关】 一、 ... -
反射器模式
2011-11-09 10:16 986Java NIO非堵塞应用通常 ... -
linux ,VI命令编辑器
2011-11-06 23:14 1157本章介绍Linux上最常用 ... -
堆和栈
2011-11-01 16:02 1721Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/F ... -
超时任务
2011-10-31 09:04 1156import java.util.concurrent.Cal ... -
ReentrantLock 到底锁定了哪个对象了?
2011-10-31 09:04 3153一个简单的ReentrantLock的例子, 情景是几个朋友吃 ... -
BlockingQueue使用
2011-10-29 10:40 1576import java.util.concurrent.Arr ... -
线程池
2011-10-24 16:55 3223在什么情况下使用线程池? 1.单个任务处理的时间比 ... -
异步执行线程并可以得到返回值
2011-10-24 16:33 8923import java.util.concurrent.Cal ... -
Oracle rowid 优化分页
2011-10-18 16:15 1517今天看到一个分享,了解到DBA对oracle的分页方法进行优化 ... -
dmp命令导数据库
2011-10-15 22:24 900导出:exp usename/password@SID fil ... -
Struts2.0
2011-08-30 13:48 784struts.properties文件,该文 ... -
BoneCp的设置
2011-03-29 08:24 1473一、BoneCP配置文件格式(bonecp-config.xm ... -
tomcat工程部署记录
2011-03-17 16:11 1022第一种方法:在tomcat中的conf目录中,在server. ... -
Spring + Hibernate 配置BoneCp
2011-03-15 21:34 2520为什么 BoneCP 连接池的性能这么高呢?(bonecp-0 ... -
Spring的加入记录
2011-03-15 21:09 835在J2EE的web应用里面配置spring非常简单,最简单的只 ...
相关推荐
书中会详细讲述如何配置这些框架,使它们协同工作,包括Spring与Hibernate的事务管理、数据源配置、以及Struts2与Spring的整合等。 除此之外,书中还可能涵盖了单元测试、异常处理、安全性配置等方面的内容,这些都...
《图书管理系统spring+struts+hibernate》是一款基于Java技术栈开发的图书管理软件,其核心框架包括Spring、Struts和Hibernate。该系统利用MySQL作为数据库存储数据,提供了完整的数据库备份,确保了数据的安全性与...
### Spring管理Struts与Hibernate详解 #### 一、Spring整合Struts 在Web开发中,Struts是一个基于MVC设计模式的开源框架,它能够帮助开发者构建可维护性高、结构清晰的应用系统。Spring框架则提供了强大的依赖注入...
【Spring+Struts+Hibernate整合配置方案】 Spring、Struts和Hibernate是Java Web开发中三大核心框架,它们各自负责不同的职责:Spring作为依赖注入容器和面向切面编程(AOP)框架,提供应用的结构和事务管理;Struts...
在IT行业中,SSH(Spring、Struts2、Hibernate)是一个经典的Java Web开发框架组合,而Redis则是一个高性能的键值存储系统,常用于缓存和数据持久化。将SSH与Redis整合,可以提升应用程序的性能和响应速度。下面将...
总之,“maven整合spring+hibernate+struts2”是一种常见的Java Web开发架构,它通过Maven的依赖管理,Spring的全面控制,Hibernate的对象关系映射,以及Struts2的视图展现,为复杂的企业级应用提供了坚实的基础。...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责不同的职责:Struts2作为MVC框架处理请求和展示,Spring提供依赖注入和事务管理,Hibernate则作为ORM框架处理数据库操作。将这三个框架整合在...
它们各自承担着不同的职责,Spring提供全面的容器管理,Struts处理MVC(模型-视图-控制器)架构,而Hibernate则负责对象关系映射。下面我们将深入探讨这三大框架以及它们的整合。 首先,Spring框架以其依赖注入...
在SSH整合中,Spring主要负责管理Bean,包括Struts的Action和Hibernate的SessionFactory,以及事务控制,确保用户注册操作的原子性和一致性。 3. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,它允许...
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
一个spring+struts+hibernate的例子,是eclipse的工程,用tomcat5和mysql,文件夹下包含所有的源码和库,另外还有一个.sql的文件用于建立数据库。大家觉得它有什么不好,欢迎交流
整合Spring、Struts和Hibernate能带来很多优势,比如松耦合的架构、便捷的数据库操作以及清晰的MVC分离。不过,这种整合也增加了项目的复杂性,因此在实际应用中,需要根据项目需求和团队技术栈来选择合适的技术方案...
首先,我们需要理解Spring如何与Hibernate和Struts进行整合: 1. **Spring与Hibernate整合**: - Spring通过其`HibernateTemplate`或`HibernateDaoSupport`类简化了对Hibernate的操作,提供了事务管理。你可以定义...
Struts提供了MVC模式的实现,Spring则是一个全面的轻量级应用框架,包括依赖注入(DI)、面向切面编程(AOP)等功能,而Hibernate则是一个优秀的对象关系映射(ORM)框架,简化了数据库操作。这三者整合在一起,可以...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们的整合(SSH)极大地提升了开发效率和项目的可维护性。下面将详细讲解这三大框架的核心功能以及整合过程中的关键知识点。 1. **Struts2**:Struts2是一...
2. **整合Hibernate**:Spring与Hibernate的整合主要体现在事务管理上。Spring提供了声明式事务管理,通过`<tx:annotation-driven>`标签可以在注解中定义事务边界。同时,我们需要配置Hibernate SessionFactory,并...
整合这三个框架的目的是提高开发效率,降低维护成本,通过Spring的IoC和AOP特性,实现组件间的解耦和事务管理,而Hibernate则简化了数据库操作。在实际项目中,这种整合提供了强大的后端架构,能够应对复杂的业务...
Struts处理请求转发,Spring管理bean和事务,Hibernate负责数据库交互。通过Spring的IoC和AOP特性,可以有效地降低耦合度,提高代码的可测试性和可扩展性。在实际开发中,应根据项目需求选择合适的整合方式,以实现...
在SSH整合中,Spring通常用来管理Struts2和Hibernate的bean实例,实现依赖注入,降低组件之间的耦合度。此外,Spring的事务管理功能能够统一管理数据库操作,确保数据的一致性。 Hibernate是持久层框架,它简化了...
### Struts2、Spring与Hibernate整合应用:学生成绩管理系统 #### 一、知识点概览 本项目聚焦于Struts2、Spring与Hibernate三大框架的整合应用,旨在构建一个高效、稳定、易于维护的学生成绩管理系统。通过整合这...