※ssh整合
ssh指struts+spring+hibernate三大框架,通过ssh三大框架间的配合使用来开发项目是jee中较流行的一种方式,下边通过一个案例来说明ssh的整合,案例使用一个雇员管理系统
具体步骤:
创建web项目
(1)先整合spring
①引入spring开发包
②编写applicationContext.xml文件(或者beans.xml),将该文件放在src目录下(也可以根据情况建立另外的包并放在包下),下边是该xml文件的模板
③测试spring是否ok
建一个test包,写一个简单的TestService类并在applicationContext.xml里装配bean,再写一个Test类进行测试,测试ok表明目前spring可以工作
④在web.xml中初始化我们的spring容器,这样在启动Tomcat的时候,就会实例化spring容器
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
// 通过下面语句可以直接获取到spring容器实例,即ApplicationContext
WebApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(this.getServlet().getServletContext());
(2)整合hibernate
①加入hibernate开发包
②因为使用的是ssh,所以hibernate的核心就被spring接管了。hibernate.cfg.xml文件对象映射文件,SessionFactory在spring的文件中配置即可
③在applicationContext.xml中配置数据源
driverClassName " value="com.mysql.jdbc.Driver">
username" value="root">
④在applicationContext.xml中配置SessionFactory对象
dataSource " />
com/lewis/domain/Employee.hbm.xml
hibernateProperties">
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
⑤编写domain对象和映射文件Employee.hbm.xml,测试spring和hibernate是否可以结合使用
⑥考虑分层
⑦使用事务管理器来统一管理事务,在applicationContext.xml中配置事务管理器
接下来添加事务注解//这里配置@Transactional用处是让spring的事务管理器接管该Service的事务,也可以只将注解添加在某个方法前
@Transactional
public class EmployeeServiceImpl implements EmployeeServiceIntfc {
此时事务管理器、SessionFactory、数据源之间的关系图如下
⑧在applicationContext.xml中配置hibernate的二级缓存
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.cache.use_second_level_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.generate_statistics=true
(3)整合struts
① 引入struts开发包
② 创建struts-config.xml,放到/WEB-INF目录下
③ 在web.xml中配置struts
action
org.apache.struts.action.ActionServlet
config
/WEB-INF/struts-config.xml
0
action
*.do
⑤在struts-config.xml作如下配置:
⑥在applicationContext.xml中配置action的路径
此时struts-config.xml中对应的action的type就可以不要了
⑦这样就可以通过spring容器来获取action和配置action的一些属性,可以在action里添加一个属性:
在相对应的action里添加一个employeeServiceIntfc属性和setter方法,就可以无需通过(1)⑤的语句来获取spring容器对象,直接可以通过employeeServiceIntfc.XX()来调用业务逻辑里的方法。
※注意在配置spring容器里的bean时name不要写错,一旦写错就会出错导致实例化失败,出现404等错误。
⑧struts的action是单例,对于并发的处理并不好,因为不管有多少请求,总是由一个action去处理。而降action交由spring管理之后,可以通过修改该action的scope属性为prototype来解决这个问题。
⑨struts有中文乱码的毛病,要解决这个问题,有两种方式
方法一:自己配置过滤器
9.1.1建一个com.xxx.web.filter包,建一个实现javax.servlet.Filter的Servlet,重写doFilter和init方法:
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException{
arg0.setCharacterEncoding("utf-8");
arg2.doFilter(arg0, arg1);
}
9.1.2在web.xml中配置过滤器
MyFilter
com.lewis.web.filter.MyFilter
MyFilter
/*
直接在web.xml里进行配置就行
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encoding
/*
※对ssh整合的特别说明
①spring可以通过注解的方式来配置属性
1.1重新这样配置bean
1.2在EmployeeService的属性sessionFactory中添加一个注解@Resource
@Resource
private SessionFactory sessionFactory;
1.3在applicationContext.xml中启用注解
②ssh整合时,如何解决懒加载问题
2.1方法一:显示初始化懒加载,明确初始化
Hibernate.initialize(Department.class);//select预先查询
或者在Session还没关闭时,访问一次xxx.getXxx(),强制访问数据库
2.2方法二:在对象映射文件配置lazy=false,取消懒加载
但是以上两个方法都不好,因为无论你用不用该关联对象,hibernate都会发出sql语句去查询
2.3方法三:延长session的生命周期(推荐该方法)
spring专门提供了opensessioninview的方法来解决懒加载,需要在web.xml文件中添加如下配置:
OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
OpenSessionInViewFilter
/*
该方法可以有效的减少对数据库的查询,但缺点是和数据保持的session时间延长了