struts2+spring+hibernate+maven搭建簡單web項目

今天我們來整合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;
	}

}
最後我們還是放上全部的代碼:代碼下載


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章