该例子使用 Hibernate 3.3 + Struts 2.1,数据库使用Oracle。
一、实体类和实体映射类
package entity;
/**
* Users entity. @author MyEclipse Persistence Tools
*/
public class Users implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private String password;
private String telephone;
private String username;
private String isadmin;
// Constructors
/** default constructor */
public Users() {
}
/** full constructor */
public Users(String name, String password, String telephone, String username, String isadmin) {
this.name = name;
this.password = password;
this.telephone = telephone;
this.username = username;
this.isadmin = isadmin;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelephone() {
return this.telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getIsadmin() {
return this.isadmin;
}
public void setIsadmin(String isadmin) {
this.isadmin = isadmin;
}
}
<?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"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="entity.Users" table="USERS" schema="HOUSE"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="7" scale="0" /> <generator class="sequence"> <param name="sequence">user_seq</param> </generator> </id> <property name="name" type="java.lang.String"> <column name="NAME" length="50" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" length="50" /> </property> <property name="telephone" type="java.lang.String"> <column name="TELEPHONE" length="15" /> </property> <property name="username" type="java.lang.String"> <column name="USERNAME" length="50" /> </property> <property name="isadmin" type="java.lang.String"> <column name="ISADMIN" length="5" /> </property> </class> </hibernate-mapping>
二、接口和接口实现类
公用的Hibernate
package dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Example;
import util.HibernateSessionFactory;
/**
* 公用的Hibernate
*
* @author miao
*
*/
public class BaseHibernateDao<T> {
/**
* 获得会话
*
* @return
*/
public Session getSession() {
return HibernateSessionFactory.getSession();
}
/**
* 关闭会话
*/
public void closeSession() {
HibernateSessionFactory.closeSession();
}
/**
* 根据主键查询
*/
@SuppressWarnings("unchecked")
public T get(Class<T> clz, Serializable id) {
T ret = null;
Session session = this.getSession();
try {
ret = (T) session.get(clz, id);
} catch (HibernateException e) {
e.printStackTrace();
} finally {
closeSession();
}
return ret;
}
/**
* 传HQL语句,并带参数,查询返回一个对象
*
* @param hql
* @param param
* @return
*/
@SuppressWarnings("unchecked")
public T findEntity(String hql, Object... param) {
Query query = getSession().createQuery(hql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
query.setParameter(i, param[i]);
}
}
return (T) query.uniqueResult();
}
/**
* 添加一条记录
*
* @param entity
*/
public boolean add(T entity) {
boolean success = true;
Transaction tx = null;
Session session = getSession();
try {
tx = session.beginTransaction();
session.save(entity);
tx.commit();
} catch (HibernateException e) {
if (null != tx) {
tx.rollback();
}
e.printStackTrace();
} finally {
closeSession();
}
return success;
}
/**
* 更新记录
*
* @param entity
* @return
*/
public boolean update(T entity) {
boolean success = true;
Transaction tx = null;
Session session = getSession();
try {
tx = session.beginTransaction();
session.update(entity);
tx.commit();
} catch (HibernateException e) {
if (null != tx) {
tx.rollback();
}
e.printStackTrace();
success = false;
} finally {
closeSession();
}
return success;
}
/**
* 得到所有的记录
*
* @param clz
* @return
*/
@SuppressWarnings("unchecked")
public List<T> getAll(Class<T> clz) {
Session session = getSession();
List<T> items = null;
try {
items = session.createCriteria(clz).list();
} catch (HibernateException e) {
e.printStackTrace();
} finally {
closeSession();
}
return items;
}
/**
* 传HQL语句,并带参数,查询 第二个参数可选
*
* @param hql
* @param param
* @return
*/
@SuppressWarnings("unchecked")
public List<T> findByHql(String hql, Object... param) {
Query query = getSession().createQuery(hql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
query.setParameter(i, param[i]);
}
}
return query.list();
}
/**
* 删除记录
*
* @param clz
* @param id
* @return 删除成功返回true,失败则返回false
*/
public boolean delete(Class<T> clz, Serializable id) {
boolean success = true;
Transaction tx = null;
Session session = getSession();
try {
tx = session.beginTransaction();
@SuppressWarnings("unchecked")
T obj = (T) session.get(clz, id);
session.delete(obj);
tx.commit();
} catch (HibernateException e) {
if (null != tx) {
tx.rollback();
}
e.printStackTrace();
success = false;
} finally {
closeSession();
}
return success;
}
/**
* 默认的查询
*
* @param clazz
* @param condition
* @return
*/
@SuppressWarnings("unchecked")
public List<T> search(Class<T> clazz, T condition) {
Session session = getSession();
List<T> results = null;
try {
results = session.createCriteria(clazz).add(Example.create(condition)).list();
} catch (RuntimeException re) {
re.printStackTrace();
} finally {
closeSession();
}
return results;
}
}
dao
package dao;
import entity.Users;
/**
* 接口
* @author miao
*
*/
public interface UsersDao {
/**
* 注册用户
*
* @param user
* @return
*/
public boolean register(Users user);
}
daoImpl
package dao.impl;
import dao.BaseHibernateDao;
import dao.UsersDao;
import entity.Users;
/**
* 接口实现类
*
* @author miao
*
*/
public class UsersDaoImpl extends BaseHibernateDao<Users> implements UsersDao {
/**
* 注册用户
*/
public boolean register(Users user) {
return super.add(user);
}
}
三、业务类和业务实现类
package biz;
import entity.Users;
/**
* 业务
*
* @author miao
*
*/
public interface UsersBiz {
/**
* 注册用户
*
* @param user
* @return
*/
public boolean register(Users user);
}
package biz.impl;
import dao.UsersDao;
import dao.impl.UsersDaoImpl;
import entity.Users;
import biz.UsersBiz;
/**
* 业务实现类
*
* @author miao
*
*/
public class UsersBizImpl implements UsersBiz {
// 调用dao
UsersDao usersDao = new UsersDaoImpl();
/**
* 注册用户
*/
public boolean register(Users user) {
return usersDao.register(user);
}
}
四、Action
1.注册用的Action
2.验证框架xml文件
3.写配置的时候用到的提示文件 xwork-validator-1.0.2.dtd
action
package action;
import biz.UsersBiz;
import biz.impl.UsersBizImpl;
import com.opensymphony.xwork2.ActionSupport;
import entity.Users;
/**
* 用户的Action
*
* @author miao
*
*/
public class UsersAction extends ActionSupport {
UsersBiz usersBiz = new UsersBizImpl(); // 业务类
private Users users; // 注册实体类
private String name; // 名字
private String password; // 密码
private String message;// 返回的提示信息
private String repassword;// 新加入的属性,用来接收确认密码
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
/**
* 注册
*
* @return
*/
public String register() {
if (usersBiz.register(users)) {
return SUCCESS;
} else {
super.addActionMessage("注册失败");
return INPUT;
}
}
}
验证框架,通过xml实现
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "xwork-validator-1.0.2.dtd"> <validators> <!-- 验证用户名 --> <field name="users.name"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用户名不能为空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">10</param> <message>用户名长度须在${minLength}和${maxLength}之间</message> </field-validator> </field> <!-- 验证密码 --> <field name="users.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密码不能为空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <message>密码长度必须大于等于${minLength}</message> </field-validator> </field> <!-- 验证密码确认 --> <field name="repassword"> <field-validator type="fieldexpression"> <param name="expression">users.password==repassword</param> <message>密码和确认密码必须相同</message> </field-validator> </field> <!-- 验证固话 --> <field name="users.telephone"> <field-validator type="requiredstring"> <message>电话号码不能为空</message> </field-validator> <field-validator type="regex"> <param name="expression">^(\d{3,4})?(\d{7,8})$</param> <message>电话号码格式不正确</message> </field-validator> </field> <!-- 用户姓名的验证 --> <field name="users.username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用户 姓名不能为空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">2</param> <param name="maxLength">4</param> <message>用户姓名长度须在${minLength}和${maxLength}之间</message> </field-validator> </field> </validators>
五、页面(注册页面和注册成功页面)
注册
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":"
+ request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户注册</title>
</head>
<body>
<div id="regLogin" class="wrap">
<div class="dialog">
<dl class="clearfix">
<dt>新用户注册</dt>
<dd class="past">填写个人信息</dd>
</dl>
<div class="box">
<s:form action="register" method="post" namespace="/">
<div class="infos">
<table class="field">
<tr>
<td class="field">用 户 名:</td>
<td>
<s:textfield name="users.name" cssClass="text" />
<s:fielderror fieldName="users.name" />
</td>
</tr>
<tr>
<td class="field">密 码:</td>
<td>
<!-- 保留密码 -->
<s:password name="users.password" cssClass="text" showPassword="true" />
<s:fielderror fieldName="users.password" />
</td>
</tr>
<tr>
<td class="field">确认密码:</td>
<td>
<s:password name="repassword" cssClass="text" showPassword="true" />
<s:fielderror fieldName="repassword" />
</td>
</tr>
<tr>
<td class="field">电 话:</td>
<td>
<s:textfield name="users.telephone" cssClass="text" />
<s:fielderror fieldName="users.telephone" />
</td>
</tr>
<tr>
<td class="field">用户姓名:</td>
<td>
<s:textfield name="users.username" cssClass="text" />
<s:fielderror fieldName="users.username" />
</td>
</tr>
</table>
<div class="buttons">
<s:submit value="注册" />
</div>
</div>
</s:form>
</div>
</div>
</div>
</body>
</html>
注册成功
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":"
+ request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>注册成功</title>
</head>
<body>
<div id="regLogin" class="wrap">
<p>恭喜:注册成功!</p>
</div>
</body>
</html>
六、demo