今天我们来整合struts2,spring,hibernate三大框架,来把之前的框架简单入门的知识串联起来。
一:spring整合struts2
首先我们还是建立一个ssh的maven项目
pom.xml文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.julyday</groupId>
<artifactId>ssh</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ssh Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<commons-lang.version>2.6</commons-lang.version>
<slf4j.version>1.7.6</slf4j.version>
<spring.version>4.3.3.RELEASE</spring.version>
<jackson.version>2.5.4</jackson.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.1</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<!-- spring hibernate -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.1.Final</version>
</dependency>
<!-- mysql连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
<build>
<finalName>ssh</finalName>
</build>
</project>
这里说明下,之前我们的struts用的是2.3的版本,后面出了一个很大的漏洞,这次我们直接把struts的版本更新到2.5,当然2.5版本和之前有了不少的区别,这里大家注意下。
首先我们还是配置web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app 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"
version="3.0" metadata-complete="true">
<display-name>ssh</display-name>
<!-- spring上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Struts2配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.julyday.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
这里我们需要注意的是struts2的filter-class,已经改成了org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,对struts熟悉的同学会发现少了一个ng。
接着我们把domain,dao,service.action建立起来。
public class User {
private int id;
private String name;
private String password;
//getter setter
}
public class UserDaoImpl implements UserDao {
@Override
public void save(User user) {
System.out.println("UserDaoImpl save...");
}
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save(User user) {
userDao.save(user);
System.out.println("UserServiceImpl save...");
}
}
public class UserAction extends ActionSupport{
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public String save(){
System.out.println("UserAction save...");
HttpServletRequest request = ServletActionContext.getRequest();
String name = request.getParameter("name");
String password = request.getParameter("password");
User u = new User();
u.setName(name);
u.setPassword(password);
userService.save(u);
request.setAttribute("name", name);
return SUCCESS;
}
}
当然有些朋友还不习惯注解方式的,这里我们先用xml方式的,后面再用注解,大家也可以看看我之前写的文章。
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:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean name="userDao" class="com.julyday.dao.impl.UserDaoImpl"></bean>
<bean name="userService" class="com.julyday.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="user" extends="struts-default" namespace="/">
<action name="index">
<result>/jsp/index.jsp</result>
</action>
<action name="save" method="save" class="com.julyday.action.UserAction">
<result>/jsp/success.jsp</result>
</action>
</package>
</struts>
当然我们也可以把action的创建交给spring
<!-- spring默认单例,而struts2默认一个action请求一个实例的 -->
<bean name="userAction" class="com.julyday.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
<!-- action创建交给spring来创建 -->
<package name="user" extends="struts-default" namespace="/">
<action name="index">
<result>/jsp/index.jsp</result>
</action>
<action name="save" method="save" class="userAction">
<result>/jsp/success.jsp</result>
</action>
</package>
ok,下面我们再用注解实现一遍。
@Repository("userDao2")
public class UserDaoImpl2 implements UserDao {
@Autowired
public void setSessionFactoryOverride(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
@Override
public void save(User user) {
System.out.println("UserDaoImpl2 save...");
}
}
@Service("userService2")
public class UserServiceImpl2 implements UserService {
@Autowired
private UserDao userDao2;
@Override
public void save(User user) {
userDao2.save(user);
System.out.println("UserServiceImpl2 save...");
}
}
@Namespace("/user")
@ParentPackage("struts-default")
public class UserAction2 extends ActionSupport{
@Autowired
private UserService userService2;
@Action(value = "index", results = {
@Result(name = "success", location = "/jsp/user/index.jsp")})
public String index(){
return SUCCESS;
}
@Action(value = "save", results = {
@Result(name = "success", location = "/jsp/user/success.jsp")})
public String save(){
System.out.println("UserAction2 save...");
HttpServletRequest request = ServletActionContext.getRequest();
String name = request.getParameter("name");
String password = request.getParameter("password");
User u = new User();
u.setName(name);
u.setPassword(password);
userService2.save(u);
request.setAttribute("name", name);
return SUCCESS;
}
}
struts.properties;
struts.objectFactory = spring
#让struts2关闭动态方法调用
struts.enable.DynamicMethodInvocation=true
#所有匹配*.action,*.do的请求都由struts2处理
#struts.action.extension=do,action
#所有匹配的请求都由struts2处理
#除了/ 和 /index.jsp
struts.action.extension=
struts.action.excludePattern=/,/index.jsp
#是否启用开发模式
struts.devMode=false
#设置浏览器是否缓存静态内容
struts.serve.static.browserCache=false
#请求参数的编码方式
struts.i18n.encoding=utf-8
#每次HTTP请求系统都重新加载资源文件,有助于开发
struts.i18n.reload=true
# 文件上传最大值10m
struts.multipart.maxSize=104857600
#Action名称中是否还是用斜线
struts.enable.SlashesInActionNames=false
#允许标签中使用表达式语法
struts.tag.altSyntax=true
#对于WebLogic,Orion,OC4J此属性应该设置成true
struts.dispatcher.parametersWorkaround=false
applicationContext.xml增加:
<!-- 自动扫描 -->
<context:component-scan base-package="com.julyday"/>
spring整合struts2就ok了。
二:spring整合hibernate
整合Hibernate就需要数据库。
jdbc.properties:
#mysql version database druid setting
validationQuery=SELECT 1
jdbc.url=jdbc:mysql://localhost:3306/ssh?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
我们这里使用的数据源是阿里巴巴的Druid,他是可以更具你的数据库url自动找到相应的driverClass的。
<!-- 引入jdbc文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 使用的是Druid数据源 -->
<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="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="20" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000" />
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="33" />
<!-- 用来检测有效sql -->
<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="mergeStat" />
</bean>
<!-- myBatis文件 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- hibernate属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 映射文件 -->
<property name="mappingResources">
<list>
<value>com/julyday/domain/user.hbm.xml</value>
</list>
</property>
<!--自动扫描实体 -->
<property name="packagesToScan" value="com.julyday.domain" />
<!-- hibernate.cfg.xml 也是可以的 -->
<!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>-->
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 注解方式配置事物 -->
<tx:annotation-driven transaction-manager="transactionManager" />
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
@Override
public void save(User user) {
System.out.println("UserDaoImpl save...");
getHibernateTemplate().save(user);
}
}
@Repository("userDao2")
public class UserDaoImpl2 extends HibernateDaoSupport implements UserDao {
@Autowired
public void setSessionFactoryOverride(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
@Override
public void save(User user) {
System.out.println("UserDaoImpl2 save...");
getHibernateTemplate().save(user);
}
}
我们在dao层都是去继承HibernateDaoSupport,这样我们可以使用getHibernateTemplate()。
@Transactional
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save(User user) {
userDao.save(user);
System.out.println("UserServiceImpl save...");
}
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>index.jsp</title>
</head>
<body>
<s:form action="save" method="post" namespace="/user">
<div style="margin-left: 300px;margin-top: 200px">
<s:textfield name="name" label="姓名:"></s:textfield>
<s:password name="password" label="密码:"></s:password>
<s:submit value="登录"></s:submit>
</div>
</s:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>success.jsp</title>
</head>
<body>
欢迎您:${name}<br><br/>
</body>
</html>
这时候我们就整合完成了。
我们也可以使用Hibernate的注解:
package com.julyday.domain;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="admin")
@SuppressWarnings("serial")
public class Admin implements Serializable{
private int id;
private String name;
private String password;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="name",length = 20)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="password",length = 16)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
最后我们还是放上全部的代码:
代码下载