首页 > 代码库 > struts2和hibernate整合的小Demo

struts2和hibernate整合的小Demo

jar包下载地址

 


 

创建一个web项目。

技术分享


 

导入jar包

技术分享


配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <-- Struts的核心过滤器配置-->
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>*.jsp </url-pattern>
    </filter-mapping>
</web-app>

 

 在src 目录下创建 hibernate.cfg.xml,指定数据库“demo”


<?xml version="1.0" encoding="UTF-8"?>
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/demo</property>
            <property name="connection.username">root</property>
            <property name="connection.password">123</property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
            <property name="current_session_context_class">thread</property>
        </session-factory>
</hibernate-configuration>

 

创建一个User实体类

 

package com.test.pojo;

/**
 * Created by Wdnnccey on 2016/10/24.
 */
public class User {
    private int uid;
    private String username;
    private String password;

    public User() {
    }

    public User(int uid, String username, String password) {
        this.uid = uid;
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username=‘" + username + ‘\‘‘ +
                ", password=‘" + password + ‘\‘‘ +
                ‘}‘;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    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;
    }
}

创建 :User.hbm.xml, 数据映射文件,对应的分别是数据字段。

<?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.test.pojo.User" table="user">
        <id name="uid" column="uid">
            <generator class="native"/>
        </id>
        <property name="username" column="username"  type="java.lang.String" length="20" />
        <property name="password" column="password"  type="java.lang.String" length="20"/>
 
    </class>
</hibernate-mapping>

 

创建一个包存放专门用来工具类,获取session操作等等。

HibernateUtils.java

 

package com.test.utils;

import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

/**
 * Created by Wdnnccey on 2016/10/24.
 */
public class HibernateUtils {

    private static SessionFactory sessionFactory;

    //保证单例模式
    private HibernateUtils(){

    }

    //公有的静态方法
    public static SessionFactory getSessionFactory(){

        if(sessionFactory ==null){
            Configuration configuration =new Configuration().configure();
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            return sessionFactory;
        }else {
            return sessionFactory;
        }
    }

}

 

在创建一个源码包,作为测试类使用,来创建表。 TestDemo.java

package com.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.metamodel.relational.Schema;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

/**
 * Created by Wdnnccey on 2016/10/24.
 */
public class TestDemo {

    @Test
    public void TestAll(){
        Configuration configuration = new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory =configuration.buildSessionFactory(serviceRegistry);
        Session session = sessionFactory.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        SchemaExport export =new SchemaExport(configuration);
        export.create(true,true);
    }
}

技术分享

成功创建user表。

 

在web目录下创建users-->目录存放-->login.jsp作为登陆页面。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆页面</title>
</head>
<body>
        <form action="" method="post">
                username:<input type="text" name="username"/><br>
                password:<input type="password" name="password"/><br>
            <input type="submit" value="http://www.mamicode.com/tijiao"/>
        </form>
</body>
</html>

 

在web目录下创建users-->目录存放-->fails.jsp作为登陆失败后返回的页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
你失败了。
</body>
</html>

 

在web目录下创建users-->目录存放-->success.jsp作为登陆成功后返回的页面。 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
你成功了。
</body>
</html>

在src目录下创建一个struts.xml配置文件。

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> </package> <package name="users" namespace="/users" extends="default"> <!--http://www.cnblogs.com/wdnnccey/p/5982988.html有介绍--> <action name="*_*" class="com.test.action.{1}Action" method="{2}"> <!--如果登陆成功返回的页面--> <result name="login_success">/users/success.jsp</result> <!--如果登陆失败返回的页面--> <result name="login_fails">/users/fails.jsp</result> </action> </package> </struts>

 

在src下创建一个dao层。 接口:userDao.java

import com.test.pojo.User;

/**
 * Created by Wdnnccey on 2016/10/24.
 */
public interface UserDao {

    //用户登陆
    public boolean userLogin(User user);
}

在src下创建一个dao层的实现层。 userDaoImpl.java

;

import com.test.pojo.User;
import com.test.utils.HibernateUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import java.util.List;

/**
 * Created by Wdnnccey on 2016/10/24.
 */
public class UserDaoImpl  implements UserDao{
    @Override
    public boolean userLogin(User user) {
        //初始化事务
        Transaction transaction =null;
        //创建一个hql语句,先初始化。
        String hql ="";

        try {
            //用之前创建的utils工具来获取session
            Session session = HibernateUtils.getSessionFactory().getCurrentSession();
            //创建事务并开启事务
            transaction =session.beginTransaction();
            //编写hql语句
            hql = "from User where username=? and password =?";
            //通过query去创建语句
            Query query = session.createQuery(hql);
            //为hql语句中的?(问号),设置参数。(通过user实体类获取来user用户名和密码的信息)
            query.setParameter(0,user.getUsername());
            query.setParameter(1,user.getPassword());
            //HQL语句返回的是一个QUery对象,将Query对象query转换成集合,并且把该集合赋值给一个新的集合。
            List<User> list =query.list();
            //执行之前要提交事务
            transaction.commit();
            //判断是否验证到有用户存在
            if(list.size()>0){
                return  true;
            }else {
                return  false;
            }
        }catch (Exception e){

        }finally {
            //将事务置为空
            if(transaction!=null){
                transaction=null;
            }
        }
        return false;
    }
}

 

