本demo实现的是一个简单的登陆功能。
1、开发环境
MyEclipse 10+JDK1.6+Tomact7+Struts 2.3.28.1+Spring 2.0.8+Hibernate 3.2.0
2、准备工作
新建一个web项目,并下载相应的jar包。
引入的所有jar包:
注:如果出现包冲突现象,留下高版本。
3、搭建Struts2
1)引入jar包:asm-3.3.jar
commons-fileupload-1.3.1.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
ognl-3.0.14.jar
struts2-core-2.3.28.1.jar
xword-core-2.3.28.1.jar
2)在Web.xml中配置struts2:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><!--配置struts2 -->
<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></span>
3) 从struts2压缩包中拷贝出一个struts.xml文件放置src目录下。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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>
<!-- 设置成开发模式,开启它则默认开启了i18n.reload、configuration.xml.reload -->
<constant name="struts.devMode" value="true" />
<!--把扩展名配置为action -->
<constant name="struts.action.extension" value="action" />
<!--把主题配置为simple -->
<constant name="struts.ui.theme" value="simple" />
<!-- 将Action的创建交给spring来管理 -->
<constant name="struts.objectFactory" value="spring" />
<!--一个package可以包含多个action,一个Struts可以包含多个package -->
<!--package起到分类的作用,支持继承 -->
<package name="struts2" extends="struts-default">
<!--方法一 -->
<!-- <action name="login" class="com.jmj.struts2.LoginAction"> <result
name="success">/main.jsp</result> <result name="input">/login.jsp</result>
</action> -->
<!-- 方法二 -->
<!--class值设为了loginAction,即LoginAction类的bean的ID。这样我们就把LoginAction类交给了spring管理。 -->
<action name="login" class="loginAction">
<result name="success">/main.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
</span>
4、 搭建Spring
1)引入的jar包:spring.jar
log4j-1.2.14.jar
commons-logging.jar2)在src下建立application.xml文件
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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: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-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- Spring整合Hibernate主要是对hibernate的Session进行管理,包含Session的创建、提交、关闭的整个生命周期。 -->
<!--配置sessionFactory,让spring来创建Session -->
<!--我们原来是用HibernateSessionFactory.java来创建Session的,现在删除即可, 交给Spring创建。这里,创建了一个Session工厂类的Bean,其ID为“sessionFactory”。 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<!-- 配置事务管理器 -->
<!--这里创建了一个id为transactionManager的事务管理器,它匹配一个session工厂, <ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--对事务管理器进行事务设置 -->
<!--这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。 -->
<tx:advice id="smAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 把事务应用到具体类 -->
<!-- <aop:config>
<aop:pointcut id="smMethod" expression="execution(*test.service.impl.*.*(..))" />
<aop:advisor pointcut-ref="smMethod" advice-ref="smAdvice" />
</aop:config> -->
<!--注入sessionFactory -->
<bean id="userDao" class="com.jmj.hibernate.UserDaoImpl" scope="singleton">
<!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--注入userDao -->
<bean id="userManager" class="com.jmj.spring.UserManagerImpl">
<property name="userDao" ref="userDao" />
</bean>
<!--写action和业务逻辑层依赖注入 -->
<!--将scope设置成prototype,预防了线程安全问题 -->
<!--注入userManger -->
<bean id="loginAction" class="com.jmj.struts2.LoginAction" scope="prototype">
<property name="userManager" ref="userManager" />
</bean>
</beans>
</span>
3)在web.xml中添加对application.xml文件的引用
<span style="font-family:KaiTi_GB2312;font-size:18px;"><!--配置applicationContext.xml -->
<!-- * 从类路径下加载spring的配置文件, 多个配置文件可以用逗号和空格区分 * classpath: 关键字特指类路径下加载 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param></span>
5、搭建Hibernate
1)引入的jar包:Hibernate3.jar
dom4j-1.6.1.jar
commons-logging-1.0.4.jar
commons-collections-2.1.1.jar
cglib-nodep-2.2.3.jar
jta.jar
asm.jar
antlr-2.7.6.jar:hibernate执行hql语句
2)在src目录下,建立hibernate.cfg.xml文件,配置数据库连接和hibernate与数据库对象的关系映射文件。<span style="font-family:KaiTi_GB2312;font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 连接数据库配置 -->
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- hibernate_first为你的数据库名称 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/s2sh_user</property>
<property name="hibernate.connection.username">用户名</property>
<property name="hibernate.connection.password">密码</property>
<!-- 配置适配器 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- validate 加载hibernate时,验证创建数据库表结构 -->
<!-- create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。 -->
<!-- create-drop 加载hibernate时创建,退出是删除表结构 -->
<!-- update 加载hibernate自动更新数据库结构 -->
<!-- hibernate与数据库的对象关系映射文件**.hbm.xml -->
<mapping resource="/com/jmj/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration></span>
3)建立对象关系映射文件:User.hbm.xml
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?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="com.jmj.domain.User" table="t_user">
<id name="id" >
<generator class="uuid"></generator>
</id>
<property name="username"/>
<property name="password"></property>
</class>
</hibernate-mapping></span>
6、整合S2SH框架
1)引入的jar包:struts2-spring-plugin-2.3.28.1.jar -----struts2和spring整合的jar包
mysql-connector-jar-3.1.13-bin.jar:mysql数据库驱动
2)在web.xml文件中,加入监听<span style="font-family:KaiTi_GB2312;font-size:18px;"><listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener></span>
3)其他部分的代码详解
UserDaoImpl.java:
<span style="font-family:KaiTi_GB2312;font-size:18px;">/**
* @Title: UserDaoImpl.java
* @Package com.jmj.hibernate
* @Description: TODO
* @author meng
* @date 2016-5-17 下午7:46:27
*/
package com.jmj.hibernate;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.jmj.domain.User;
/**
* ClassName: UserDaoImpl
*
* @Description: TODO
* @author meng
* @date 2016-5-17 下午7:46:27
*/
public class UserDaoImpl
extends
HibernateDaoSupport
implements
UserDao
{
@SuppressWarnings({ "unused",
"rawtypes" })
public boolean findUserByUserName(
String username,String password)
{
List list=this.getHibernateTemplate().find("from User u where u.username=? and password=?",new String[]{username,password});
if (null==list|| list.isEmpty())
{
return false;
}
return true;
//删除、添加、更新用户
/*this.getHibernateTemplate().delete(user)
save(user)
update(user)*/
}
}
</span>
UserManagerImpl.java
<span style="font-family:KaiTi_GB2312;font-size:18px;">/**
* @Title: UserManagerImpl.java
* @Package com.jmj.spring
* @Description: TODO
* @author meng
* @date 2016-5-17 上午11:46:23
*/
package com.jmj.spring;
import java.util.List;
import com.jmj.domain.User;
import com.jmj.hibernate.UserDao;
/**
* ClassName: UserManagerImpl
* @Description: TODO
* @author meng
* @date 2016-5-17 上午11:46:23
*/
public class UserManagerImpl
implements
UserManager
{
private UserDao userDao;
public UserDao getUserDao()
{
return userDao;
}
public void setUserDao(
UserDao userDao)
{
this.userDao = userDao;
}
/* (non-Javadoc)
* @see com.jmj.spring.UserManager#findUser(java.lang.String, java.lang.String)
*/
public boolean findByUserName(String username,String password){
if(this.userDao.findUserByUserName(username,password))
{
return true;
}
return false;
}
}
</span>
LoginAction.java
<span style="font-family:KaiTi_GB2312;font-size:18px;">/**
* @Title: LoginAction.java
* @Package com.jmj.struts
* @Description: TODO
* @author meng
* @date 2016-5-17 上午10:24:44
*/
package com.jmj.struts2;
import java.util.Map;
import com.jmj.domain.User;
import com.jmj.spring.UserManager;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* ClassName: LoginAction
* @Description: 登陆Action
* @author meng
* @date 2016-5-17 上午10:24:44
*/
public class LoginAction
extends
ActionSupport
{
private User user;
public User getUser()
{
return user;
}
public void setUser(
User user)
{
this.user = user;
}
private UserManager userManager;
public UserManager getUserManager()
{
return userManager;
}
public void setUserManager(
UserManager userManager)
{
this.userManager = userManager;
}
@Override
public String execute()
throws Exception
{
if(userManager.findByUserName(user.getUsername(),user.getPassword())){
return SUCCESS;
}
return INPUT;
}
@Override
public void validate()
{
if (user.getUsername()==null || user.getUsername().length()==0)
{
super.addActionError("用户名不能为空!");
}
if (user.getPassword()==null||user.getPassword().length()==0)
{
super.addActionError("密码不能为空!");
}
}
}
</span>
User.java
<span style="font-family:KaiTi_GB2312;font-size:18px;">/**
* @Title: User.java
* @Package com.jmj.hibernate
* @Description: TODO
* @author meng
* @date 2016-5-17 上午11:38:31
*/
package com.jmj.domain;
/**
* ClassName: User
* @Description: TODO
* @author meng
* @date 2016-5-17 上午11:38:31
*/
public class User
{
private String id;
private String username;
private String password;
public String getId()
{
return id;
}
public void setId(
String id)
{
this.id = id;
}
public String getUsername()
{
return username;
}
public void setUsername(
String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(
String password)
{
this.password = password;
}
}
</span>
JSP页面:
login.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;"><form action="login.action">
<!--此种方式是action中有相应的属性 -->
<%-- 用户名:<s:textfield name="username"/><br>
密码:<s:password name="password"/><br>
<s:submit value="提交"/> --%>
<!--此种方式是action中引用model -->
用户名:<s:textfield name="user.username"/><br>
密码:<s:password name="user.password"/><br>
<s:submit value="提交"/>
<!-- 用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="登陆"> -->
</form>
</span>
main.jsp
<span style="font-family:KaiTi_GB2312;font-size:18px;">欢迎【<s:property value="user.username"/>】登陆!</span>
知识拓展:
在action 里面定义要接收的参数,并提供相应的setter,getter,则Jsp页面可以直接使用此属性名;而在action中引用model层的模型,保存其对象,则jsp页面中需要使用“对象.属性名”。