看过了两三个SSH搭建的视频(浪曦风中叶老师、尚学堂李勇老师的两个视频),也跟着视频把这个框架搭了两遍,有点迷迷糊糊的,为了加深印象,我决定不依靠视频再来搭一遍,
经过一天的调试与处理,终于能够独立自主地把SSH框架给搭建起来了,不容易啊。
其中出现的错误以及各种各样的BUG不计其数,通过查阅文档以及Google得到了解决。这里,我就来做一个总结:
SSH框架的基本配置:
1.相关jar包的引入,这里我采用的是spring2 + struts2 + hibernate3的组合,搭完了之后才发现Spring已经到3了,
不知道在Spring3上面的配置是否相同,有待尝试。
- -----核心jar包-----
- # spring.jar
- # struts2-core.jar
- # xwork-core.jar
- # mysql-connector-java.jar
- # hibernate3.jar
- # struts2-spring-plugin.jar
- -----在默认配置下核心jar所依赖的jar包---
- # commons-collections.jar ---|
- # commons-fileupload.jar -----|------------这三个jar包是在jakarta-commons项目中一些
- # commons-logging.jar --------| 基于JDK上扩展的工具包。
- # freemarker.jar
- # log4j.jar
- # ognl.jar
- # dom4j.jar
- # jta.jar
- # cglib-nodep.jar
- # antlr.jar ------------ 这个jar包是spring AOP 采用 动态代理 时需要的jar包。
2.相关的配置
i)/WEB-INF/web.xml
a.需要配置一个Struts2的Filter:
- < 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 >
b.由于从struts2.1.3之后的版本不再建议采用org.apache.struts2.dispatcher.FilterDispatcher,所以,我们最好
配置成StrutsPrepareAndExecuteFilter或者StrutsExecuteFilter以及StrutsPrepareFilter,需要注意的是:如果配置
成StrutsExecuteFilter需要将StrutsPrepareFilter也配置上,否则将会报错。所以建议就只直接采用StrutsPrepareAndExecuteFilter。
c.此外还需要配置一个ContextListener:
- <listener>
- <listener- class >
- org.springframework.web.context.ContextLoaderListener
- </listener- class >
- </listener>
如果你的applicationContext.xml没有配置在/WEB-INF/目录或者采用的不是默认的文件名,则还需要配置context-param,让Spring找到对应的
配置文件,如下(注意:param-name的内容一定是contextConfigLocation,Spring将根据该名称注入到相应的对象中):
- < context-param >
- < param-name > contextConfigLocation </ param-name >
- < param-value > classpath*:application-Context.xml </ param-value >
- </ context-param >
ii)applicationContext.xml,这个文件是比较核心的文件:
a)配置sessionFactory,有两种配置方式:
(1)采用传统的Hibernate配置文件,将其映射到sessionFactory中:
- < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
- < property name = "configLocation" >
- < value > classpath:hibernate.cfg.xml </ value >
- </ property >
- </ bean >
采用这种方式时,需要在hibernate.cfg.xml文件中配置数据连接相关信息,这里与一般的hibernate配置文件一样:
- < hibernate-configuration >
- < session-factory >
- <!-- connection configuration -->
- < property name = "hibernate.connection.driver_class" > com.mysql.jdbc.Driver </ property >
- < property name = "hibernate.connection.url" > jdbc:mysql://localhost:3306/ssh_test </ property >
- < property name = "hibernate.connection.username" > root </ property >
- < property name = "hibernate.connection.password" > orange </ property >
- < property name = "hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ property >
- <!-- the following configuration just for programming and debug -->
- < property name = "hibernate.show_sql" > true </ property >
- <!-- mapping resource -->
- < mapping resource = "com/ssh/bean/User.hbm.xml" />
- </ session-factory >
- </ hibernate-configuration >
(2)采用sessionFactory属性的方式配置数据源相关信息,如下:
- <!-- 配置数据源 -->
- < bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close" >
- < property name = "driverClassName" value = "com.mysql.jdbc.Driver" />
- < property name = "url" value = "jdbc:mysql://localhost:3306/mytest" />
- < property name = "username" value = "root" />
- < property name = "password" value = "orange" />
- < property name = "maxActive" value = "100" />
- < property name = "maxIdle" value = "30" />
- < property name = "maxWait" value = "500" />
- < property name = "defaultAutoCommit" value = "true" />
- </ bean >
- <!-- 将数据源映射到sessionFactory中 -->
- < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
- < property name = "dataSource" ref = "dataSource" />
- < property name = "hibernateProperties" >
- < props >
- < prop key = "hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ prop >
- < prop key = "hibernate.show_sql" > true </ prop >
- </ props >
- </ property >
- < property name = "mappingResources" >
- < list >
- < value > com/test/bean/User.hbm.xml </ value >
- </ list >
- </ property >
- </ bean >
b)配置完sessionFactory后,还可以根据需要配置以下三方面的内容,也可以不配置选择采用默认的方式:
- <!-- 配置事务管理器 -->
- < bean id = "transactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >
- < property name = "sessionFactory" >
- < ref bean = "sessionFactory" />
- </ property >
- </ bean >
- <!-- 配置事务的传播特性 -->
- < tx:advice id = "txAdvice" transaction-manager = "transactionManager" >
- < tx:attributes >
- < tx:method name = "add*" propagation = "REQUIRED" />
- < tx:method name = "del*" propagation = "REQUIRED" />
- < tx:method name = "modify*" propagation = "REQUIRED" />
- < tx:method name = "*" read-only = "true" />
- </ tx:attributes >
- </ tx:advice >
- <!-- 那些类的哪些方法参与事务 -->
- < aop:config >
- < aop:pointcut id = "allManagerMethod" expression = "execution(* xxx.xxx.*.*(..))" />
- < aop:advisor pointcut-ref = "allManagerMethod" advice-ref = "txAdvice" />
- </ aop:config >
这样就基本完成了我们的ssh的相关配置。
3.SSH的基本使用:
具体分工:
# 在applicationContext.xml中配置相关的bean信息
- < bean id = "userService" class = "com.ssh.service.impl.UserServiceImpl" >
- < property name = "userDao" ref = "userDao" />
- </ bean >
- < bean id = "loginAction" class = "com.ssh.action.LoginAction" >
- < property name = "service" ref = "userService" />
- </ bean >
这里的property属性中name值对应的是相应处理类生成时需要IoC容器注入的属性,比如说id为loginAction的处
理类为com.ssh.action.LoginAction(它其中应当设置一个setService(UserService service)方法),这样在需要使
用该bean时,IoC容器会调用这个setService方法来将生成的userService对象传入。
需要注意的是,如果想让IoC容器注入相应属性,则必须要实现相应属性的set方法。
# 在struts.xml中配置action的相关信息
相关注意事项:
由于所有的bean都由Spring来管理,那么在struts.xml中一个action的class属性就不能写成具体的类,
而是要使用该类在applicationContext.xml文件中配置的Bean的id,如:
- < action name = "login" class = "loginAction" >
- < result name = "success" > /result.jsp </ result >
- < result name = "input" > /index.jsp </ result >
- </ action >
这个loginAction对应的就是上面的id为loginAction的bean,而这个bean的class属性中设置的才是真正
的对应的Action的处理类。
# 对于每个模型,都要有一*.hbm.xml
3.其它一些注意点:
Spring中一些的概念很重要:AOP,IOC。