Struts2、Hibernate5、Spring4集成开发步骤:
一、导入Jar包(基本的大致有41个,根据实际项目的需求自己添加)
antlr-2.7.7.jar aopalliance.jar asm-5.1.jar asm-commons-5.1.jar asm-tree-5.1.jar aspectjweaver-1.8.7.jar c3p0-0.9.2.1.jar classmate-1.3.0.jar commons-fileupload-1.3.2.jar commons-io-2.4.jar commons-lang3-3.4.jar commons-logging-1.2.jar dom4j-1.6.1.jar freemarker-2.3.23.jar geronimo-jta_1.1_spec-1.1.1.jar hibernate-commons-annotations-5.0.1.Final.jar hibernate-core-5.1.8.Final.jar hibernate-entitymanager-5.1.8.Final.jar hibernate-jpa-2.1-api-1.0.0.Final.jar jandex-2.0.3.Final.jar javaee.jar javassist-3.20.0-GA.jar jboss-logging-3.3.0.Final.jar jstl-1.2.jar log4j-1.2.17.jar log4j-api-2.7.jar mchange-commons-java-0.2.3.4.jar mysql-connector-java-5.0.5-bin.jar ognl-3.1.12.jar spring-aop-4.3.9.RELEASE.jar spring-aspects-4.3.9.RELEASE.jar spring-beans-4.3.9.RELEASE.jar spring-context-4.3.9.RELEASE.jar spring-core-4.3.9.RELEASE.jar spring-expression-4.3.9.RELEASE.jar spring-jdbc-4.3.9.RELEASE.jar spring-orm-4.3.9.RELEASE.jar spring-tx-4.3.9.RELEASE.jar spring-web-4.1.6.RELEASE.jar struts2-core-2.5.10.1.jar struts2-spring-plugin-2.5.10.1.jar
SSH主要jar包
二、配置Web.xml文件
2.1、配置Struts2的过滤器StrutsPrepareAndExecuteFilter
1 <!-- 配置Struts2的过滤器 --> 2 <filter> 3 <filter-name>Struts2</filter-name> 4 <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>Struts2</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping>
2.2、配置Spring监听器
1 <listener> 2 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 3 </listener>
ContextLoaderListener的作用:
ContextLoaderListener监听器的作用就是启动Web容器/启动服务器的时候(Tomcat)时,自动加载ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。至于ApplicationContext.xml这个配置文件部署在哪,如何配置多个xml文件,官方API文档中说明。
在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。
2.2.1、ContextLoader可以由 ContextLoaderListener和ContextLoaderServlet生成。如果查看ContextLoaderServlet的API,可以看到它也关联了ContextLoader这个类而且它实现了HttpServlet这个接口。
2.2.2、ContextLoader创建的是 XmlWebApplicationContext这样一个类,它实现的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->BeanFactory这样一来spring中的所有bean都由这个类来创建。
2.2.3、如果在web.xml中不写任何参数配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml;
如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:
1 <context-param> 2 <param-name>contextConfigLocation</param-name> 3 <param-value>/WEB-INF/classes/applicationContext-*.xml </param-value> 4 </context-param>
在<param-value> </param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并一“,”号分隔。上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。
所以:applicationContext.xml的文件位置就可以有两种默认实现:
第一种:直接将之放到/WEB-INF下,之在web.xml中声明一个listener;
第二种:将之放到classpath下,但是此时要在web.xml中加入<context-param>,用它来指明你的applicationContext.xml的位置以供web容器来加载。按照Struts2 整合spring的官方给出的档案,写成:
1 <context-param> 2 <param-name>contextConfigLocation</param-name> 3 <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> 4 </context-param>
三、配置Spring的核心配置文件
3.1、在src下新建applicationContext.xml文件,其中要配置的内容包括:
3.1.1、配置数据源
1 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 2 <property name="driverClass" value="com.mysql.jdbc.Driver"></property> 3 <property name="jdbcUrl" value="jdbc:mysql:///ssh"></property> 4 <property name="user" value="root"></property> 5 <property name="password" value="123"></property> 6 </bean>
3.1.2、配置SessionFactory(本身是Hibernate里面的,这里我们是要让Spring给我们管理SessionFactory的创建)
1 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 2 <!-- 因为在hibernate核心配置文件中,没有了数据库配置,数据库配置在spring里面,注入dataSource --> 3 <property name="dataSource" ref="dataSource"></property> 4 <!-- 指定hiberante核心配置文件,有些内容我们是将信息配置在原来的Hibernate核心配置文件中, 5 比如格式化SQL语句(hibernate.format_sql), 6 显示SQL语句(hibernate.show_sql), 7 Hibernate给我们创建及更新表的指令(hibernate.hbm2ddl.auto), 8 Hibernate使用的方言(hibernate.dialect), 9 还有映射文件<mapping class""/>--> 10 <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> 11 </bean>
3.1.3、原来我们在学习Hibernate的时候说过有个事务的概念,现在我们要把事务的管理交给Spring。
1 <!-- 第一步 配置事务管理器 --> 2 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 3 <!-- 注入sessionFactory --> 4 <property name="sessionFactory" ref="sessionFactory"></property> 5 </bean>
3.1.4、如果要采用注解的方式配置哪些方法要进行事务处理,那么就需要做以下事情:
3.1.4.1、在Spring的核心配置文件中配置开启事务注解,写法:
<tx:annotation-driven transaction-manager="transactionManager" />
3.1.4.2、在业务层方法需要事务控制的方法上面添加一个注解,这个注解是@Transactional,但是需要注意的是并不是所有的方法都是需要进行事务处理的,比如说检索/查询操作。
3.1.5、因为我们要对数据库做CRUD(Create/Select/Update/Delete)操作,我们继承了三大框架,而Hibernate就是用来做dao层,dao层就是为了操作数据库的,所以我们要用hibernate操作数据库的类,这个类叫做:HibernateTemplate,记住我们用的是Hibernate5的HibernateTemplate。
还有需要注意的一点是:需要在这里里面配置sessionFactory,也就是说你要在hibernateTemplate里面注入sessionFactory。
------------>其实我们在使用hibernate操作数据库的时候,做的业务操作复杂度远远超出get/load这样的方法,所以我们在做查询这些操作的时候,我们用的并不是简单的hibernateTemplate方法,而是用的Hibernate给我们提供的三个接口里面的两个常用接口,这两个接口的名字是(Query和Criteria)
1 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> 2 <!-- 注入sessionFactory --> 3 <property name="sessionFactory" ref="sessionFactory"></property> 4 </bean>
3.1.6、由于我们在集成开发的时候,用的都是注解,这些注解体现在以下方面:
3.1.6.1、实体类(@Entity、@Id、@one-to-many、@many-to-many、@JoinTable、@JoinColumn等等),所以我们要在Spring的核心配置文件中打开注解扫描功能,写法如下:<context:component-scan base-package="com.chinasofti"></context:component-scan>
备注:如果想要在Spring的核心配置文件中能够写什么标签,一定是需要在命名空间中添加相应的约束:如:
xmlns:aop="http://www.springframework.org/schema/aop"-------------------->这一行代表的是命名空间
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd --------->这一行代表的是具体的约束(约束的意思就是说:spring配置文件中能够写什么标签,以及标签的上下级。)
3.1.7、配置Action
1 <bean id="userAction" class="com.crm.user.action.UserAction" scope="prototype"> 2 <!-- 注解实例化Action,并在Action中注入service --> 3 </bean>
四、在实际开发中,一定要将日志文件引入你的项目工程里面,绝大多数我们都使用Log4j的属性文件,一般都是叫做:log4j.properties,这里面的内容绝对不能去记忆。
log4j.rootLogger=info, stdout----------->这里的info还有一个值是debug,切记在实际开发中如果你的环境是测试环境,那么建议你使用debug,如果在生产环境中必须使用info,如果生产环境使用debug的话,那么你的磁盘将会有很多日志文件,浪费空间。
五、实际开发中,我们一定要区分,dao层和service层,其中service层有的公司也称之为biz层,这个单词的由来是business。
六、我们在学习JavaWeb阶段的时候(中级节点),我们是手动去写日志处理类的(DiyException),也就是我们的异常类。但是在工作中,我们不再写这个异常类,而是使用log4j的属性文件log4j.properties,这里文件里面可以直接定义输入的文件名和具体的日常信息存放位置。
七、在实际开发中,我们觉大多数情况都使用springMVC框架,并不是我们现在学习的SSH框架,而是SSM框架。但是,有些比较老的项目他们使用的还是SSH。
八、在使用注解开发业务程序的时候,分为:
8.1、dao:
我们在dao层要使用hibernate的session,所以还得在这个dao里面注入sessionFactory,注入的方式也有两种,即@Autowired和@Resource。
8.2、service/biz:
需要知道的是:在service/biz中需要注入dao,具体的做法是:在service/biz中添加dao类的对象,写法例子如下:private IUserDao userDao;并且要使用注解进行对类实例化,可以使用自动注入:@Autowired,也可以使用准确注入方式:@Resource(name="dao接口或实现类的对象名")
8.3、我们学过有四个相同功能的注解方式,分别为:
8.3.1、@Repository------->用在DAO层/数据持久化层
8.3.2、@Service--------->用在Service/biz/业务层
8.3.3、@Controller-------->用在控制层
8.3.4、@Component-------->如果无法确定具体的分类,那么就可以使用这个
=========================================================================================================================================================================================================================================
下面的这段话可能在比较高端的面试中会问到,建议大家看看:
StrutsPrepareAndExecuteFilter的作用
FilterDispatcher是早期struts2的过滤器,后期的都用StrutsPrepareAndExecuteFilter了,如 2.1.6、2.1.8。StrutsPrepareAndExecuteFilter名字已经很能说明问题了,prepare与execute,前者表示准备,可以说是指filter中的init方法,即配制的导入;后者表示进行过滤,指doFilter方法,即将request请求,转发给对应的 action去处理。
FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器!
StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的!
StrutsPrepareAndExecuteFilter过滤器中包含相应的功能。
三个初始化参数:
1、config参数:指定要加载的配置文件。逗号分割。
2、actionPackages参数:指定Action类所在的包空间。逗号分割。
3、configProviders参数:自定义配置文件提供者,需要实现ConfigurationProvider接口类。逗号分割。
运行流程:
StrutsPrepareAndExecuteFilte 实现了Filter接口
服务器启动调用StrutsPrepareAndExecuteFilte .init()初始化来初始化几个重要的类,比如Dispatcher
当前台有请求发来,StrutsPrepareAndExecuteFilte 的doFilter()被调用
进行request等的封装,找到相应action,执行相应action