1.创建Maven项目
2. 在pom.xml文件中写入spring,struts,hibernate的依赖
<!-- struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.14</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.14</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.14</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.0.Final</version>
</dependency>
3. 在web.xml中配置spring和struts的过滤器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
<!-- Struts2的核心过滤器配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- Struts2过滤器拦截所有的.action请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
4. 创建spring和struts的配置文件
<!-- spring-config.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"
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">
<!-- 引入属性文件,config.properties位于src/main/resources目录下 -->
<context:property-placeholder location="classpath:config.properties" />
<!-- 自动扫描dao和service包(自动注入) -->
<context:component-scan base-package="edu.zju.j.dao,edu.zju.j.service" />
</beans>
<!-- struts.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 指定由spring负责action对象的创建 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 所有匹配*.action的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发模式(开发时设置为true,发布到生产环境后设置为false) -->
<constant name="struts.devMode" value="true" />
<!-- struts配置文件改动后,是否重新加载(开发时设置为true,发布到生产环境后设置为false) -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容(开发时设置为false,发布到生产环境后设置为true) -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 每次HTTP请求系统都重新加载资源文件,有助于开发(开发时设置为true,发布到生产环境后设置为false) -->
<constant name="struts.i18n.reload" value="true" />
<!-- 文件上传最大值 -->
<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 让struts2支持动态方法调用,使用叹号访问方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- Action名称中是否还是用斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="false" />
<!-- 允许标签中使用表达式语法 -->
<constant name="struts.tag.altSyntax" value="true" />
<!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
<constant name="struts.dispatcher.parametersWorkaround" value="false" />
<package name="basePackage" extends="struts-default">
</package>
</struts>
5.Spring依赖注入(注解注入和配置文件配置两种方式)
StudentService和UserService为接口,分别被StudentServiceImpl和UserServiceImpl继承。
5.1 注解注入(UserServiceImpl)
@Service("userService")
public class UserServiceImpl implements UserService {
public void printW() {
System.out.println("userService");
}
}
调用过程如下:
UserService userService = (UserService) applicationContext.getBean("userService");
userService.printW();
5.2 配置文件配置
public class StudentServiceImpl implements StudentService {
public void read() {
System.out.println("Student read");
}
}
在配置文件spring-config.cml中添加
<bean id="studentService" class="edu.zju.j.serviceimpl.StudentServiceImpl"></bean>
调用过程与注解注入相同
StudentService studentService = (StudentService) applicationContext.getBean("studentService");
studentService.read();
6. 使用Struts(注解和配置文件两种方式)
使用了两个Action,其中ReadAction采用注解方式配置,StudentAction采用配置文件方式配置
6.1 注解
@Action("readAction")
public class ReadAction {
@Autowired
private UserService userService;//自动装配属性对象
public void read(){
userService.printW();
System.out.println("readAction read");
}
}
@Action("readAction")定义了该Action类url映射为readAction
@Autowired
private UserService userService; //自动装配属性对象
readAction read
6.2 配置文件
public class StudentAction {
@Autowired
private StudentService studentService;//自动装配属性对象
public void write(){
studentService.read();
System.out.println("StudentAction action");
}
}
在struts.xml中配置Action 信息,注意struts.xml文件名称不能拼写错误,否则会发生action匹配不到的错误
<package name="edu.zju.j.action" namespace="/" extends="struts-default">
<action name="studentAction" class="edu.zju.j.action.StudentAction" method="write()">
</action>
</package>
package标签属性:
-
-
-
- name:包的名称。必须配置
-
-
-
-
-
- extends:要继承的包,后面配置的是被继承的包的名称。可选
-
-
-
-
-
- namespace:包的命名空间。同一个命名空间里面不能有同名的Action,不同的命名空间里面是可以有同名的Action的。namespace可以有效的防止action重名的冲突,因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。可选
- abstract:定义包为抽象的,也就是不能包含Action的定义。可选
-
-
StudentAction action
7.Hibernate
7.1 pom.xml中添加Hibernate依赖和mysql驱动依赖
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.0.Final</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
7.2 添加数据库连接池jar包
数据库连接池向数据库申请一定数量的数据库连接,然后放到一个连接池中,当需要操作数据库时,就从数据库连接池中取出一个数据库连接,通过从连接池中获取到的数据库连接对象连接上数据库,然后进行CRUD操作。
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.12</version>
</dependency>
7.3 添加aspectjweaver包
使用Spring的aop时需要使用到aspectjweaver包,所以需要添加aspectjweaver包
<!-- aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.2</version>
</dependency>
7.4 配置连接数据库信息
在config.properties文件中设置数据库连接相关参数
hibernate.dialect=org.hibernate.dialect.MySQLDialect
driverClassName=com.mysql.jdbc.Driver
validationQuery=SELECT 1
jdbc_url=jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc_username=root
jdbc_password=
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true
在spring-config.xml文件或者新建一个xml文件进行配置数据库
<!-- 数据库配置 -->
<!-- 配置数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
<property name="driverClassName" value="${driverClassName}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="20" />
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="20" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000" />
<!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> -->
<property name="validationQuery" value="${validationQuery}" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="25200000" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
<!-- 监控数据库 -->
<!-- <property name="filters" value="stat" /> -->
<property name="filters" value="mergeStat" />
</bean>
<!-- 配置hibernate session工厂 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<!-- web项目启动时是否更新表结构 -->
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<!-- 系统使用的数据库方言,也就是使用的数据库类型 -->
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<!-- 是否打印Hibernate生成的SQL到控制台 -->
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<!-- 是否格式化打印出来的SQL -->
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
</props>
</property>
<!-- 自动扫描注解方式配置的hibernate类文件 -->
<property name="packagesToScan">
<list>
<value>edu.zju.j.entity</value>
</list>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 注解方式配置事务 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
<!-- 拦截器方式配置事务 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 以如下关键字开头的方法使用事务 -->
<tx:method name="add*" />
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="modify*" />
<tx:method name="edit*" />
<tx:method name="delete*" />
<tx:method name="remove*" />
<tx:method name="repair" />
<tx:method name="deleteAndRepair" />
<!-- 以如下关键字开头的方法不使用事务 -->
<tx:method name="get*" propagation="SUPPORTS" />
<tx:method name="find*" propagation="SUPPORTS" />
<tx:method name="load*" propagation="SUPPORTS" />
<tx:method name="search*" propagation="SUPPORTS" />
<tx:method name="datagrid*" propagation="SUPPORTS" />
<!-- 其他方法不使用事务 -->
<tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<!-- 切面,将事务用在哪些对象上 -->
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* edu.zju.j..*Impl.*(..))" />
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
</aop:config>
有两种配置事务的方式,一种是使用拦截器配置事务,另一种是使用
@Transactional配置事务
同样对于实体类与数据库表的映射也存在两种方式,一种采用配置文件进行映射,另一种直接通过注解进行映射。
7.5 创建一个Entity类(采用注解形式与数据库表对应)
@Entity
@Table(name = "student")
public class Student {
@Id
@Column(name = "Id")
private String Id;
@Column(name = "name")
private String name;
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用注解@Entity指明该类是个实体Bean,@Table指定了该实体类所映射的数据库表,@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,@Id用来注解一个主键。
JPA 中将一个类注解成实体类(entity class)有两种不同的注解方式:基于属性(property-based)和基于字段(field-based)的注解。
1,基于字段的注解,就是直接将注解放置在实体类的字段的前面。前面的 Employee 实体类就是使用的这种注解方式;
2,基于属性的注解,就是直接将注解放置在实体类相应的 getter 方法前面,而不是 setter 方法前面(这一点和 Spring 正好相反)。前面的 Employee 实体类如果使用基于属性注解的方式就可以写成如下形式。
但是同一个实体类中必须并且只能使用其中一种注解方式,要么是基于属性的注解,要么是基于字段的注解。两种不同的注解方式,在数据库中对应的数据库表是相同的,没有任何区别。
7.6 使用配置文件方式映射数据库表
在spring-config.xml的hibernate session工厂下添加属性
<!-- 自动扫描hbm方式配置的hibernate文件和.hbm文件 -->
<property name="mappingLocations">
<list>
<value>classpath:hibernate.hbm.xml</value>
</list>
</property>
hibernate.hbm.xml中为实体类到数据库表映射的关系
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-9-29 8:46:32 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="edu.zju.j.entity.User" table="user">
<id name="name" type="java.lang.String">
<column name="name" />
</id>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</class>
</hibernate-mapping>
7.7 编写DAO接口
StudentDAO接口定义了一个保存Student信息的方法
public interface StudentDao {
Serializable save(Student student);
}
StudentDAOImpl类实现StudentDAO接口
@Repository("studentDao")
public class StudentDaoImpl implements StudentDao {
@Autowired
private SessionFactory sessionFactory;
public Serializable save(Student student) {
return sessionFactory.getCurrentSession().save(student);
}
}
@Repository用于标注数据访问组件,即DAO组件
7.8 在Service层中调用DAO接口方法
在StudentService中添加一个save方法,并在StudentServiceImpl中实现
@Transactional
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
public void save(Student student){
studentDao.save(student);
}
}
使用@Transactional
在业务逻辑代码中掺杂事务管理
7.9 测试
在测试类中添加测试代码
@Test
public void testHibernate(){
StudentService studentService = (StudentService)applicationContext.getBean("studentService");
Student student = new Student();
student.setName("jzq");
student.setId("1");
studentService.save(student);
}
表中会添加一条信息
参考文章:https://www.cnblogs.com/xdp-gacl/p/4239501.html