实验五Struts2和Hibernate3整合应用
一、目的和要求
本实验是为了让学生对持久化技术有一个初步了解,并熟悉在Eclipse + Hibernate 的集成环境下,如何建立一个持久化技术的简单的应用。通过本实验
1.掌握在企业Java应用开发中Struts的作用;
2.熟悉在Eclipse+MyEclipse环境中综合使用Hibernate和Struts的方法和步骤;
3.掌握Hibernate的核心思想。
4.掌握Struts和Hibernate整合思想。
二、实验内容
创建数据库test,在数据库中创建一张表users,包括id,username和password,通过hibernate建立与表users对应的类Users。
在Struts框架创建的index.jsp的表单中输入users信息,将此信息转换成一个对象,通过struts的action将对象存入数据库中。
三、实验原理简介
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘),持久化的主要应用是将内存中的数据存储在关系型的数据库中。要在Hibernate中实现数据的持久化,就是要建立对象中的属性与数据库中的表的映射关系,具体实现是利用两个xml配置文件,在其中的一个hibernate.cfg.xml文件中指定了数据库的连接的相关参数和映射文件的名称,而另一个文件*.hbm.xml(在此例中为users.hbm.xml)定义了对象(Users.class)中的属性与数据库表(Users)中的字段的对应关系。这样当对象中的方法(在此例中对象的方法定义在Users.java中)对对象中的某些属性进行操作的时候,属性在数据库中对应的字段也就相应的发生了改变。
四、实验环境
实验室环境。
五、实验步骤
1.创建Web工程,名为TestS2H。
2.按实验四的实验步骤配置好struts2环境(参照实验四),例如添加Struts2所需的包,
并配置web.xml,struts.xml,struts.properties,messageResource_zh_CN.properties,
创建包和类等都和实验四相同。
3.在SQL Server 2000中创建数据库test,和表users。SQL脚本如下:
CREATE DATABASE test;
USE test;
CREATE TABLE [dbo].[users] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[username] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
建立好的表结构如图5-1。
图5-1 users表结构
4.打开myeclipse的database explore透视图,如图5-2。
图5-2 打开数据库浏览器透视图
5.新建数据库连接,如图5-3。jtds-1.2.jar包在C:\java\ jdbc for SQL Server目录下可
以找到。点击Add JARS,把该包包含进去即可。注意,实验室环境的密码是111111。
图5-3 新建数据库连接6.连接test数据库,如图5-4。
将test数据库展开后,如图5-5。
图5-5 数据库连接展开后7.生成映射文件。操作如图5-6。
图5-6 生成映射文件8.Hibernate映射引擎,操作如图5-7.。
图5-7Hibernate Reverse Engineering 点击下一步,ID Generater项选择native。
点击下一步,Finished。
9.切换到MyEclipse窗口,操作如图5-8。
图5-8切换到MyEclipse窗口10.添加Hibernate所需的包以及创建Hibernate工程。
操作方法如图5-9到图5-13。
图5-9添加Hibernate所需的包(1)
图5-10添加Hibernate所需的包(2)
图5-11添加Hibernate所需的包(3)
图5-12 New Hibernate Project(1)
图5-13 New Hibernate Project(2)
11.添加日志配置。在src/目录下添加文件:log4j.properties。
其具体配置如下:
log4j.rootLogger=INFO, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
https://www.doczj.com/doc/9214769842.html,yout=org.apache.log4j.PatternLayout
https://www.doczj.com/doc/9214769842.html,yout.ConversionPattern=%d [%t] %-5p %c - %m%n
# Print only messages of level WARN or above in the package com.foo. # https://www.doczj.com/doc/9214769842.html,.foo=WARN
#https://www.doczj.com/doc/9214769842.html,.sa.health.oacis=DEBUG
#https://www.doczj.com/doc/9214769842.html,.apache.struts2=DEBUG
#https://www.doczj.com/doc/9214769842.html,.apache=INFO
#https://www.doczj.com/doc/9214769842.html,.hibernate=INFO
#log4j.logger.ca.uhn=INFO
### log HQL query parser activity
#https://www.doczj.com/doc/9214769842.html,.hibernate.hql.ast.AST=debug
### log just the SQL
https://www.doczj.com/doc/9214769842.html,.hibernate.SQL=debug
### log JDBC bind parameters ###
https://www.doczj.com/doc/9214769842.html,.hibernate.type=INFO
#https://www.doczj.com/doc/9214769842.html,.hibernate.type=debug
### log schema export/update ###
https://www.doczj.com/doc/9214769842.html,.hibernate.tool.hbm2ddl=DEBUG
### log cache activity ###
#https://www.doczj.com/doc/9214769842.html,.hibernate.cache=debug
### log transaction activity
#https://www.doczj.com/doc/9214769842.html,.hibernate.transaction=debug
### log JDBC resource acquisition
#https://www.doczj.com/doc/9214769842.html,.hibernate.jdbc=debug
### enable the following line if you want to track down connection ### ### leakages when using DriverManagerConnectionProvider ###
#https://www.doczj.com/doc/9214769842.html,.hibernate.connection.DriverManagerConnectionProvide r=trac e
12.工程目录结构,如图5-14。
图5-14 工程目录结构
13.修改LoginAction.java,源码如下:
package com.jee;
import https://www.doczj.com/doc/9214769842.html,ers;
import com.opensymphony.xwork2.ActionSupport;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class LoginAction extends ActionSupport
{
private static final long serialVersionUID = 1L;
private String username;
private String password;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
https://www.doczj.com/doc/9214769842.html,ername = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String execute() throws Exception
{
t ry{
//实例化SessionFactory
SessionFactory sf = new
Configuration().configure().buildSessionFactory();
//实例化Session
Session session = sf.openSession();
//开始事务
Transaction tx = session.beginTransaction();
//创建消息实例
Users user = new Users();
user.setUsername(getUsername());
user.setPassword(getPassword());
//将实例数据保存到数据库
session.save(user);
https://www.doczj.com/doc/9214769842.html,mit();
session.close();
return SUCCESS;
}catch (HibernateException e) {
e.printStackTrace();
return ERROR;
}
}
}
14.创建表现层。
将index.jsp改为如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
将用户名和密码保存到数据库test中。
同时在messageResource_zh_CN.properties里添加一条: save=保存,这样就会成功显示中文。
welcome.jsp修改为:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
欢迎,
数据已成功保存到数据库test。
error.jsp修改为:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
你输入的用户名:
数据保存到数据库失败。
15.部署工程,启动服务器,测试工程。
16.总结:
Struts2和Hibernate的整合主要是Struts的Action调用持久层的数据库封装的操作方法。在本实验中我们只使用了save方法,其实还有很多的对数据库添加、修改、删除的基本操作方法,例如public void delete(Users persistentInstance) ;
public Users findById(https://www.doczj.com/doc/9214769842.html,ng.Integer id) ;
public List findByExample(Users instance) ;
public List findByProperty(String propertyName, Object value) ;
public List findByUsername(Object username) ;
public List findByPassword(Object password) ;
public List findAll() ;
public Users merge(Users detachedInstance) ;
public void attachDirty(Users instance) ;
public void attachClean(Users instance) ;
或者使用HQL语言也可以像SQL语句一样执行。以上的这些方法都会相应的转化为对应的SQL语句,并在数据库中执行,并将执行的结果返回。
Hibernate的一个显著特点是O/R映射机制,它不仅提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制。具体知识请参考其他资料。