Struts+Hibernate+Spring实现用户登录功能

      通过登录案例实现三大框架之间的整合,登录功能是任何系统和软件必不可少的一个模块,然而通过这个模块来认识这些复杂的框架技术,理解数据流向和整个设计思路是相当容易的。只有在掌握了这些小模块的应用后,才能轻松的去研究和设计出更有创意的,更加严密的系统。

      本人通过学习,实现了这个小功能,现在将实现思想和过程总结如下。希望各位大神朋友多多审查,有什么不到位的地方,请通过邮件告诉我([email protected]),在此表示感谢;新手朋友,我相信这个例子会是你进入框架领域的第一个完整的DEMO。当你部署成功后,你一定会相当自豪的,同时也有了学习更深知识的信心,如果你还有什么不明白的或者需要该DEMO的源码,请留言或者发邮件告诉我,我们共同进步。

    注意搭建这个案例的框架版本:struts 2.3.4     Hibernate 3.0      Spring 3.1.1 

    数据库设计:id int;username varchar(11);password varchar(11)

一.首先为这个demo添加spring核心容器:

  1. 鼠标右击项目,[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>
View Code

 

 

二.添加Hibernate并并持久化User表:

  1. 鼠标右击项目,[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:[email protected]

 */

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;

    }

    

    

}
View Code
<?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>
View Code

 

 

三.加载并配置Struts框架:

  1. 加载Struts的jar包,添加Struts开发所必须的9个包就行了,另外加一个数据库的驱动包,为了配置要将Struts2 与Spring 集成的需要,添加一个struts2-spring-plugin-2.3.4.1.jar包;
  2. 配置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>
View Code

     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>
View Code

四.实现整合:

  1. 编写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:[email protected]

 */

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;

    }

    

}
View Code
package com.red.login.dao;



import com.red.login.vo.User;

/**

 * 定义接口

 * @author Red

 * Email:[email protected]

 */

public interface IUserDAO {



    public User validateUser(String username,String password);

}
View Code
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:[email protected]

 */

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;

    }

}
View Code

 

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:[email protected]

 */



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;

    }

        

    }

    
View Code

 

 

    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:[email protected]

 

你可能感兴趣的:(Hibernate)