您的位置:首页 > 其它

SSH框架集成

2013-04-29 00:00 148 查看
struts+spirng+hibernate集成

1、struts

(1)创建JavaWebProject

(2)添加struts类库(基本类库6)

commons-fileupload-1.2.1.jar

commons-io-1.3.2.jar

freemarker-2.3.15.jar

ognl-2.7.3.jar

struts2-core-2.1.8.1.jar

xwork-core-2.1.6.jar

(3)在web.xml文件中添加过滤器---配置过滤器

<filter>

<filter-name>struts2</filter-name>

<filter-class>

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

(4)添加src下添加struts.xml配置文件

(5)启动web服务器测试

http://127.0.0.1:8080/ssh/

(6)完成页面跳转

(a)创建index.jsp

/WEB-INF/jsp/index.jsp

(b)创建MainAction

(c)在struts.xml中配置action

<package name="ssh-default" extends="struts-default">

<default-action-ref name="mainAction" />

<action name="mainAction"

class="com.tarena.web.action.MainAction">

<result name="index">/WEB-INF/jsp/index.jsp</result>

</action>

</package>

(d)测试跳转是否成功

(7)项目分层

(1)在src下创建一个类库

config.struts.struts.xml

(2)修改web.xml配置文件

<filter>

....

<init-param>

<param-name>config</param-name>

<param-value>struts-default.xml,struts-plugin.xml,config/struts/struts.xml</param-value>

</init-param>

</filter>

(3)测试

(4)在struts.xml文件中添加常量

<constant name="struts.ui.theme" value="simple"/>

<constant name="struts.i18n.encoding" value="UTF-8"/>

<constant name="struts.devMode" value="true"/>

<constant name="struts.configuration.xml.reload" value="true"/>

<constant name="struts.serve.static.browserCache" value="false"/>

(5)在config/struts/struts-user.xml

在struts-user.xml引用struts-user.xml

<include file="config/struts/struts-user.xml"/>

(6)提取通用标签文件

/common/taglab.jsp

(7)在index.jsp添加标签

<%@ include file="/common/taglab.jsp"%>

编写注册页面

(8)创建SaveUserAction.java

(9)在config/struts-user.xml中配置SaveUserAction

(10)编写index.jsp--->ok.jsp

(11)测试

(12)创建实体类

com.tarena.entity.User.java

(13)添log4j配置文件和类库

在src下添加log4j.properties

commons-logging.jar

log4j-1.2.15.jar

(14)测试参数是否传递成功

2、struts+spring集成

(1)添加spring类库

spring.jar

dom4j-1.6.1.jar

cglib-nodep-2.1_3.jar

(2)strut2集成sping类库

struts2-spring-plugin-2.1.8.1.jar

(3)添加spring配置文件

config/spring/applicationContext.xml

作用:spring公共信息

<<applicationContext.xml>>

(4) 在web.xml文件中添加spring监听器

<!-- 添加spring监听器 -->

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

classpath:config/spring/applicationContext.xml

</param-value>

</context-param>

(5)测试

(6)spring管理struts2中action

(a)在struts.xml文件添加struts对象spring支持

<constant name="struts.objectFactory" value="spring"/>

(b)spring管理struts2中Action,在spring文件中配置

<!-- new MainAction -->

<bean id="mainAction" class="com.tarena.web.action.MainAction"/>

<!-- new SaveUserAction -->

<bean id="saveUserAction" class="com.tarena.web.action.SaveUserAction">

</bean>

(c)修改struts*文件信息

struts.xml文件中

<action class="com.tarena.web.action.MainAction">

class="mainAction"换成spring配置文件中<bean id="mainAction">

</action>

struts-user.xml文件中

同样

(d)测试

3、struts+spring+hibernate

添加mysql驱动包

(1)添加hibernate类库

slf4j-nop-1.5.8.jar

slf4j-api-1.5.8.jar

jta-1.1.jar

javassist-3.9.0.GA.jar

hibernate3.jar

commons-collections-3.1.jar

antlr-2.7.6.jar

(2)添加hibernate配置文件

config.hibernate.cfg/hibernate.cfg.xml

config.hibernate.hbm/User.hbm.xml

利用ExportUtil生成关系模型,并测试配置是否正确

******************************************

* spring管理hibernate的数据源 *

******************************************

(5)spirng管理hibernate

(a)配置spring数据源

hibernate推荐: c3p0连接池

spring官方推荐使用连接池:DBCP连接池

(b)添加DBCP连接池类库

commons-pool.jar

commons-dbcp.jar

(c)连接池类:

在applicationContext中配置BasicDataSource

spring管理hibernate配置文件:

<!-- spring管理hibernate

名字必须使用:sessionFactory

-->

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="configLocations">

<list>

<value>

classpath:config/hibernate/cfg/hibernate.cfg.xml

</value>

</list>

</property>

</bean>

spring管理hibernate的数据源:

添加config/props/db.properties

<<db.properties>>

<!-- spring读取属性文件 -->

<bean id="propertyPlaceholderConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<list>

<value>classpath:config/props/db.properties</value>

</list>

</property>

</bean>

<!-- 配置连接池 -->

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="${driverClassName}"/>

<property name="url" value="${url}"/>

<property name="username" value="${username}"/>

<property name="password" value="${password}"/>

<!-- 配置连接池参数 -->

<!-- 初始化连接数:默认0

使用完不去关闭,而是放回到连接池中,等待下次调用

-->

<property name="initialSize" value="${initialSize}" />

<!-- 最大并发数:默认8个 -->

<property name="maxActive" value="${maxActive}" />

<!-- 最大等待连接数 默认为8 负数表示无限制连接数,不建议使用 -->

<property name="maxIdle" value="${maxIdle}" />

<property name="minIdle" value="${minIdle}" />

<!-- 等待时常默认为无限期,建议不能使用,一般是60000ms -->

<property name="maxWait" value="${maxWait}" />

<property name="removeAbandoned" value="${removeAbandoned}" />

<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />

</bean>

<!-- spring管理hibernate

名字必须使用:sessionFactory

-->

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<!-- spring管理数据源 -->

<property name="dataSource" ref="dataSource" />

<!-- spring管理hibernate属性 -->

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">

${dialect}

</prop>

<prop key="hibernate.format_sql">${format_sql}</prop>

<prop key="hibernate.show_sql">${show_sql}</prop>

</props>

</property>

<!-- 管理orm映射文件 -->

<property name="mappingLocations">

<list>

<value>

classpath:config/hibernate/hbm/User.hbm.xml

</value>

</list>

</property>

</bean>

连接池配置参数:

initialSize :连接池启动时创建的初始化连接数量

(默认值initialSize :连接池启动时创建的初始化连接数量(默认值为0)

maxActive :连接池中可同时连接的最大的连接数

(默认值为8 ,调整为20,高峰单机器在20并发左右,自己根据应用场景定)

maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个)

minIdle:连接池中最小的空闲的连接数,低于这个数量会创建新的连接(默认为0,调整为5,

该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的,但是不能太大,

因为在机器很空闲的时候,也会创建低于minIdle个数的连接)

maxWait :最大等待时间,当没有可用 连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,

如果设 置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限期挂起)

removeAbandonedTimeout :超过时间限制,回收没有用(废弃)的连接 (默认为 300秒,调整为180)

removeAbandoned :超过 removeAbandonedTimeout时间后,是否进行没用连接(废弃)的回收(默认为 false,调整为true)

注意:连接池的大小需要根据压力测试报告信息来设置

在spring配置里完全管理hibernate配置文件:删除hibernate.cfg.xml文件

(6)编写测试spring配置文件工具类

test.spring.TestSpring

(7)编写com.tarena.Dao

(a)com.tarena.dao.IUserDao

(b)com.tarena.dao.impl.UserDaoImpl

(c)UserDaoImpl

extends HibernateDaoSupport

implements IUserDao

(d)在spring配置文件添加Dao(UserDaoImpl)管理

<!-- new UserDaoImpl() -->

<bean id="UserDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">

<property name="sessionFactory" ref="sessionFactory"/>

</bean>

(e)编写getUserById方法

(f)测试(junit4.4)

添加junit4.4类库 junit-4.4.jar

insert into t_user(username,password)values('java','1234');

使用HibernateDaoSupport时,异常如何处理???

(8)配置声明事务管理

web biz dao

转账{

开启事务

加钱 加钱(){}

减钱 减钱(){}

提交事务

}

存钱(){

加钱(){}

}

一个转账功能必须让加钱、 减钱 运行在一个事务中,

spring管理的数据源可以自动提交事务,先让 dao(加钱\减钱)

的事务挂起,让他运行在biz(转账)层 事务中!改变事务规则

使用规则(PROPAGATION_REQUIRES_NEW)

事务一般配置在哪个层:在业务层

添加spring事务类库

aspectjrt.jar

aspectjweaver.jar

<tx:>、<aop:>类库添加标记类库:

<tx:>标记实现事务通知

<!-- 配置spirng声明事务管理 -->

<!-- spring事务事务管理 -->

<bean id="hibernateTransactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

<!--事务通知-->

<tx:advice id="logAdvice" transaction-manager="hibernateTransactionManager">

<!--定义规则*统配 -->

<tx:attributes>

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="delete*" propagation="REQUIRED"/>

<tx:method name="save*" propagation="REQUIRED"/>

<tx:method name="get*" propagation="NOT_SUPPORTED"/>

<tx:method name="find*" propagation="NOT_SUPPORTED"/>

</tx:attributes>

</tx:advice>

<aop:config>

<!--定义一个切入点-->

<aop:pointcut id="tranPointCut" expression="execution(* com.tarena.biz.*.*(..))"/>

<!--定义方面: 通知织入到切面-->

<aop:advisor advice-ref="logAdvice" pointcut-ref="tranPointCut"/>

