SSH Struts2+hiberante+Spring整合

时间:2021-06-08 19:30:42

使用SSH框架编写学生信息:

一.新建Java工程:

(1)建立好Java各层级之间的结构:业务处理层dao,数据模型层domain,页面请求处理层(Struts2 MVC层)action,service层.

(2)建立好各层的实现类及接口;

(3)建立一个source folder文件夹,用来存放一些配置问价.

(4)改变字节码生成的位置,改为WEB-INF下面的classes文件夹下.

Java工程层级结构如下图:

SSH Struts2+hiberante+Spring整合

二.hibernate整合到Spring容器中

步骤:

1.编写domain,数据模型,此例子为Student类.

package com.xk.ssh.proj.domian;

public class Student {
private Integer id;
private String name;
private Integer age;
private double fees;
private long contact;
public Student() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public double getFees() {
return fees;
}
public void setFees(double fees) {
this.fees = fees;
}
public long getContact() {
return contact;
}
public void setContact(long contact) {
this.contact = contact;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", fees=" + fees + ", contact=" + contact
+ "]";
}
public Student(Integer id, String name, Integer age, double fees, long contact) {
this.id = id;
this.name = name;
this.age = age;
this.fees = fees;
this.contact = contact;
}
public Student( String name, Integer age, double fees, long contact) {
this.name = name;
this.age = age;
this.fees = fees;
this.contact = contact;
}
public Student(Integer id) {
this.id = id;
}
}

2.遍写映射文件,在domain文件夹下编写Student.xml文件.hibernate主要用来管理数据库.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xk.ssh.proj.domian">
<class name="Student" table="Student">
<id name="id" column="s_id">
<generator class="native" />
</id>
<property name="name" column="s_name" />
<property name="age" column="s_age" />
<property name="fees" column="s_fees" />
<property name="contact" column="s_phone" />
</class>
</hibernate-mapping>

3.编写Dao接口及Dao的实现类

package com.xk.ssh.proj.dao;
import java.util.List;
import com.xk.ssh.proj.domian.Student;
public interface IStudentDao {
public void save(Student stu);
public void delete(Student stu);
public void update(Student stu);
public Student get(Student stu);
public List<Student> list();
}
package com.xk.ssh.proj.dao.impl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory; import com.xk.ssh.proj.dao.IStudentDao;
import com.xk.ssh.proj.domian.Student; public class StudentDaoImpl implements IStudentDao {
// 在Dao中注入SessionFaction
private SessionFactory sessionfactory;
public void setSessionfactory(SessionFactory sessionfactory) {
this.sessionfactory = sessionfactory;
}
@Override
public void save(Student stu) {
Session session = sessionfactory.getCurrentSession();
session.save(stu);
}
@Override
public void delete(Student stu) {
Session session = sessionfactory.getCurrentSession();
session.delete(stu);
}
@Override
public void update(Student stu) {
Session session = sessionfactory.getCurrentSession();
session.update(stu);
}
@Override
public Student get(Student stu) {
Session session = sessionfactory.getCurrentSession();
// Student.class:Student的字节码文件
return (Student) session.get(Student.class, stu.getId());
}
@SuppressWarnings("unchecked")
@Override
public List<Student> list() {
// 查询session.createQuery("sql语句").list
Session session = sessionfactory.getCurrentSession();
return session.createQuery("SELECT stu FROM Student stu").list();
}
}

4.拷贝架包:数据驱动的hibernate包,Spring的core,test,bean,context等

antlr-2.7.7.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
dom4j-1.6.1.jar
druid-1.0.15.jar
ehcache-core-2.4.3.jar
freemarker-2.3.22.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.2.0.Final.jar
hibernate-ehcache-4.2.0.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
mysql-connector-java-5.1.40-bin.jar
ognl-3.0.6.jar
servlet-api.jar
slf4j-api-1.6.1.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-test-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
struts2-core-2.3.24.jar
struts2-spring-plugin-2.3.24.jar
xwork-core-2.3.24.jar

5.Spring的配置文件:

  ①添加并配置.properties文件

  

<context:property-placeholder location="classpath:db.properties" />

  ②配置DataSource,连接数据库

  

<!-- 配置DataSource -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 连接数据库 -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

  ④配置SessionFactory:(jdbc/tx/orm架包)

    使用LocalSessionFactoryBean 创建SessionFactory

    配置dataSource和引用

    配置hibernate中的常规配置(方言)

    配置domain的映射文件

  

    <!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 配置连接数据库的信息 此处的name是org.springframework.orm.hibernate4.LocalSessionFactoryBean类中的dataSource
