通過登錄案例實現三大框架之間的整合,登錄功能是任何系統和軟件必不可少的一個模塊,然而通過這個模塊來認識這些復雜的框架技術,理解數據流向和整個設計思路是相當容易的。只有在掌握了這些小模塊的應用后,才能輕松的去研究和設計出更有創意的,更加嚴密的系統。
本人通過學習,實現了這個小功能,現在將實現思想和過程總結如下。希望各位大神朋友多多審查,有什么不到位的地方,請通過郵件告訴我(it_red@sina.com),在此表示感謝;新手朋友,我相信這個例子會是你進入框架領域的第一個完整的DEMO。當你部署成功后,你一定會相當自豪的,同時也有了學習更深知識的信心,如果你還有什么不明白的或者需要該DEMO的源碼,請留言或者發郵件告訴我,我們共同進步。
注意搭建這個案例的框架版本:struts 2.3.4 Hibernate 3.0 Spring 3.1.1
數據庫設計:id int;username varchar(11);password varchar(11)
一.首先為這個demo添加spring核心容器:
- 鼠標右擊項目,[MyEclipse]-----[Add Spring Capabilities…],在彈出的框中選擇前3個,然后就是下一步,finish。
2. 完成后,會在項目工程目錄src下出現一個applicationContext.xml文件,這就是spring的配置文件,而且我們可以通過這個配置文件將Hibernate的配置加載到applicationContext.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 需要自己添加的映射文件 --> <property name="mappingResources"> <list> <value>com/red/login/vo/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> </props> </property> </bean> <!-- 自己需要配置 --> <bean id="baseDAO" class="com.red.login.dao.BaseDAO"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="userDAO" class="com.red.login.impl.UserDAO" parent="baseDAO"></bean> <bean id="login" class="com.red.login.action.LoginAction"></bean> </beans>
二.添加Hibernate並並持久化User表:
- 鼠標右擊項目,[MyEclipse]---[Add Hibernate Capabilities…],版本選擇Hibernate3.3,方框選擇前兩個,然后就是下一步,選擇用Spring的配置文件進行SessionFactory的配置;這樣生成的文件中就沒有了hibernate.cfg.xml,而是直接將配置寫入了applicationContext.xml這個文件中;
2.根據提示填寫數據庫驅動的相關數據:Driver,url,class,Username,Password等信息;
3. 提示是否創建SessionFactory類,由於這個程序Spring注入sessionFactory,所以不用創建,取消方框中的對勾選項;
4.finish完成。
5.添加User對象和映射文件:(附User.java,User.hbm.xml的源碼)

package com.red.login.vo; /** * 定義實體bean * @author Red * Email:it_red@sina.com */ public class User { private int id; private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public User() { // TODO Auto-generated constructor stub } public int getId() { return id; } public void setId(int 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; } }

<?xml version="1.0" encoding="UTF-8"?> <!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.red.login.vo.User" table="user" catalog="test"> <id name="id" type="int"> <column name="id"></column> <generator class="native"></generator> </id> <property name="username" type="string"> <column name="username" not-null="true"></column> </property> <property name="password" type="string"> <column name="password" not-null="true"></column> </property> </class> </hibernate-mapping>
三.加載並配置Struts框架:
- 加載Struts的jar包,添加Struts開發所必須的9個包就行了,另外加一個數據庫的驅動包,為了配置要將Struts2 與Spring 集成的需要,添加一個struts2-spring-plugin-2.3.4.1.jar包;
- 配置web.xml文件:(附源碼)

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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_2_5.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</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> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
3. 創建struts.properties:
在項目工程目錄src下,新建一個文本文件,在其中添加一條代碼:
Struts.objectFactory=spring
並將該文件重命名為struts.properties,建立這個文件的目的是使struts2的類的生成交給Spring完成。
4. 創建struts.xml:在src目錄下直接建立一個xml文件,名為:struts.xml; (附struts.xml的源碼)

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="struts" extends="struts-default"> <action name="login" class="com.red.login.action.LoginAction"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> </package> </struts>
四.實現整合:
- 編寫Action和DAO的代碼,分別實現DAO層(即:BaseDAO.java和接口IUserDAO.java),UserDAO類(UserDAO.java),控制器Action(LoginAction.java),詳細解釋見源碼注釋;(附源碼)

package com.red.login.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; /** * 基類:通過session工廠來打開session * @author Red * Email:it_red@sina.com */ public class BaseDAO { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory;//返回session工廠 } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession(){ Session session=sessionFactory.openSession();//打開session return session; } }

package com.red.login.dao; import com.red.login.vo.User; /** * 定義接口 * @author Red * Email:it_red@sina.com */ public interface IUserDAO { public User validateUser(String username,String password); }

package com.red.login.impl; import java.util.List; import org.hibernate.Query; import org.hibernate.classic.Session; import com.red.login.dao.BaseDAO; import com.red.login.dao.IUserDAO; import com.red.login.vo.User; /** * 具體操作類 * @author Red * Email:it_red@sina.com */ public class UserDAO extends BaseDAO implements IUserDAO{ public User validateUser(String username,String password){//實現接口中的方法 String sql="from User u where u.username=? and u.password=?";//HQL語句 Session session=(Session) getSession(); Query query=session.createQuery(sql); query.setParameter(0, username); query.setParameter(1, password); List users=query.list(); if(users.size()!=0) { User user=(User) users.get(0); return user; } session.close(); return null; } }

package com.red.login.action; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import com.opensymphony.xwork2.ActionSupport; import com.red.login.dao.IUserDAO; import com.red.login.vo.User; import org.springframework.context.support.*; import org.springframework.context.*; import com.red.login.impl.*; /** *登錄Action * @author Red * Email:it_red@sina.com */ public class LoginAction extends ActionSupport{ private User user; @Override public String execute() throws Exception { // TODO Auto-generated method stub boolean validated=false; //指明applicationContext的位置 ApplicationContext context=new FileSystemXmlApplicationContext("file:H:/EB/20140420_SSH_login/src/applicationContext.xml"); IUserDAO userDAO=(IUserDAO)context.getBean("userDAO"); User u=userDAO.validateUser(user.getUsername(), user.getPassword()); if(u!=null) { validated=true; //登錄驗證 } if(validated){ return SUCCESS; }else{ return ERROR; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
2. 注冊組件:在applicationContext.xml中注冊以上編寫的各個組件:
<bean id="baseDAO" class="com.red.login.dao.BaseDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userDAO" class="com.red.login.impl.UserDAO" parent="baseDAO"></bean>
<bean id="login"class="com.red.login.action.LoginAction"></bean>
<!-- 在bean,id="sessionFactory中"需要自己添加的源碼,將User的映射文件添加到配置中-->
<property name="mappingResources">
<list>
<value>com/red/login/vo/User.hbm.xml</value>
</list>
</property>
3.編寫幾個測試的JSP就可以直接運行了。
注意:轉載請標明出處,謝謝!
----------------EMAIL:it_red@sina.com