</aop:config>

声明式事务管理:

了解事务的几种传播特性

(1)PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启。

(2)PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

(3)PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

(4)PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

(5)PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。

(6)PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常。

(7)PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中.

如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行

(9)在业务层调用数据访问层

(a)创建接口com.tarena.biz.IUserServ

(b)创建实现类com.tarena.biz.impl.UserServImpl

private IUserDao iuserDao;

set(){

}

(c)在spring配置文件中完成依赖关系配置

<!-- biz -->

<bean id="userServImpl" class="com.tarena.biz.impl.UserServImpl">

<!--IUserDao iuserDao = new UserDaoImpl()-->

<property name="iuserDao" ref="userDaoImpl"/>

</bean>

(10)使用junit测试业务层

(11)在表示层调用业务层

(1)添加属性

private IUserServ iuserServ;

set(){

}

(2)在spring 配置文件中配置

<bean id="saveUserAction"

class="com.tarena.web.action.SaveUserAction">

<!--IUserServ iuserServ = new UserServImpl()-->

<property name="iuserServ" ref="userServImpl"/>

</bean>

(12)整体测试项目(一定OK)

引入其它配置文件:

Struts2 <include file="config/struts/struts-user.xml" />

Hibernate <mapping resource="config/hibernate/hbm/User.hbm.xml"/>

Spring <import resource="applicationContext-dao.xml"/>

注意,spring使用相对路径

(13)spring Test 使用注解方式

(a)添加spring 测试类库

spring-test.jar

junit-4.4.jar

注意: 本版本只支持spring2.5.6

(b)参看UserDaoImplTest.java类

//添加测试类

@RunWith(SpringJUnit4ClassRunner.class)

//加载spring容器中的对象

@ContextConfiguration(

locations = {

"classpath:config/spring/applicationContext.xml"

})

//set注入:相当于显示提供set方法

@Autowired

private IUserDao iuserDao;

注解优势:编写方便

缺点:注解依赖代码类,后期维护需要修改代码,还需要重新对java类进行编译和大量测试

注解目前不成熟和稳定,版本变化比较快,存在兼容性问题

建议:在测试代码中可以使用注解

14、分层管理spring配置文件

applicationContext.xml:spring公共信息

applicationContext-web.xml管理struts2的action

applicationContext-biz.xml管理业务层的Bean

applicationContext-dao.xml管理数据访问层Bean

方式一引入:

在applicationContext.xml中引入其他spring配置文件

<import resource="applicationContext-web.xml"/>

<import resource="applicationContext-biz.xml"/>

<import resource="applicationContext-dao.xml"/>

方式二引入:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

可以使用统配符*

classpath:config/spring/applicationContext*.xml

</param-value>

</context-param>

15、spring如何解决hibernate延迟问题

以前解决延迟:

(1)Lazy不使用延迟,让hibernate立即加载

(2)自定一个拦截器或者过滤器

(3)可以使用spring内部提供openSessionInViewFilter来解决

懒加载问题

(a)在web.xml文件中配置过滤器

<filter>

<filter-name>openSessionInViewFilter</filter-name>

<filter-class>

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

</filter-class>

<init-param>

<!--openSessionInViewFilter默认数据源名字叫sessionFactory

如果数据源名字不叫sessionFactory,必须制定sessionFactoryBeanName的value值

-->

<param-name>sessionFactoryBeanName</param-name>

<param-value>sessionFactory</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>openSessionInViewFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

//load

16、spring中文过滤器

(1)自定一个过滤器-------------------------------------------------------------------???

(2)struts2

<constant name="struts.i18n.encoding" value="UTF-8"/>

(3)其他框架(除struts2框架)

使用spring过滤器,在web.xml文件中配置filter

<filter>

<filter-name>characterEncodingFilter</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>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>characterEncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

17、spring读取属性文件

(1)注入spring读取属性类(appliactionContext.xml)

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<list>

<value>classpath:config/props/db.properties</value>

</list>

</property>

</bean>

(2)创建config/props/db.properties文件

(3)通过key==属性文件中(value)取值

${key}=value

18、操作HQL、QBC、SQL------------------------------------------------------分别熟悉这几种语句的使用

1、查询所有

getHibernateTemplate().find(hql)

2、根据id查询

getHibernateTemplate().find(hql,obj).get(0);

3、修改、删除

getHibernateTemplate().bulkUpdate(hql);

getHibernateTemplate().bulkUpdate(hql,obj);

getHibernateTemplate().bulkUpdate(hql,obj[]); \

1、查询所有 返回值List

public List<User> findAllUser1(){

return this.getHibernateTemplate().executeFind(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException {

String hql = "from User";

Query query = session.createQuery(hql);

return query.list();

}});

}

2、根据id查询、修改、删除 返回Object

public User findUserById1(final User user){

return (User)this.getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException {

String hql = "from User u where u.userId=:userId";

//完成删、改、id查询

}});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ssh 框架集成