• 沒有找到結果。

Hibernate 实例

在文檔中 第一部分: (頁 160-174)

第九章 数据持久化—使用 Hibernate

9.4 Hibernate 实例

本节将向读者展示一个完整的实例,该实例涉及到 Struts2、Hibernate 以及 MySQL 的内 容,希望通过该实例能让读者对使用 Hibernate 作为 Struts2 数据持久化模块这一方法有实际 体验。这个应用实现了现实中很常用的登陆、验证、注册的功能。它使合法的用户可以登陆 系统,阻止非法用户对受保护页面的访问,同时提供了用户注册功能。

首先,要先创建一个数据库,以便在 Web 应用里能持久化对象,进而实现注册和登陆。

打开 MySQL 图形管理工具 MySQL Query Brower,在右边的数据库管理窗口中右击,选择

“Create New Schema”,在弹出的窗口中输入数据库(Schema)的名字“hibernate”,点击“OK”

按钮,完成数据库的创建。如图 9-5 所示。

图 9-5 数据库创建

接着右击刚才创建的数据库 hibernate 选择“Create New Table”,在“Table Nname”输 入框里输入欲创建的表的名字“usertable”,在 column 列下分别创建元素 id、username、

password,其中,id 属性设定为“Not Null”和“Auto Inc”。如图 9-6 所示。

图 9-6 创建数据表

在 Query 窗口里输入 SQL 语句 insert into hibernate.usertable values (’romatory’,’123456’),

然后按右边的 execute 按钮执行该语句向 usertable 里插入一个元组,id 值为从 1 开始增加的 整数(这是由前面的设置决定的),username 的值为 romatory,password 的值为 123456。最 后,建好的数据库如图-7 所示。

图 9-7 建好的数据库

接着,在 Eclipse 里创建一个 Web Project,Project 名为 HibernateTest,然后按上面讲的 方法将所需的 JAR 文件导入。然后创建所需要的文件,这里先给出文件名,文件内容将在 下面分析时给出。用上面给出的方法在 src 目录下创建文件 struts.xml、hibernate.cfg.xml 以 及包 example,并在 example 下创建以下这些文件:User.java、UserDAO.java、User.hbm.xml、

LogginAction.java 、 RegisterAction.java 、 hibernateUtil.java 。 最 后 将 web.xml 添 加 到 WebRoot/WEB-INF 下面,index.jsp、succ.jsp、err.jsp、register.jsp 添加到 WebRoot 下。

该项目的最终文件结构如图 9-8 所示。

图 9-8 完整的目录

注意:在添加所有 JAR 包的时候,最好把每个框架提供的 JAR 包都拷进 lib 目录下,这样 虽然看起来有点乱,但是可以避免缺少 JAR 包而导致的错误,而且通常情况下这种错误不 容易发现。

下面来看各文件的内容。首先来分析 Hibernate 的配置文件 Hibernate.cfg.xml,该文件说 明了与数据库有关的配置,内容如下:

Hibernate.cfg.xml

<?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>

这里连接的数据库是 MyProject,用户名和密码分别为 root 和 luddong。注意 hbm2ddl.autl 属性的使用。

上面配置文件中 mapping 标签指定了一个映射文件,代码如下:

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="example.User" table="usertable">

<id name="id">

<generator class="native"/>

</id>

<property name="username"/>

<property name="password"/>

</class>

</hibernate-mapping>

这个文件告诉 Hibernate 将 User 这个类映射到表 usertable,其中,id 为主键,生成方式为 native 。 Property 告 诉 Hibernate , 类 和 表 中 的 元 素 的 对 映 关 系 , 完 整 的 应 为 <property name=”username” column=”username”/>,但是因为这里类和表中的 username、password 元素 的名字相同,所以不必将 column=”username” 也写上。

User 类是对现实中用户的抽象,这里只简单地抽象出对本实例有用的信息,代码如下:

User.java

package example;

public class User extends Object{

private int id;

private String username;

private String password;

/*省略 getter 和 setter*/

}

这是一个典型的 JavaBean 风格的类,定义了需要的变量和与变量对应的 getter、setter 方法。这些方法有时 Struts2 会在后台调用,有时则是程序显式地调用。

