一、创建动态WEB项目
开发工具:eclipse
项目结构:struts2+spring+hibernate
数据库: mysql
1、准备Struts2的相关jar包
struts官网下载“struts-2-xxx-all”,解压后进入它的apps文件中能看到几个war文件,随便找一个war文件解压之后找到它的WEB-INF下的lib文件。
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.2.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
log4j-api-2.3.jar
log4j-core-2.3.jar
ognl-3.0.19.jar
struts2-core-2.3.30.jar
xwork-core-2.3.30.jar
2、导入struts2-spring-plugin-2.3.30.jar
struts2-spring-plugin-2.3.30.jar
作用:当引入这个插件后,原先struts创建的action类,交给了spring创建。
在struts2-spring-plugin.jar中有一个struts-plugin.xml,里面声明了action类由spring工厂创建。这个插件重写了struts的对象工厂,当创建一个action类时,它会根据struts的配置文件的class属性的值与spring配置文件中的id属性的值相匹配。如果没有与之匹配,将会像没有使用这个插件前一样创建,然后由spring自动装配。
3、导入spring的相关jar包
spring-aop-3.2.17.RELEASE.jar
spring-aspects-3.2.17.RELEASE.jar
spring-beans-3.2.17.RELEASE.jar
spring-context-3.2.17.RELEASE.jar
spring-context-support-3.2.17.RELEASE.jar
spring-core-3.2.17.RELEASE.jar
spring-expression-3.2.17.RELEASE.jar
spring-instrument-3.2.17.RELEASE.jar
spring-instrument-tomcat-3.2.17.RELEASE.jar
spring-jdbc-3.2.17.RELEASE.jar
spring-jms-3.2.17.RELEASE.jar
spring-orm-3.2.17.RELEASE.jar
spring-oxm-3.2.17.RELEASE.jar
spring-struts-3.2.17.RELEASE.jar
spring-test-3.2.17.RELEASE.jar
spring-tx-3.2.17.RELEASE.jar
spring-web-3.2.17.RELEASE.jar
spring-webmvc-3.2.17.RELEASE.jar
spring-webmvc-portlet-3.2.17.RELEASE.jar
4、导入“Hibernate”的相关jar包。
导入“hibernate3.jar”
进入lib文件下导入“required”下的所有jar。
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
slf4j-api-1.6.1.jar
导入jap相关的jar。
hibernate-jpa-2.0-api-1.0.1.Final.jar
5、导入其他必须包:
导入log4j.jar
导入commons-logging、commons-dbcp、commons-pool、commons-fileupload、commons-io
导入数据库驱动包
导入junit包
6、最后大概需要的jar包如下:
antlr-2.7.6.jar
aopalliance-1.0.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
aspectjrt-1.7.0.jar
aspectjweaver-1.7.0.jar
commons-collections-3.1.jar
commons-dbcp-1.2.1.jar
commons-fileupload-1.3.2.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.2.jar
commons-pool-1.3.jar
dom4j-1.6.1.jar
freemarker-2.3.22.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
junit-4.10.jar
log4j-1.2.17.jar
log4j-api-2.3.jar
log4j-core-2.3.jar
mysql-connector-java-5.1.21-bin.jar
ognl-3.0.19.jar
slf4j-api-1.6.1.jar
spring-aop-3.2.17.RELEASE.jar
spring-aspects-3.2.17.RELEASE.jar
spring-beans-3.2.17.RELEASE.jar
spring-context-3.2.17.RELEASE.jar
spring-context-support-3.2.17.RELEASE.jar
spring-core-3.2.17.RELEASE.jar
spring-expression-3.2.17.RELEASE.jar
spring-instrument-3.2.17.RELEASE.jar
spring-instrument-tomcat-3.2.17.RELEASE.jar
spring-jdbc-3.2.17.RELEASE.jar
spring-jms-3.2.17.RELEASE.jar
spring-orm-3.2.17.RELEASE.jar
spring-oxm-3.2.17.RELEASE.jar
spring-struts-3.2.17.RELEASE.jar
spring-test-3.2.17.RELEASE.jar
spring-tx-3.2.17.RELEASE.jar
spring-web-3.2.17.RELEASE.jar
spring-webmvc-3.2.17.RELEASE.jar
spring-webmvc-portlet-3.2.17.RELEASE.jar
struts2-core-2.3.30.jar
struts2-spring-plugin-2.3.30.jar
xwork-core-2.3.30.jar
7、导入log4j对应的log4j.properties文件。
log4j.rootLogger=ERROR
log4j.addivity.org.apache=true
log4j.appender.Root.Encoding=UTF-8
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.com.opensymphony.xwork2=WARN
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS} %p %l]%m%n
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=${LOG_DTR}/user.log
log4j.appender.FILE.Encoding=UTF-8
#这个这个appender的阈值级别
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.DatePattern='_'yyyyMMddHH'.log'
#默认值是true,即将消息增加到指定文件中,false指
log4j.appender.FILE.Append=true
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS} %p %l]%m%n
8、创建jdbc.properties属性文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=root
9、创建beans.xml,即spring的配置文件
<?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">
<!--启用spring的annotation-->
<context:annotation-config />
<!--指定扫描annotation的package的范围-->
<context:component-scan base-package="com.kinsey.ssh01" />
<!--引入jdbc.properties配置问津-->
<context:property-placeholder location="classpath*:jdbc.properties" />
<!--配置数据源信息-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<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>
<!--配置Hibernate的sessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--配置实体类包的范围-->
<property name="packagesToScan" value="com.kinsey.ssh01.model" />
<!--注入hibernate属性配置-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean>
<!--配置spring事务-->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--配置aop,spring是通过aop来进行事务管理的-->
<aop:config>
<!--设置那些方法要加入事务管理-->
<aop:pointcut id="allMethods" expression="execution(* com.kinsey.ssh01.dao.*.*(..))" />
<!--配置具体要加入事务控制的方法-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
</aop:config>
<!--配置那些方法要加入事务控制-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
</beans>
9、创建struts.xml,struts的配置文件。
<?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>
<!--基于常量的配置 Begin-->
<!--配置struts的action的请求后缀,这里的配置表示可以是action也可以是do-->
<constant name="struts.action.extension" value="action,do,yao" />
<!--配置当修改struts配置文件的时候就会重新加载-->
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.devMode" value="true" />
<!--让spring管理action-->
<constant name="struts.objectFactory" value="spring" />
<!--基于常量的配置 End-->
<package name="default" namespace="/" extends="struts-default">
<!--基于通配符的配置-->
<action name="*_*" class="{1}Action" method="{2}">
<result>/WEB-INF/jsp/{1}/{2}.jsp</result>
<!-- <result name="input">/WEB-INF/jsp/{1}/{2}Input.jsp</result>
<result type="redirect" name="redirect_list">/${url}</result>-->
</action>
</package>
</struts>
10、在web.xml中配置spring的监听器,struts的过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 创建spring的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--创建struts的过滤器-->
<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>
<!--spring 的监听器可以通过这个上下文参数来获取beans.xml的位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:beans.xml</param-value>
</context-param>
</web-app>
11、创建对应action
package com.kinsey.ssh01.action;
import com.kinsey.ssh01.model.Team;
import com.kinsey.ssh01.service.ITeamService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import javax.persistence.Entity;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/26
* Time: 18:42
*/
@Controller(value = "teamAction")
@Scope("prototype")
public class TeamAction extends ActionSupport implements ModelDriven<Team> {
private ITeamService teamService ;
private Team team ;
public ITeamService getTeamService() {
return teamService;
}
@Resource
public void setTeamService(ITeamService teamService) {
this.teamService = teamService;
}
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
@Override
public Team getModel() {
if(team==null) team=new Team() ;
return team;
}
public String list(){
ActionContext.getContext().put("gl",teamService.getAllTeam());
return SUCCESS ;
}
}
12、创建公共的dao及实现类
package com.kinsey.ssh01.dao;
import java.util.List;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/23
* Time: 14:24
*/
public interface IMyBaseDao<T> {
void add(T t) ;
void update(T t) ;
void delete(int id) ;
T load(int id) ;
List<T> list(String sql, Object[] args) ;
List<T> list(String sql) ;
List<T> list(String sql, Object arg) ;
}
对应实现类:
package com.kinsey.ssh01.dao;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import javax.annotation.Resource;
import java.lang.reflect.ParameterizedType;
import java.util.List;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/23
* Time: 14:26
*/
public class MyBaseDaoImpl<T> extends HibernateDaoSupport implements IMyBaseDao<T> {
/**
* 此处不能使用setSessionFactory()注入,因为setSessionFactory()在HibernateDaoSupport中已经定义了,且是final类型的。
* @param sessionFactory
*/
@Resource(name = "sessionFactory")
public void setSupperSessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
@Override
public void add(T t) {
this.getHibernateTemplate().save(t) ;
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
@Override
public void delete(int id) {
this.getHibernateTemplate().delete(this.load(id));
}
@Override
public T load(int id) {
return (T) this.getHibernateTemplate().load(getGenericType(),id);
}
@Override
public List<T> list(String sql, Object[] args) {
Query query = this.getSession().createQuery(sql) ;
if(args!=null){
for(int i=0;i<args.length;i++){
query.setParameter(i,args[i]);
}
}
return query.list() ;
}
@Override
public List<T> list(String sql) {
return this.list(sql,null);
}
@Override
public List<T> list(String sql, Object arg) {
return this.list(sql,new Object[]{arg});
}
/**
* 创建一个Class的对象来获取泛型的class
*/
private Class genericType ;
public Class getGenericType() {
if(genericType==null){
genericType =(Class<T>)(((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]);
}
return genericType;
}
}
13、创建对应的dao和实现类
package com.kinsey.ssh01.dao;
import com.kinsey.ssh01.model.Team;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/26
* Time: 18:43
*/
public interface ITeamDao extends IMyBaseDao<Team> {
}
实现类:
package com.kinsey.ssh01.dao;
import com.kinsey.ssh01.model.Team;
import org.springframework.stereotype.Repository;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/26
* Time: 18:43
*/
@Repository("teamDaoImpl")
public class TeamDaoImpl extends MyBaseDaoImpl<Team> implements ITeamDao {
}
14、创建对应的service以及实体类
实体类:
package com.kinsey.ssh01.model;
import javax.annotation.Resource;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/26
* Time: 18:43
*/
@Entity
@Table(name = "t_team")
public class Team {
private int id ;
private String name ;
public Team() {
}
@GeneratedValue
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
service接口:
package com.kinsey.ssh01.service;
import com.kinsey.ssh01.model.Team;
import java.util.List;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/26
* Time: 18:46
*/
public interface ITeamService {
List<Team> getAllTeam();
}
Sevice实现:
package com.kinsey.ssh01.service;
import com.kinsey.ssh01.dao.ITeamDao;
import com.kinsey.ssh01.model.Team;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created with IntelliJ IDEA
* Created By Kinsey
* Date: 2016/8/26
* Time: 18:47
*/
@Service("teamService")
public class TeamService implements ITeamService {
private ITeamDao teamDaoImpl ;
public ITeamDao getTeamDaoImpl() {
return teamDaoImpl;
}
@Resource
public void setTeamDaoImpl(ITeamDao teamDaoImpl) {
this.teamDaoImpl = teamDaoImpl;
}
@Override
public List<Team> getAllTeam() {
return teamDaoImpl.list("from Team");
}
}
15、创建对应的要显示的jsp文件
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2016/8/26
Time: 16:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>group</title>
</head>
<body>
<s:iterator value="#gl">
${id}------${name}---<br/>
</s:iterator>
</body>
</html>
16、请求路径:
http://localhost:8080/ssh/team_list.action
17、请求效果: