ssh整合
u ssh整合
** ssh(struts+spring+hibernate) 三大框架配合使用来开发项目,是目前java ee 最流行的开发方式,必须掌握.**
设计: 这我们通过一个实际的案例,来讲解整合 , 我们使用一个雇员薪资管理系统(crud),每加入一个框架,我们就测试通过
具体的步骤:
1.创建web项目
① 先搞定spring
② 引入spring开发包
③ 编写applicationContext.xml文件(或者beans.xml),我们把该文件放在 src目录下.
④ 测试一下spring 是否ok->目前spring可以工作. 5min
⑤ 加入hibernate开发包
⑥ 因为我们是ssh,所以我们hibernate的核心,就被spring接管了.hibernate.cfg.xml 文件对象映射文件,SessionFactory在spring的文件中配置即可.
⑦ 在 applicationContext.xml中配置数据源
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<oracle数据源>
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orahsp"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<mysql数据源>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!-- 连接池启动时的初始值 -->
<property name="initialSize" value="30"/>
<!-- 连接池的最大值 -->
<property name="maxActive" value="500"/>
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="2"/>
<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
<property name="minIdle" value="1"/>
</bean>
⑧ 配置SessionFactory对象
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>cn/xxx/bean/Person.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.format_sql=false
</value>
</property>
</bean>
⑨ 我们编写domain对象和映射文件Employee.hbm.xml ->测试srping和hibernate是否可以结合使用->ok
⑩ 考虑分层
11. 使用事务管理器来统一管理事务.
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- 启用注解扫描 -->
<context:annotation-config/>
12. 配置我们的hibernate二级缓存 [ehcache / oscache ]
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.OracleDialect
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
</value>
</property>
12.1 添加二级开发包.
12.2 将我们的ehcache的配置文件放到 src目录
12.3 证明二级缓存生效
13 整合struts
13.1 引入struts开发包
13.2 创建struts-config.xml 方法 /WEB-INF 目录下
配置如下:
13.3在web.xml中配置我们的struts
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>struts</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
* 在web.xml中初始化我们的spring容器
<!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!-- 对Spring容器进行实例化 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
14. 让spring接管我们的struts(action控件)
14.1 在struts-config.xml文件中添加如下代码配置:
<!-- 配置代理请求处理 DelegatingRequestProcessor ,它的用户是 -->
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>
14.2 在applicationcontext.xml文件中配置我们的action路径
<!-- 配置action -->
<bean name="/login" class="web.action.loginAction" >
<!-- 注意此处使用的是service的接口 -->
<property name="employeeServiceInter" ref="employeeService"></property>
</bean>
14.3 这我们就可以通过spring容器来获取action,和配置action的一些属性.
14.4 通过使用sping来接管我们的action,还有一个好处,可以解决action 是单例的问题.通过在applicationContext.xml文件中配置属性 <bean scope=”singlton/prototype/request/sesssion/global session”/>
15. 解决中文乱码问题
思路: 自己配置过滤器
步骤: (1) 开发一个Filter
(2) 在web.xml中配置过滤器
<!-- 配置自己写的过滤器 -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.hsp.web.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
思路2:使用spring框架提供的处理中文乱码的过滤器
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对ssh整合的特别说明:
1. spring可以启用注解的方式来配置属性.
1.1 重新这样配置bean
<bean id="employeeService" class="com.hsp.service.imp.EmployeeService"/>
1.2 在EmployeeService 的属性sessionFactory中添加一个注解 @Resource
1.3 在applicationContext.xml中启用注解
<context:annotation-config/>
1.4 测试->ok
2. ssh整合的时候,如何解决懒加载问题
问题? 如果我们的雇员都属于一个部门
Class Department{
private Integer id;
private String name;
}
目前我们把测试数据作出了.
具体问题?如果我们在 mainFrame.jsp中要求显示该雇员所在部门的时候
${loginuser.department.name} 时候,懒加载问题出现:
解决思路:
1. 明确初始化
在session还没有关闭时,访问一次 xxx.getXxx(),强制访问数据库。或者 Hibernate.initialize(xxx)
2 在对象映射文件中 取消懒加载 <lazy=”false”/>
上面方法问题是: 不管你在jsp中使不使用 部门的名称,它都有向数据库发出select 请求.
3. spring专门提供了opensessioninview的方法来解决懒加载.
需要在web.xml文件中添加如下配置:
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
该方法可以有效的减少对数据库的查询,缺点是和数据保持的session,时间延长了.
上机练习,把后面的配置加入:
自己完成添加雇员和显示雇员的任务(分页)
修改雇员和删除雇员
把jquery框架整合到我们的项目中.(测试...)
考虑一下用户权限的问题,如果是普通用户.(假设基本为3是管理员)
思考: 目前这个项目的代码复用性不好,我们需要重新整理.
通过在web层和业务层间增加了一套基础接口来提高代码的复用性.
*后面我们还有对项目的优化,包括添加基础接口,基础抽象类. HiberantUtil(分页简单.)
为了大家能够更好的学习ssh,我们决定开发一个大型项目(校内网 sns系统 社会化网络系统 38表)
开发ssh流程
domain---->hibernate.hbm2ddl.auto=update--->自动创建表
关系模型- ---[逆向工程]-->对象模型 (大一点项目,表->domain)
表---->逆向工程----->对象模型
现在过渡一下.写一个浏览本(关系模型-)对象模型),如果前面没有搞清楚 ssh流程的同学,这次好好地听(换成mysql开发)
struts-config.xml 的设计工具来编写 action/actionfrom/jsp...
u 开发内部评论表
(1) 需求
uml 图
(2) 设计表
type表(类型表)
create table type(id int primary key auto_increment,type varchar(64));
content表
create table content(id int primary key auto_increment,name varchar(64) not null,sex char(2) not null, content varchar(2000), typeid int references type(id));
☞ mysql的外键不能简单的使用 typeid int references type(id),而应该使用如下方法;
create table content(id int primary key auto_increment,name varchar(64) not null,sex char(2) not null, content varchar(2000), typeid int, foreign key(typeid) references type(id));
(3) 建立项目 publicbbs
(4) 加入spring的jar包
(5) 创建beans.xml文件,放在src目录下
(6) 引入hibernate(因为后面我们要使用hibernate逆向工程,因此步骤有所变化)
6.1 使用 db broswer来连接我们的mysql
6.2 引入hibernate的jar包
(7) 配置beans.xml
7.1 配置数据源
7.2 配置SessionFactory
7.3 配置事务管理器
(8)使用hibernate的逆向工程,生成domain对象
(9)测试看看能否添加信息 Type (hibernate和 spring整合ok)
(10) .配置hibernate的二级缓存
10.1配置文件
10.2 把二级缓存的jar包,和二级缓存的配置文件放在适当的位置
10.3 在需要的domain对象上,启用二级缓存
10.4 测试ok
(11) 引入struts包(因为我们要使用struts的可视化工具来开发项目,因此,我们这里要通过工具导入struts框架),如果struts的版本你不满意,可以通过重新导入你要的包,来解决这个问题 –》初步测试ok
(12) 把spring容器的初始化工作交给web.xml
(13) 在struts-config.xml文件中配置代理请求处理器
(14) 使用spring 提供的过滤器,处理中文乱码(在web.xml文件中配置)
(15) 在web.xml文件中配置opensessioninview
(16) 把ssh整合,测试一下(添加一个type)测试一把!
(17) 画出框架图