有了以上内容,持久化相关的基础工作已经做完,下面来看 Struts2 相关的内容,Struts2 的配置文件有两个,分别是 web.xml 和 struts.xml。

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app>

<filter>

<filter-name>struts</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>

<taglib-location>/WEB-INF/struts-tags.tld</taglib-location>

</taglib>

</web-app>

这是 web 项目的基本配置文件。

strutsk.xml

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<include file ="struts-default.xml"/>

<package name="default" extends ="struts-default">

<action name="loggin" class="example.LogginAction">

<interceptor-ref name="validationWorkflowStack" />

<result name="success">succ.jsp</result>

<result name="error">err.jsp</result>

</action>

<action name="register" class="example.RegisterAction">

<interceptor-ref name="validationWorkflowStack"/>

HibernateUtil.java 用来将一些基本的 Hibernate 操作进行封装,比如创建会话工厂、会 话等,该文件代码如下:

HibernateUtil.java package example;

import org.hibernate.*;

import org.hibernate.cfg.*;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

catch (Throwable ex) {

public static Session currentSession() throws HibernateException{

Session s = (Session) session.get();

if(s==null||!s.isOpen()){ //获取当前 session,如果不存在,则新建一个

System.out.println("rollback faild."+e);

}

这个类定义了用 Hibernate 实现持久化的基本东西,比如 sessionfactory,它是由 SessionFactory 这个类实例化得到的。还有 session,是调用 sessionfactory 的 openSession()

方法得到的。同时还定义了回滚方法 rollback()以及 closeSession()方法。这些方法在后

public class UserDAO {

Log log=LogFactory.getLog(UserDAO.class);

private Session session;

private Transaction tx;

public UserDAO(){

session=HibernateUtil.currentSession();

}

public void create(User user) throws RuntimeException { //实现 User 对象的插入到数据库操作

public void delete(User user) throws RuntimeException { try{ //实现 User 对象的删除操作 tx=session.beginTransaction();

session.delete(user);

tx.commit();

}catch (HibernateException e) { HibernateUtil.rollback(tx);

throw new RuntimeException(e);

}finally{

'";sql+=user.getUsername()+"'";

List list=session.createQuery(sql).list();

if(!list.isEmpty()){

Iterator it = list.iterator();

if(it.hasNext()){

下面就可以创建 Action 来调用 UserDAO.java 中的方法来满足相应的需要。首先需一个 注册 Action RegisterAction.java,它负责将用户表单中提交的内容存入到数据库中的表里,

该文件的代码如下:

RegisterAction.java package example;

/*省略 import*/

public class RegisterAction extends ActionSupport{

private String password;

private String username;

private int id;

/*省略 getter 和 setter*/

public String execute() throws Exception{

UserDAO userdao=new UserDAO();

User user = new User();

这里通过在 execute()方法里调用 UserDAO 的 create(user)方法来实现注册。

当注册用户下次进入本系统时需要一个登陆的过程,这里就需要一个登陆 Action LogginAction.java 与之对应,该文件的代码如下:

LogginAction.java package example;

/*省略 import*/

public class LogginAction extends ActionSupport{ //响应登陆的 Action private String password;

private String username;

private int id;

/*省略 getter 和 setter*/public String execute() throws Exception {

UserDAO userdao=new UserDAO();

User user = new User();

<%@ page contentType="text/html; charset=UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Load data.</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<center><img src="./pagehead.jpg"></center>

<br><br><br>

<form name="form1" method="post" action="register.action">

<p>&nbsp;</p>

<table width="75%" border="1" align="center">

<tr>

<td colspan="2"><div align="center">注册</div></td>

</tr>

<tr>

<td><div align="right">用户名:</div></td>

<td><input name="Username" type="text" id="Username"></td>

</tr>

<tr>

<td><div align="right">密 码:</div></td>

<td><input name="Password" type="password" id="Password4"></td>

</tr>

<tr>

<td colspan="2"><div align="center">

<p>&nbsp; </p><p>&nbsp; </p>

</form>

</body>

</html>

这个页面包含一个两行的表格,用来输入 username 和 password,还有一个跳转到登陆 页面的链接。

当用户点击登陆链接后就会跳转到登陆页面 index.jsp,该页面显示两行,要求用户输入 用户名和密码来登陆,代码如下:

index.jsp

<%@ page contentType="text/html; charset=UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Load data.</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<center><img src="./pagehead.jpg"></center>

<form name="form1" method="post" action="loggin.action">

<p>&nbsp;</p>

<table width="75%" border="1" align="center">

<tr>

<td colspan="2"><div align="center">登录</div></td>

</tr>

<tr>

<td><div align="right">用户名:</div></td>

<td><input name="Username" type="text" id="Username"></td>

</tr>

<tr>

<td><div align="right">密 码:</div></td>

<td><input name="Password" type="password" id="Password4"></td>

</tr>

<tr>

<td colspan="2"><div align="center">

<a href="register.jsp" >Register</a>

<input type="submit" name="Submit" value="Loggin">

<input type="reset" name="Submit2" value="Reset">

</div></td>

</tr>

</table>

<p>&nbsp; </p><p>&nbsp; </p>

</form>

</body>

</html>

页面中显示一个表格,有 username 和 password 两行。还有 submit 和 reset 两个按钮,

又作为一行,还有一个跳转到注册页面的链接。

成功显示页面 succ.jsp 是在登陆成功后跳转到的页面,代码如下:

succ.jsp

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<html>

Wrong username or password! <br>

</h2>

</center>

</font>

</body>

</html>

它当输入有错时显示,比如输入的密码不正确。这里只是输出固定的错误提示,并不怎 么灵活,在后面读者还会看到用校验框架实现的校验,它功能更强,使用更灵活,实现也很 方便。

现在,整个项目已经完成,下面就可以运行该项目。首先将该项目布署(deploy)到 Tomca 容器,然后启动 Tomcat 服务器。在浏览器里输入http://localhost:8080/HibernateTest/index.jsp,

显示如图 9-9 所示。

图 9-9 登录页面

此时,输入数据库里没有的用户名和密码并提交后,就会跳转到如图 9-10 所示的 err.jsp 页面并提示相应的出错信息。

图 9-10 登陆错误的页面

重新返回到登陆页面,点击 Regist 链接,此时看到如图 9-11 所示的注册页面。

图 9-11 注册页面

要说明的是,这个页面现在还非常简单,在以后的应用中,这们将会逐步扩展这个页面,

使其看起来更美观、漂亮。

然后输入用户名和密码,比如这里输入用户名:Rom,密码:123,然后点击 Register 按钮,出现如图 9-12 所示的成功注册的页面。

图 9-12 注册成功的页面

然后再退回到 index.jsp,重新输入刚才注册的用户名(Rom)和密码(123),这时就会 进入正确登陆的页面,如图 9-13 所示。

图 9-13 登录成功页面

在这个例子中,将登陆和注册都实现了,既可以注册又可以登陆。这里可以看到,由于 使用了 Hibernate 这个工具,使代码看上去很简洁,免去了直接编写 JDBC 连接代码的痛苦。

9.5 小结

本章首先介绍了数据持久化的概念,对于本书,这主要是指将对象中的数据存储到数据 库中。接着介绍了用来实现持久化的技术—ORM 技术,即对象关系映射技术。它是通过将 对象映射到关系来实现持久化的。然后还介绍了实现了 ORM 技术的一个框架—Hibernate,

这是一个非常优秀的一个持久化框架,能让开发人员快速提高工作效率。

既然这里要实现的是持久化,那就少不了要有将对象持久化的载体,这里介绍的就是 MySQL 数据库。有了以上的工具,还需要把它们配置起来,使它们能协调工作才能很好地 完成数据持久化这一任务,这包括 MySQL 驱动的下载与安装以及在 Eclipse 里 Java 构建路

既然这里要实现的是持久化,那就少不了要有将对象持久化的载体,这里介绍的就是 MySQL 数据库。有了以上的工具,还需要把它们配置起来,使它们能协调工作才能很好地 完成数据持久化这一任务,这包括 MySQL 驱动的下载与安装以及在 Eclipse 里 Java 构建路

在文檔中 第一部分: (頁 160-174)