该例子使用 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