本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頁面中需要使用“對象.屬性名”。