用tomcat9.0来运行项目,开始用的tomcat8.5就一直报错!!!
整合原理:用spring分别去整合struts2和hibernate!
一、导入jar包:
1、struts2的jar(两部分):
第一部分,自身需要的jar:
第二部分,struts2整合spring需要的jar:
2、hibernate的jar(四部分):
第一部分:自身必要的required下的jar (18个):
第二部分:和JPA相关的jar:
此时发现struts2和hibernate的jar包中都有javassist.jar,可能造成版本冲突,所以删除低版本的javassist!
第三部分:连接池c3p0:
第四部分:mysql连接驱动:
3、spring的jar(四部分):
第一部分:核心jar:
第二部分:aop相关的jar:
第三部分:和orm框架整合的jar:
第四部分:整合web项目的jar:
4、日志相关
如果复制的struts2或者hibernate中有log4j和slf4j相关的jar,建议先删除,再导下面的包!不然可能造成版本冲突!
二、创建模块包和类:
如:User模块:
实体层:
cn.melo.user.entity.User
dao层:
接口:cn.melo.user.dao.UserDao
实现类:cn.melo.user.dao.impl.UserDaoImpl
service层:
接口:cn.melo.user.service.UserService
实现类:cn.melo.user.service.impl.UserServiceImpl
web层:
cn.melo.user.action.UserAction
三、搭建struts2的开发环境:
1、配置过滤器:
打开web.xml文件,配置过滤器:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、编写struts.xml:
名称固定(struts.xml),位置放在src下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- package标签和类上的包类似,用来包住action,属性:
name,随便给值,多个package之间没有相同的name即可
extends,值是固定的(struts-default),表示继承,有了这个,Action才会起作用
namespace,它的值和action中name属性的值构成了在浏览器访问时的路径 -->
<package name="pkg1" extends="struts-default" namespace="/">
<!-- action标签,用来指定访问路径和类,属性:
name:和上面package标签中的namespace构成一个访问路径,值随便给,不重复即可
class:是你的action类的全路径
method:匹配action中的方法 1表示第一个通配符 -->
<action name="user_*" class="cn.melo.user.action.UserAction" method="{1}>
<!-- result标签用来匹配action中的方法,属性
name:写你想要执行的方法的返回值;
type:指定你是想转发还是重定向,默认是转发
result标签的值,写的是要访问的路径! -->
<result name="add">/add.jsp</result>
<!--struts2的2.5版本以后,想要用通配符,必须配好allowed-methods,里面写上方法名,多个方法名之间用逗号隔开-->
<allowed-methods>addUser</allowed-methods>
</action>
</package>
</struts>
四、搭建hibernate的开发环境:
1、编写实体类和hibernate的映射配置文件:
User.java
package cn.melo.user.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer uid;
private String uname;
private Integer uage;
public User() {
super();
}
public User(Integer uid, String uname, Integer uage) {
super();
this.uid = uid;
this.uname = uname;
this.uage = uage;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Integer getUage() {
return uage;
}
public void setUage(Integer uage) {
this.uage = uage;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + ", uage="
+ uage + "]";
}
}
映射配置文件,名称位置不固定,一般名称是实体类名.hbm.xml,位置就放在实体类所在的包下!
User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 实体类和与之对应的表名 -->
<class name="cn.melo.user.entity.User" table="t_user">
<!-- 属性和表字段都是有唯一值的! -->
<id name="uid" column="uid">
<!-- native表示该字段在数据库表中是自增长,且自动增长 -->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表字段的对应关系 -->
<property name="uname" column="uname"></property>
<property name="uage" column="uage"></property>
</class>
</hibernate-mapping>
2、编写hibernate的全局配置文件:
名称(hibernate.cfg.xml),位置(在src下)都是固定的:
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 1、配置数据库信息 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!--数据库url,自己的数据库名不要写错 -->
<property name="hibernate.connection.url">jdbc:mysql:///ssh_demo?serverTimezone=GMT%2b8&useUnicode=true&charcterEncding=utf8</property>
<!--数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!--数据库的登录密码 -->
<property name="hibernate.connection.password">123</property>
<!-- 2、配置Hibernate信息 -->
<!-- 输出SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 如果有表就更新,没有表就创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言 -->
<!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 3、引入映射配置文件 -->
<mapping resource="cn/melo/user/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
五、搭建spring的开发环境:
1、编写spring的配置文件:
名称位置不固定,一般叫applicationContext.xml,且放在src下:
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
2、配置spring的加载:
在web.xml中进行配置,让服务器一开启就加载spring的核心配置文件:
web.xml:
<!-- 监听器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
六、整合spring和struts2:
把action类交给spring管理:
在applicationContext.xml中:
<bean id="userAction" class="cn.melo.user.action.UserAction" scope="prototype"></bean>
因为把action给spring管理了,所以还要修改struts.xml中,把<action>
标签中的class直接改为刚刚在applicationContext.xml中配置的id值:
struts.xml:
<action name="user_*" class="userAction" method="{1}>
七、Spring框架整合hibernate框架
1、 把hibernate核心配置文件中配置数据库信息,把数据库信息在spring进行配置:
hibernate.cfg.xml中的关于数据库配置的信息就可以删除了!在spring中配置:
先创建一个连接数据库参数的配置文件jdbc.properties:
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///ssh_demo?serverTimezone=GMT%2b8&useUnicode=true&charcterEncding=utf8
jdbc.user=root
jdbc.password=123
在applicationContext.xml中配置:
<!--配置数据库连接池 -->
<!--读取外部配置文件 -->
<context:property-placeholder
location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置druid连接池 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"
value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
2、把hibernate的sessionFactory交给spring配置:
applicationContext.xml:
<!-- SessionFactory的配置 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 指定数据库信息 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定使用hibernate的核心配置文件 -->
<property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
</bean>
3、在action中注入service,service中注入dao:
UserAction.java:
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
UserServiceImpl.java:
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
applicationContext.xml:
<!-- 管理action -->
<bean id="userAction" class="cn.melo.user.action.UserAction" scope="prototype">
<!-- action中注入service -->
<property name="userService" ref="userService"></property>
</bean>
<!-- 管理service -->
<bean id="userService" class="cn.melo.user.service.impl.UserServiceImpl">
<!-- 注入dao -->
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 管理dao -->
<bean id="userDao" class="cn.melo.user.dao.impl.UserDaoImpl">
</bean>
4、在dao中使用hibernateTemplate:
UserDaoImpl.java:
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
applicationContext.xml:
<!-- 管理dao -->
<bean id="userDao" class="cn.melo.user.dao.impl.UserDaoImpl">
<!-- 注入HibernateTemplate对象 -->
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<!-- 创建HibernateTemplate对象 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
八、配置事务
applicationContext.xml:
<!-- 配置事务 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在service的实现类上加上注解@Transactional
九、日志配置文件
在src下创建log4j.properties:
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
OK,环境搭建完毕,启动tomcat不报错,且在数据库中建立了表,就表明OK了!
十、总结:
整理好的jar包下载,百度云:
链接:https://pan.baidu.com/s/1FcSlOXUBnsjCnP1XHg2tTg
提取码:ylbg
所有配置文件:
1、applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置数据库连接 -->
<!--配置数据库连接池 -->
<!--读取外部配置文件 -->
<context:property-placeholder
location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置druid连接池 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- SessionFactory的配置 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 指定数据库信息 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定使用hibernate的核心配置文件 -->
<property name="configLocations"
value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 管理action -->
<bean id="userAction" class="cn.melo.user.action.UserAction"
scope="prototype">
<!-- action中注入service -->
<property name="userService" ref="userService"></property>
</bean>
<!-- 管理service -->
<bean id="userService"
class="cn.melo.user.service.impl.UserServiceImpl">
<!-- 注入dao -->
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 管理dao -->
<bean id="userDao" class="cn.melo.user.dao.impl.UserDaoImpl">
<!-- 注入HibernateTemplate对象 -->
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<!-- 创建HibernateTemplate对象 -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置事务 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
2、hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置Hibernate信息 -->
<!-- 输出SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 如果有表就更新,没有表就创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 引入映射配置文件 -->
<mapping resource="cn/melo/user/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
3、jdbc.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///ssh_demo?serverTimezone=GMT%2b8&useUnicode=true&charcterEncding=utf8
jdbc.user=root
jdbc.password=123
4、log4j.proiperties:见上面
5、struts2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- package标签和类上的包类似,用来包住action,属性:
name,随便给值,多个package之间没有相同的name即可
extends,值是固定的(struts-default),表示继承,有了这个,Action才会起作用
namespace,它的值和action中name属性的值构成了在浏览器访问时的路径 -->
<package name="pkg1" extends="struts-default" namespace="/">
<!-- action标签,用来指定访问路径和类,属性:
name:和上面package标签中的namespace构成一个访问路径,值随便给,不重复即可
class:是你的action类的全路径
method:匹配action中的方法 -->
<action name="user_*" class="userAction" method="{1}">
<!-- result标签用来匹配action中的方法,属性
name:写你想要执行的方法的返回值;
type:指定你是想转发还是重定向,默认是转发
result标签的值,写的是要访问的路径! -->
<result name="add">/add.jsp</result>
<result name="list">/list.jsp</result>
<allowed-methods>addUser,listUser</allowed-methods>
</action>
</package>
</struts>
6、User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 实体类和与之对应的表名 -->
<class name="cn.melo.user.entity.User" table="t_user">
<!-- 属性和表字段都是有唯一值的! -->
<id name="uid" column="uid">
<!-- native表示该字段在数据库表中是自增长,且自动增长 -->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表字段的对应关系 -->
<property name="uname" column="uname"></property>
<property name="uage" column="uage"></property>
</class>
</hibernate-mapping>