此处的ref是引用配置DateSource中的id -->
<property name="dataSource" ref="dataSource" /> <!-- 配置hibernate常规配置 -->
<property name="hibernateProperties">
<!-- dialect方言 -->
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=none
hibernate.show_sql=true
</value>
</property> <!-- 配置映射文件,告诉Spring框架*.hbm.xml在哪 此处的name是org.springframework.orm.hibernate4.LocalSessionFactoryBean类中的mappingDirectoryLocations
value是自己的对象xml的包的权限定名称 -->
<property name="mappingDirectoryLocations" value="classpath:com/xk/ssh/proj/domian" />
</bean>

6.编写Dao

  ①直接在Dao中注入一个SessionFactory;

private SessionFactory sessionfactory;
public void setSessionfactory(SessionFactory sessionfactory) {
this.sessionfactory = sessionfactory;
}

  ②在Dao中直接使用SessionFactory.getCurrentSession()来得到我们需要的session

  

Session session = sessionfactory.getCurrentSession();

7.在Spring中配置Dao

  ①抽象一个baseDao;

  <bean id = "baseDao" abstract = "true" />

  ②Dao继承BaseDao;

  <bean id="stuDao" parent="baseDao"/>

  

Dao类extends jdbcDaoSupport implements 接口

 8.编写Service

  ①编写Service接口和实现

  

package com.xk.ssh.proj.service;
import java.util.List;
import com.xk.ssh.proj.domian.Student;
public interface IStudentService {
public void save(Student stu);
public void delete(Student stu);
public void update(Student stu);
public Student get(Student stu);
public List<Student> list();
}
 package com.xk.ssh.proj.service.impl;
import java.util.List;
import com.xk.ssh.proj.dao.IStudentDao;
import com.xk.ssh.proj.domian.Student;
import com.xk.ssh.proj.service.IStudentService;
public class StudentServiceImpl implements IStudentService {
private IStudentDao student;
public void setStudent(IStudentDao student) {
this.student = student;
}
@Override
public void save(Student stu) {
student.save(stu);
}
@Override
public void delete(Student stu) {
student.delete(stu);
}
@Override
public void update(Student stu) {
student.update(stu);
}
@Override
public Student get(Student stu) {
return student.get(stu);
}
@Override
public List<Student> list() {
return student.list();
}
}

  ②在Spring中配置事物servicebean

  

<!-- 配置service id为唯一标识,class为service的实现类 name为service实现类中注入的dao层对象 ref为引用Dao -->
<bean id="stuService" class="com.xk.ssh.proj.service.impl.StudentServiceImpl">
<property name="student" ref="stuDao" />
</bean>

 9.配置事物

  

    <!-- 配置事务管理器 -->
<bean id="txMgr"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <!-- 配置事物 事物是配置给service实现的 -->
<aop:config>
<!-- pointcut:切点 ; Advice:通知 advisor:切点和通知的配置器 下面是配置切点:advice-ref:引用通知的ID -->
<aop:pointcut expression="execution(* com.xk.ssh.proj.service.*.*(..))"
id="stuTC" />
<aop:advisor advice-ref="StuAdvice" pointcut-ref="stuTC" />
</aop:config> <tx:advice id="StuAdvice" transaction-manager="txMgr">
<tx:attributes>
<!-- 过滤方法,将所有以get和list开头的方法标记为只读 -->
<tx:method name="get*" read-only="true" />
<tx:method name="list*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>

三.将Struts2 集成在Spring容器

  1.导架包:(spring-web/Struts-spring-plugin...jar)

  2.编写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>
<constant name="struts.action.extension" value="action,nice,,"></constant> <!-- 加后缀 -->
<constant name="struts.devMode" value="true" /> <!-- 小的改动不需要再启动服务器 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 动态调用 --> <package name="hello" extends="struts-default">
<action name="list_*" class="StuAction" method="{1}">
<result name="list">/WEB-INF/views/SSH.jsp</result>
</action>
</package>
</struts>

  3.编写web.xml文件(位置在WEB-INF文件夹下面)

  

<?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>
<constant name="struts.action.extension" value="action,nice,,"></constant> <!-- 加后缀 -->
<constant name="struts.devMode" value="true" /> <!-- 小的改动不需要再启动服务器 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 动态调用 --> <package name="hello" extends="struts-default">
<action name="list_*" class="StuAction" method="{1}">
<result name="list">/WEB-INF/views/SSH.jsp</result>
</action>
</package>
</struts>

  4.编写Action (页面请求)

  

