今天我們來整合struts2,spring,hibernate三大框架,來把之前的框架簡單入門的知識串聯起來。
一:spring整合struts2
<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>
<?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。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方式的,後面再用註解,大家也可以看看我之前寫的文章。<?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>
<!-- 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就需要數據庫。#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>
這時候我們就整合完成了。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;
}
}
最後我們還是放上全部的代碼:代碼下載