1、下载文件
Struts 2.5.1,地址:http://www.apache.org/dist/struts/2.5.1/struts-2.5.1-all.zip
Spring 4.3.0,地址:http://repo.spring.io/release/org/springframework/spring/4.3.0.RELEASE/spring-framework-4.3.0.RELEASE-dist.zip
Hibernate 4.3.11,地址:http://211.162.175.14/files/90490000022FD7D4/freefr.dl.sourceforge.net/project/hibernate/hibernate4/4.3.11.Final/hibernate-release-4.3.11.Final.zip
Eclipse 4.5.2,地址:http://mirrors.neusoft.edu.cn/eclipse/eclipse/downloads/drops4/R-4.5.2-201602121500/eclipse-SDK-4.5.2-win32-x86_64.zip
Log4j 2.6.1,地址:http://www.apache.org/dist/logging/log4j/2.6.1/apache-log4j-2.6.1-bin.zip
2、创建工程
2.1、打开Eclipse,新建Project,选择Web - Daynamic Web Object,点击Next。
2.2、设置Project name,例如:sshTest,Target Runtime选择New,弹出页面中选择Apache Tomcat V7.0,Next,选择Tomcat安装目录,选择JRE,点击Finish。工程窗口中点击Next。
2.3、源码与Build Path使用默认的值,点击Next。
2.4、选中Generate web.xml deployment descriptor。点击Finish。
3、创建MySQL数据库test,建立表User,新建用户devel,密码123456,授予devel对test数据库的所有权限。
create database test default charset utf8 collate utf8_general_ci;
use test;
create table user (
id int auto_increment not null,
userName varchar(50) not null,
password char(32) not null,
gender tinyint not null,
primary key(id)
)ENGINE=MyISAM;
grant all privileges on test.* to 'devel'@'localhost' identified by '123456';
4、编辑web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="sshTest" version="3.0" 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">
<display-name>sshTest</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
5、创建WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<a target=_blank href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>"
xmlns:xsi="<a target=_blank href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"
xmlns:tx="<a target=_blank href="http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx</a>"
xmlns:aop="<a target=_blank href="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a>"
xsi:schemaLocation="
<a target=_blank href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a> <a target=_blank href="http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">http://www.springframework.org/schema/beans/spring-beans-4.3.xsd</a>
<a target=_blank href="http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx</a> <a target=_blank href="http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">http://www.springframework.org/schema/tx/spring-tx-4.3.xsd</a>
<a target=_blank href="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a> <a target=_blank href="http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">http://www.springframework.org/schema/aop/spring-aop-4.3.xsd</a>
">
<bean id="autowired" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true</value>
</property>
<property name="user">
<value>devel</value>
</property>
<property name="password">
<value>123456</value>
</property>
<property name="maxPoolSize">
<value>80</value>
</property>
<property name="minPoolSize">
<value>1</value>
</property>
<property name="initialPoolSize">
<value>1</value>
</property>
<property name="maxIdleTime">
<value>20</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>org/ssh/beans/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseDao" class="org.ssh.daoImpl.UserDao">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="userManager" class="org.ssh.serviceImpl.UserManagerImpl">
<property name="dao">
<ref bean="baseDao" />
</property>
</bean>
<bean id="registerAction" class="org.ssh.action.RegisterAction">
<property name="userManager">
<ref bean="userManager" />
</property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="bussinessService" expression="execution(* org.ssh.daoImpl.*.*(..))" />
<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
</aop:config>
</beans>
6、各种文件与类
org.ssh.action.RegisterAction.java
package org.ssh.action;
import com.opensymphony.xwork2.ActionSupport;
import org.ssh.forms.UserForm;
import org.ssh.service.UserManager;
public class RegisterAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private UserForm user;
private UserManager userManager;
public UserForm getUser() {
return user;
}
public void setUser(UserForm user) {
this.user = user;
}
public UserManager getUserManager() {
return userManager;
}
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
public String execute() {
try {
userManager.regUser(user);
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
}
}
}
RegisterAction.java同目录下建立RegisterAction-validation.xml
<?xml version="1.0" encoding="GBK"?>
<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
-->
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 添加对用户名的校验 -->
<field name="user.userName">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[\w{6,16}]]></param>
<message>用户名输入不合法,必须为长度在6~16中间的数字或字母</message>
</field-validator>
</field>
<!-- 添加对密码的校验 -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[\w{6,16}]]></param>
<message>密码输入不合法,必须为长度在6~16之间的数字或者字母</message>
</field-validator>
</field>
</validators>
org.ssh.beans.User.java
package org.ssh.beans;
public class User {
private int id;
private String userName;
private String password;
private int gender;
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public void setUserName(String userName){
this.userName = userName;
}
public String getUserName(){
return userName;
}
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return password;
}
public void setGender(int gender){
this.gender = gender;
}
public int getGender(){
return gender;
}
}
User.java同目录下建立User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.ssh.beans.User" table="USER">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="userName" type="java.lang.String">
<column name="USERNAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
<property name="gender" type="int">
<column name="GENDER" />
</property>
</class>
</hibernate-mapping>
org.ssh.dao.BaseDao.java
package org.ssh.dao;
import org.hibernate.HibernateException;
import org.hibernate.Session;
public interface BaseDao {
public void saveObject(Object obj) throws HibernateException;
}
org.ssh.daoImpl.UserDao.java
package org.ssh.daoImpl;
<p>import org.hibernate.HibernateException;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;</p><p>import org.ssh.dao.BaseDao;</p><p>public class UserDao extends HibernateDaoSupport implements BaseDao {
@Override
public void saveObject(Object obj) throws HibernateException {
HibernateTemplate htpl = getHibernateTemplate();
htpl.save(obj);
htpl.flush();
}</p><p>}
</p>
org.ssh.forms.UserForm.java
package org.ssh.forms;
public class User {
private String userName;
private String password;
private int gender;
public void setUserName(String userName){
this.userName = userName;
}
public String getUserName(){
return userName;
}
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return password;
}
public void setGender(int gender){
this.gender = gender;
}
public int getGender(){
return gender;
}
}
org.ssh.service.UserManager.java
package org.ssh.service;
import org.ssh.forms.UserForm;
public interface UserManager {
public void regUser(UserForm user);
}
org.ssh.serviceImpl.UserManagerImpl.java
package org.ssh.serviceImpl;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.codec.digest.DigestUtils;
import org.ssh.beans.User;
import org.ssh.dao.BaseDao;
import org.ssh.forms.UserForm;
import org.ssh.service.UserManager;
public class UserManagerImpl implements UserManager {
private BaseDao dao;
private Session session;
@Autowired
private HttpServletRequest request;
public void setDao(BaseDao dao) {
this.dao = dao;
}
public BaseDao getDao() {
return dao;
}
@Override
public void regUser(UserForm userForm) throws HibernateException {
System.out.println("Register from IP Address: " + request.getRemoteAddr());
User user = new User();
BeanUtils.copyProperties(userForm, user);
user.setPassword(DigestUtils.md5Hex(userForm.getPassword()));
dao.saveObject(user);
}
}
org.ssh.serviceImpl.HibernateSessionFactory.java
package org.ssh.serviceImpl;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateSessionFactory {
private static final String CFG_FILE_LOCATION = "hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static final Configuration cfg = new Configuration().configure(CFG_FILE_LOCATION);
private static StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
private static ServiceRegistry registry;
private static SessionFactory sessionFactory;
public static Session currentSession() throws HibernateException {
Session session = threadLocal.get();
if (session == null || session.isOpen() == false) {
if (sessionFactory == null) {
try {
registry = builder.build();
sessionFactory = cfg.buildSessionFactory(registry);
} catch (Exception e) {
e.printStackTrace();
}
}
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void closeSession() throws HibernateException {
Session session = threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
}
src/hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="HibernateSessionFactory">
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true</property>
<property name="hibernate.connection.username">devel</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="org/ssh/beans/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
src/hibernate.properties
hibernate.temp.use_jdbc_metadata_defaults=false
hibernate.bytecode.use_reflection_optimizer=false
src/log4j.properties
log4j.rootLogger=warn, stdout
log4j.logger.cn.sengtang=debug
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
src/struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<include file="struts-default.xml" />
<constant name="struts.objectFactory" value="spring" />
<package name="org.ssh" extends="struts-default">
<action name="register" class="registerAction">
<result name="input">/Register.jsp</result>
<result name="success">/Success.jsp</result>
<result name="error">/Failed.jsp</result>
</action>
</package>
</struts>
WebContent/Register.jsp
<%@ 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>User Register Page</title>
</head>
<body>
<s:form action="register">
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:password name="user.password" label="密码"></s:password>
<s:select list="#{'1':'男','0':'女'}" listKey="key" listValue="value" name="user.gender" label="性别" value="1"></s:select>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
WebContent下的Success.jsp与Failed.jsp随便写一句话即可,这里略过。
7、WEB-INF/lib下的jar文件:
antlr-2.7.7.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
c3p0-0.9.2.1.jar
commons-codec-1.10.jar
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
commons-lang3-3.4.jar
commons-logging-1.1.3.jar
dom4j-1.6.1.jar
freemarker-2.3.23.jar
hibernate-c3p0-4.3.11.Final.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-4.3.11.Final.jar
hibernate-entitymanager-4.3.11.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
log4j-api-2.5.jar
log4j-core-2.5.jar
mchange-commons-java-0.2.3.4.jar
ognl-3.1.8.jar
spring-aop-4.3.0.RELEASE.jar
spring-aspects-4.3.0.RELEASE.jar
spring-beans-4.3.0.RELEASE.jar
spring-context-4.3.0.RELEASE.jar
spring-context-support-4.3.0.RELEASE.jar
spring-core-4.3.0.RELEASE.jar
spring-expression-4.3.0.RELEASE.jar
spring-instrument-4.3.0.RELEASE.jar
spring-instrument-tomcat-4.3.0.RELEASE.jar
spring-jdbc-4.3.0.RELEASE.jar
spring-jms-4.3.0.RELEASE.jar
spring-messaging-4.3.0.RELEASE.jar
spring-orm-4.3.0.RELEASE.jar
spring-oxm-4.3.0.RELEASE.jar
spring-test-4.3.0.RELEASE.jar
spring-tx-4.3.0.RELEASE.jar
spring-web-4.3.0.RELEASE.jar
spring-webmvc-4.3.0.RELEASE.jar
spring-webmvc-portlet-4.3.0.RELEASE.jar
spring-websocket-4.3.0.RELEASE.jar
struts2-core-2.5.1.jar
struts2-spring-plugin-2.5.1.jar
备注:
1、将各种action/service/dao/托管给Spring,必须在struts.xml中设置
<constant name="struts.objectFactory" value="spring" />
这样struts.xml中设置的action的类就能用ID指向applicationContext.xml中的bean的ID
struts.xml: <action name="register" class="registerAction">
applicationContext.xml: <bean id="registerAction" class="org.ssh.action.RegisterAction">
<property name="userManager">
<ref bean="userManager" />
</property>
</bean>
2、在Spring能作用的类中,需要引用HttpServletRequest时,必须设置如下三点:
1)applicationContext.xml中设置Autowired处理器
<bean id="autowired" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
2)web.xml中添加Request监听
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
3)在java文件中添加@Autowired注释
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
Class AnyClass {
@Autowired
private HttpServletRequest request;
}