package com.xk.ssh.proj.mvc;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.xk.ssh.proj.domian.Student;
import com.xk.ssh.proj.service.IStudentService;
public class StudentAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private IStudentService studentService;
public void setStudentService(IStudentService studentService) {
this.studentService = studentService;
}
public String list() {
List<Student> list = studentService.list();
ActionContext context = ActionContext.getContext();
context.put("key", list);
System.out.println(list);
return "list";
}
}

5.在applicationcontext.xml中配置action

  

<!-- 配置Action -->
<bean id="StuAction" class="com.xk.ssh.proj.mvc.StudentAction">
<property name="studentService" ref="stuService"/>
</bean>

6.编写Struts的配置文件:在action的class属性中填写的是此action在applicationcontext.xml中对应的bean的id

7.在web.xml中添加listener监听器

8.在web.xml中添加Spring框架启动的加载文件配置路径

<context-param >
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationcontext.xml</param-value>
</context-param>

四.附上完整代码:

 //domain
package com.xk.ssh.proj.domian; public class Student {
private Integer id;
private String name;
private Integer age;
private double fees;
private long contact;
public Student() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public double getFees() {
return fees;
}
public void setFees(double fees) {
this.fees = fees;
}
public long getContact() {
return contact;
}
public void setContact(long contact) {
this.contact = contact;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", fees=" + fees + ", contact=" + contact
+ "]";
}
public Student(Integer id, String name, Integer age, double fees, long contact) {
this.id = id;
this.name = name;
this.age = age;
this.fees = fees;
this.contact = contact;
}
public Student( String name, Integer age, double fees, long contact) {
this.name = name;
this.age = age;
this.fees = fees;
this.contact = contact;
}
public Student(Integer id) {
this.id = id;
}
} //domain的xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xk.ssh.proj.domian">
<class name="Student" table="Student">
<id name="id" column="s_id">
<generator class="native" />
</id>
<property name="name" column="s_name" />
<property name="age" column="s_age" />
<property name="fees" column="s_fees" />
<property name="contact" column="s_phone" />
</class>
</hibernate-mapping>
//dao接口
package com.xk.ssh.proj.dao;
import java.util.List;
import com.xk.ssh.proj.domian.Student;
public interface IStudentDao {
public void save(Student stu);
public void delete(Student stu);
public void update(Student stu);
public Student get(Student stu);
public List<Student> list();
} //dao
package com.xk.ssh.proj.dao.impl; import java.util.List; import org.hibernate.Session;
import org.hibernate.SessionFactory; import com.xk.ssh.proj.dao.IStudentDao;
import com.xk.ssh.proj.domian.Student; public class StudentDaoImpl implements IStudentDao {
// 在Dao中注入SessionFaction
private SessionFactory sessionfactory;
public void setSessionfactory(SessionFactory sessionfactory) {
this.sessionfactory = sessionfactory;
}
@Override
public void save(Student stu) {
Session session = sessionfactory.getCurrentSession();
session.save(stu);
}
@Override
public void delete(Student stu) {
Session session = sessionfactory.getCurrentSession();
session.delete(stu);
}
@Override
public void update(Student stu) {
Session session = sessionfactory.getCurrentSession();
session.update(stu);
}
@Override
public Student get(Student stu) {
Session session = sessionfactory.getCurrentSession();
// Student.class:Student的字节码文件
return (Student) session.get(Student.class, stu.getId());
}
@SuppressWarnings("unchecked")
@Override
public List<Student> list() {
// 查询session.createQuery("sql语句").list
Session session = sessionfactory.getCurrentSession();
return session.createQuery("SELECT stu FROM Student stu").list();
}
}
//service接口
package com.xk.ssh.proj.service;
import java.util.List;
import com.xk.ssh.proj.domian.Student;
public interface IStudentService {
public void save(Student stu);
public void delete(Student stu);
public void update(Student stu);
public Student get(Student stu);
public List<Student> list();
} //service类
package com.xk.ssh.proj.service.impl;
import java.util.List;
import com.xk.ssh.proj.dao.IStudentDao;
import com.xk.ssh.proj.domian.Student;
import com.xk.ssh.proj.service.IStudentService;
public class StudentServiceImpl implements IStudentService {
private IStudentDao student;
public void setStudent(IStudentDao student) {
this.student = student;
}
@Override
public void save(Student stu) {
student.save(stu);
}
@Override
public void delete(Student stu) {
student.delete(stu);
}
@Override
public void update(Student stu) {
student.update(stu);
}
@Override
public Student get(Student stu) {
return student.get(stu);
}
@Override
public List<Student> list() {
return student.list();
}
} //MVC:action类
package com.xk.ssh.proj.mvc;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.xk.ssh.proj.domian.Student;
import com.xk.ssh.proj.service.IStudentService;
public class StudentAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private IStudentService studentService;
public void setStudentService(IStudentService studentService) {
this.studentService = studentService;
}
public String list() {
List<Student> list = studentService.list();
ActionContext context = ActionContext.getContext();
context.put("key", list);
System.out.println(list);
return "list";
}
}
//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>
<constant name="struts.action.extension" value="action,nice,,"></constant> <!-- 加后缀 -->
<constant name="struts.devMode" value="true" /> <!-- 小的改动不需要再启动服务器 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 动态调用 --> <package name="hello" extends="struts-default">
<action name="list_*" class="StuAction" method="{1}">
<result name="list">/WEB-INF/views/SSH.jsp</result>
</action>
</package>
</struts> //applicationcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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:db.properties" /> <!-- 配置DataSource -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 连接数据库 -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean> <!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 配置连接数据库的信息 此处的name是org.springframework.orm.hibernate4.LocalSessionFactoryBean类中的dataSource
此处的ref是引用配置DateSource中的id -->
<property name="dataSource" ref="dataSource" /> <!-- 配置hibernate常规配置 -->
<property name="hibernateProperties">
<!-- dialect方言 -->
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=none
hibernate.show_sql=true
</value>
</property> <!-- 配置映射文件,告诉Spring框架*.hbm.xml在哪 此处的name是org.springframework.orm.hibernate4.LocalSessionFactoryBean类中的mappingDirectoryLocations
value是自己的对象xml的包的权限定名称 -->
<property name="mappingDirectoryLocations" value="classpath:com/xk/ssh/proj/domian" />
</bean> <!-- 配置Dao: 此处ID为唯一标识;class为实现类的权限定 -->
<bean id="stuDao" class="com.xk.ssh.proj.dao.impl.StudentDaoImpl">
<!-- 此处name为StudentDaoimpl类中的注入的sessionFactory ; ref为session工厂的标识 -->
<property name="sessionfactory" ref="sessionFactory" />
</bean> <!-- 配置service id为唯一标识,class为service的实现类 name为service实现类中注入的dao层对象 ref为引用Dao -->
<bean id="stuService" class="com.xk.ssh.proj.service.impl.StudentServiceImpl">
<property name="student" ref="stuDao" />
</bean> <!-- 配置事务管理器 -->
<bean id="txMgr"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <!-- 配置事物 事物是配置给service实现的 -->
<aop:config>
<!-- pointcut:切点 ; Advice:通知 advisor:切点和通知的配置器 下面是配置切点:advice-ref:引用通知的ID -->
<aop:pointcut expression="execution(* com.xk.ssh.proj.service.*.*(..))"
id="stuTC" />
<aop:advisor advice-ref="StuAdvice" pointcut-ref="stuTC" />
</aop:config> <tx:advice id="StuAdvice" transaction-manager="txMgr">
<tx:attributes>
<!-- 过滤方法,将所有以get和list开头的方法标记为只读 -->
<tx:method name="get*" read-only="true" />
<tx:method name="list*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 配置Action -->
<bean id="StuAction" class="com.xk.ssh.proj.mvc.StudentAction">
<property name="studentService" ref="stuService"/>
</bean> </beans>
//test测试类
package com.xk.ssh.proj.test; import java.util.List; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.xk.ssh.proj.domian.Student;
import com.xk.ssh.proj.service.IStudentService; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationcontext.xml")
public class StudentTest {
@Autowired
private IStudentService stuService;
@Test
public void TestStudentSave() throws Exception {
stuService.save(new Student("张1", 11, 1991, 2222));
stuService.save(new Student("张2", 12, 1992, 2222));
stuService.save(new Student("张3", 13, 1993, 2222));
stuService.save(new Student("张4", 14, 1994, 2222));
}
@Test
public void TestStudentDelete() throws Exception {
stuService.delete(new Student(1));
}
@Test
public void TestStudentUptade() throws Exception {
stuService.update(new Student(2, "张阿三", 2, 1123, 12232));
}
@Test
public void TestStudentGet() throws Exception {
Student student = stuService.get(new Student(2));
System.out.println(student);
}
@Test
public void TestStudentList() throws Exception {
List<Student> list = stuService.list();
System.out.println(list);
}
}
//properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring
jdbc.username=root
jdbc.password=root