在src下创建一个action的包,用于存放action, 我们先写一个 SuperAction.java 

关于为什么继承ActionSupport,请参考:http://www.cnblogs.com/wdnnccey/p/5994693.html

关于为什么要时间那些接口,请参考:http://www.cnblogs.com/wdnnccey/p/5994713.html

package com.test.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.ws.spi.http.HttpContext;

/**
 * 所有action的父类
 * Created by Wdnnccey on 2016/10/24.
 */
public class SuperAction  extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{

    protected HttpServletResponse response;
    protected HttpServletRequest request;
    protected ServletContext application;
    protected HttpSession session;

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
        this.session = this.request.getSession();
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response =response;
    }

    @Override
    public void setServletContext(ServletContext application) {
        this.application=application;
    }
}

 

  在action包下创建 userAction.java 

package com.test.action;

import com.opensymphony.xwork2.ModelDriven;
import com.test.pojo.User;
import com.test.serivce.impl.UserDao;
import com.test.serivce.impl.UserDaoImpl;

/**
 * Created  by Wdnnccey on 2016/10/24.
 */
public class UserAction extends SuperAction implements ModelDriven<User> {

    //初始化一个user对象
    private User user = new User();

    //这里使用模型驱动
    //所谓ModelDriven ,意思是直接把实体类当成页面数据的收集对象。
    @Override
    public User getModel() {
        return this.user;
    }

    /**
     * 登陆方法
     * @return
     */
    public String login() {
        UserDao dao = new UserDaoImpl();
        //如果匹配的话
        if (dao.userLogin(user)) {
            //返回正确页面,(session是通SuperAction得到的!
 session.setAttribute("LoginUsername", user.getUsername());
      //如果正确跳转到success页面,在struts.xml中有体现配置
return "login_success"; } else { //返回错页面 return "login_fails"; } }
}

 

我们在登陆之前要插入一条用户数据,以便登陆的时候去验证!

技术分享

 

部署web项目,启动tomcat :

技术分享

技术分享

 

在这输入用户名以及密码 验证。

我先输入一个错误的信息,点击提交按钮:

技术分享

技术分享

 

这次我们输入一个正确的数据, 在数据库中存在的!

技术分享

技术分享

写到这里,我们完成了一个简单的登陆的功能,以及页面跳转。


 

我们想在登陆页面知道这个用户是谁:

在session域中取得,我们在登陆时候setattribute的值(session.setAttribute("LoginUsername", user.getUsername());)

在success.jsp页面添加如下:

欢迎你:(${sessionScope.LoginUsername})登陆!

 

再次登陆验证:

http://localhost:8081/users/login.jsp

技术分享


 

 

如果我们想实现对这个用户的退出呢? 也很简单,把这个用户在session中移除即可,代码如下:

在userAction中编写注销方法:

    /**
     * 注销方法
     */
    public String loginout() {
        //先去session中去获取值,查看当前用户是否为空
        if (session.getAttribute("LoginUsername") != null) {
            //如果不等于空的话我们将他移出session
            session.removeAttribute("LoginUsername");
        }
        //返回到登陆页面(这个return的值是通过struts.xml文件配置的)
        return "loginout_success";
    }

在struts.xml的配置:(红色标注)

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="default" extends="struts-default" namespace="/">
    </package>
    
    <package name="users" namespace="/users" extends="default">
            <!--http://www.cnblogs.com/wdnnccey/p/5982988.html有介绍-->
        <action name="*_*" class="com.test.action.{1}Action" method="{2}">
            <!--如果登陆成功返回的页面-->
            <result name="login_success">/users/success.jsp</result>
            <!--如果登陆失败返回的页面-->
            <result name="login_fails">/users/fails.jsp</result>
            <!--退出用户的返回页面-->
            <result name="loginout_success">/users/login.jsp</result>
        </action>
    </package>
   
</struts>

 

我们需要在登陆成功的success.jsp写上安全注销的链接(红色标注):

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
你成功了。
<br><br><br>
欢迎你:(${sessionScope.LoginUsername})登陆!

<br><br><br>
<a href="http://www.mamicode.com/users/User_loginout.action">安全退出!</a>
</body>
</html>

 

 

测试注销方法:

技术分享

 

看地址栏,能看出来 我们已经成功的退出当前用户!

 技术分享

 

 不知道为什么 代码的格式没有复制上去,我就贴在这里啦:

 struts.xml

 

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
</package>

<package name="users" namespace="/users" extends="default">
<!--http://www.cnblogs.com/wdnnccey/p/5982988.html有介绍-->
<action name="*_*" class="com.test.action.{1}Action" method="{2}">
<!--如果登陆成功返回的页面-->
<result name="login_success">/users/success.jsp</result>
<!--如果登陆失败返回的页面-->
<result name="login_fails">/users/fails.jsp</result>
<!--退出用户的返回页面-->
<result name="loginout_success">/users/login.jsp</result>
</action>
</package>

</struts>

struts2和hibernate整合的小Demo