这是个用JSP+Hibernate编写的非常简单的留言系统例子,是个准三层结构(因为为了节省时间着重介绍hibernate部分,省去的service层,转而使用jsp页面进行业务处理,但并不是在jsp页面上过多的编写java代码,而是使用专门的jsp作为业务处理层)
开发工具:MyEclipse+Mysql
目录结构如下:
config(配置类)
BeanConfig.java MessageConfig.java
constants(常量类) Constants.java
dao(数据访问类) hibernate MessageDAO.java UserDAO.java IMessageDAO.java IUserDAO.java
exception(异常类) MessageAuthorityException.java MessageDAOException.java MessageException.java
model(模型类) Message.hbm.xml Message.java User.hbm.xml User.java
sql (数据库脚本) scrip.sql
util(工具类) DaoFactory.java HibernateDAO.java HibernateFilter.java HibernateUtil.java
BeanConfig.java
package cn.hxex.message.config; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import cn.hxex.message.exception.MessageException; public class BeanConfig ... { private String id; private String type; public String getId() ...{ return id; } public void setId(String id) ...{ this.id = id; } public String getType() ...{ return type; } public void setType(String type) ...{ this.type = type; } private Object instance; public Object getInstance() ...{ if( null!=instance ) return instance; try ...{ Class cls = Class.forName( getType() ); instance = cls.newInstance(); return instance; } catch( Exception ex ) ...{ throw new MessageException( "Couldn't find class:" + getType() ); } } public String toString() ...{ return ReflectionToStringBuilder.toString( this ); }}MessageConfig
package cn.hxex.message.config; import java.util.Hashtable; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import cn.hxex.message.exception.MessageException; /** */ /** * 系统配置信息类 */ public class MessageConfig ... { public static Hashtable beans; /** *//** * 构造函数 */ public MessageConfig() ...{ beans = new Hashtable(); } /** *//** * 增加一个BeanConfig对象 * @param bean */ public void addBean(BeanConfig bean) ...{ beans.put(bean.getId(), bean); } /** *//** * 得到一个DAO接口对象的实例 * @param name DAO接口对象的名称 * @return 指定DAO接口的实现类的实例 */ public Object getBean(String name) ...{ BeanConfig config = (BeanConfig) beans.get(name); if (config == null) ...{ throw new MessageException("Couldn't find the bean: " + name); } return config.getInstance(); } public String toString() ...{ return ReflectionToStringBuilder.toString(this); }}Constants
package cn.hxex.message.constants; public class Constants ... { public static final String SESSION_USER = "cn.hxex.message.user";}
IMessageDAO
package cn.hxex.message.dao; import java.util.List; import cn.hxex.message.model.Message; public interface IMessageDAO ... { public void saveMessage( Message message ); public void updateMessage( Message message ); public List getMessages( ); public void deleteMessage( String id, String userId ); public Message getMessage( String id );}IUserDAO
package cn.hxex.message.dao; import cn.hxex.message.model.User; public interface IUserDAO ... { public void saveUser( User user ); public User getUser( String username ); public User getUserById( String id );}
MessageDAO
package cn.hxex.message.dao.hibernate; import java.util.List; import cn.hxex.message.dao.IMessageDAO; import cn.hxex.message.exception.MessageDAOException; import cn.hxex.message.model.Message; import cn.hxex.message.util.HibernateDAO; /** */ /** * IMessageDAO接口的Hibernate实现 */ public class MessageDAO extends HibernateDAO implements IMessageDAO ... { /** *//** * 保存留言信息 * * @param message * 被保存的留言对象 */ public void saveMessage(Message message) ...{ super.saveObject(message); } /** *//** * 得到所有的留言信息 * * @return 返回所有的留言信息 */ public List getMessages() ...{ String hsql = "from Message"; return super.getObjects(hsql); } /** *//** * 删除留言信息 * * @param id * 要删除的留言信息的ID值 * @param userId * 执行删除操作的用户ID */ public void deleteMessage(String id, String userId) ...{ Message msg = getMessage(id); if (msg == null) ...{ throw new MessageDAOException("找不到你所要删除的留言!"); } if (!msg.getUser().getId().equals(userId)) ...{ throw new MessageDAOException("你不能删除别人的留言!"); } deleteObject(msg); } /** *//** * 得到留言信息 * * @param id * 留言的ID值 * @return 指定ID值得留言对象 */ public Message getMessage(String id) ...{ return (Message) getObject(Message.class, id); } /** *//** * 更新留言信息 * * @param message * 欲更新的留言对象 */ public void updateMessage(Message message) ...{ updateObject(message); }} UserDAO package cn.hxex.message.dao.hibernate; import cn.hxex.message.dao.IUserDAO; import cn.hxex.message.exception.MessageDAOException; import cn.hxex.message.model.User; import cn.hxex.message.util.HibernateDAO; /** */ /** * IUserDAO接口的Hibernate实现 */ public class UserDAO extends HibernateDAO implements IUserDAO ... { /** *//** * 保存用户信息到数据库 * @param user 被保存的用户对象 */ public void saveUser(User user) ...{ if (user == null) return; User u = getUser(user.getName()); if (u != null) throw new MessageDAOException("用户名已经存在,请使用其它用户名!"); saveObject(user); } /** *//** * 得到用户对象 * @param username 用户的登录名 * @return 指定登录名的用户对象 */ public User getUser(String username) ...{ User u = (User) getObject("from User u where u.name = '" + username + "'"); return u; } /** *//** * 得到用户对象的信息 * @param id 用户的ID值 * @return 指定的用户信息 */ public User getUserById(String id) ...{ return (User) getObject(User.class, id); }}
MessageAuthorityException
package cn.hxex.message.exception; public class MessageAuthorityException extends MessageException ... { private static final long serialVersionUID = 1L; public MessageAuthorityException(String message) ...{ super(message); }} MessageDAOException package cn.hxex.message.exception; public class MessageDAOException extends MessageException ... { private static final long serialVersionUID = 2L; public MessageDAOException(String message) ...{ super(message); }} MessageException package cn.hxex.message.exception; public class MessageException extends RuntimeException ... { /** *//** * Generated serialVersionUID */ private static final long serialVersionUID = 6905209869067708768L; public MessageException( String message ) ...{ super( message ); }}
Message.hbm.xml
<? xml version="1.0" ?> <! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > < hibernate-mapping package ="cn.hxex.message.model" > < class name ="Message" table ="MESSAGE" > < id name ="id" column ="ID" type ="string" > < generator class ="uuid.hex" /> </ id > < property name ="title" column ="TITLE" /> < property name ="content" column ="CONTENT" /> < many-to-one name ="user" column ="USER_ID" /> </ class > </ hibernate-mapping >
User.hbm.xml
<? xml version="1.0" ?> <! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > < hibernate-mapping package ="cn.hxex.message.model" > < class name ="User" table ="USERINFO" > < id name ="id" column ="ID" type ="string" > < generator class ="uuid.hex" /> </ id > < property name ="name" column ="NAME" /> < property name ="password" column ="PASSWORD" /> < set name ="messages" inverse ="true" cascade ="save-update" > < key column ="USER_ID" /> < one-to-many class ="Message" /> </ set > </ class > </ hibernate-mapping >
Message
package cn.hxex.message.model; import org.apache.commons.lang.builder.ReflectionToStringBuilder; public class Message ... { private String id; private String title; private String content; private User user; public String getContent() ...{ return content; } public void setContent(String content) ...{ this.content = content; } public String getId() ...{ return id; } public void setId(String id) ...{ this.id = id; } public String getTitle() ...{ return title; } public void setTitle(String title) ...{ this.title = title; } public User getUser() ...{ return user; } public void setUser(User user) ...{ this.user = user; } public String toString() ...{ return ReflectionToStringBuilder.toString( this ); } public int hashcode() ...{ if( id!=null ) this.id.hashCode(); return 0; } public boolean equals( Object obj ) ...{ if( obj==null ) return false; if( this==obj ) return true; if( obj instanceof Message ) ...{ if( this.id!=null ) return this.id.equals( ((Message)obj).getId() ); } return false; }}
User package cn.hxex.message.model; import java.util.Set; import org.apache.commons.lang.builder.ReflectionToStringBuilder; public class User ... { private String id; private String name; private String password; private Set messages; public String getId() ...{ return id; } public void setId(String id) ...{ this.id = id; } public Set getMessages() ...{ return messages; } public void setMessages(Set messages) ...{ this.messages = messages; } 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 toString() ...{ return ReflectionToStringBuilder.toString( this ); } public boolean equals( Object obj ) ...{ if( obj==null ) return false; if( this==obj ) return true; if( obj instanceof User ) ...{ if( this.id!=null ) return this.id.equals( ((User)obj).getId() ); } return false; }}
create table userinfo( id varchar ( 32 ) not null , name varchar ( 32 ) not null , password varchar ( 32 ) not null , constraint userinfo_pk primary key (id), constraint userinfo_unique_name unique (name)); create table message( id varchar ( 32 ) not null , title varchar ( 32 ) not null , content varchar ( 2000 ), user_id varchar ( 32 ), constraint message_pl primary key (id), constraint message_user_fk foreign key ( user_id ) references userinfo(id)) ENGINE = InnoDB DEFAULT CHARSET = gb2312;
DaoFactory
package cn.hxex.message.util; import java.io.IOException; import java.io.InputStream; import org.apache.commons.digester.Digester; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xml.sax.SAXException; import cn.hxex.message.config.MessageConfig; public class DaoFactory ... { private static Log log = LogFactory.getLog(DaoFactory.class); public static final MessageConfig messageConfig; static ...{ Digester digester = new Digester(); digester.setValidating( false ); digester.addObjectCreate( "config", "cn.hxex.message.config.MessageConfig" ); digester.addSetProperties( "config" ); digester.addObjectCreate( "config/bean", "cn.hxex.message.config.BeanConfig" ); digester.addSetProperties( "config/bean" ); digester.addSetNext( "config/bean", "addBean", "cn.hxex.message.config.BeanConfig" ); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream in = classLoader.getResourceAsStream( "MessageConfig.xml" ); MessageConfig config = null; try ...{ if( in!=null ) config = (MessageConfig)digester.parse( in ); } catch (IOException e) ...{ e.printStackTrace(); } catch (SAXException e) ...{ e.printStackTrace(); } messageConfig = config; } public static Object getDao( String name ) ...{ if( null==messageConfig ) return null; return messageConfig.getBean( name ); }}
HibernateDAO package cn.hxex.message.util; import java.util.List; /** */ /** * 使用Hibernate实现DAO的基础类 * 包括了持久化操作的一些基础方法 */ public class HibernateDAO ... { /** *//** * 保存对象信息到数据库 * @param obj 需要进行持久化操作的对象 */ public void saveObject(Object obj) ...{ HibernateUtil.getCurrentSession().save(obj); } /** *//** * 更新持久化对象 * @param obj 需要更新的对象 */ public void updateObject(Object obj) ...{ HibernateUtil.getCurrentSession().update(obj); } /** *//** * 使用HQL语句进行查询 * @param hsql 查询语句 * @return 符合条件的对象集合 */ public List getObjects(String hsql) ...{ List result = HibernateUtil.getCurrentSession().createQuery(hsql) .list(); return result; } /** *//** * 使用HQL语句进行对象的查询 * @param hsql 查询语句 * @return 符合条件的对象 */ public Object getObject(String hsql) ...{ Object result = HibernateUtil.getCurrentSession().createQuery(hsql) .uniqueResult(); return result; } /** *//** * 根据ID值得到持久化的对象 * @param cls 对象的类型 * @param id ID值 * @return 指定ID的对象 */ public Object getObject(Class cls, String id) ...{ Object result = HibernateUtil.getCurrentSession().get(cls, id); return result; } /** *//** * 删除对象信息 * @param obj 被删除的对象 */ public void deleteObject(Object obj) ...{ HibernateUtil.getCurrentSession().delete(obj); }}
HibernateFilter package cn.hxex.message.util; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class HibernateFilter implements Filter ... { private static Log log = LogFactory.getLog(HibernateFilter.class); public void init(FilterConfig filterConfig) throws ServletException ...{ log.info("Servlet filter init, now opening/closing a Session for each request."); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException ...{ // There is actually no explicit "opening" of a Session, the // first call to HibernateUtil.beginTransaction() in control // logic (e.g. use case controller/event handler, or even a // DAO factory) will get a fresh Session. try ...{ HibernateUtil.beginTransaction(); request.setCharacterEncoding( "gb2312" ); chain.doFilter(request, response); // Commit any pending database transaction. HibernateUtil.commitTransaction(); } catch (ServletException ex) ...{ log.debug("Rolling back the database transaction."); HibernateUtil.rollbackTransaction(); // Also closes the Session // Just rollback and let others handle the exception, e.g. for display throw ex; } catch (IOException ex) ...{ log.debug("Rolling back the database transaction."); HibernateUtil.rollbackTransaction(); // Also closes the Session // Just rollback and let others handle the exception, e.g. for display throw ex; } finally ...{ // No matter what happens, close the Session. HibernateUtil.closeSession(); } } public void destroy() ...{}}
HibernateUtil
package cn.hxex.message.util; import javax.naming.InitialContext; import javax.naming.NamingException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Interceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; public class HibernateUtil ... { private static Log log = LogFactory.getLog(HibernateUtil.class); private static final String INTERCEPTOR_CLASS = "hibernate.util.interceptor_class"; private static Configuration configuration; private static SessionFactory sessionFactory; private static ThreadLocal threadSession = new ThreadLocal(); private static ThreadLocal threadTransaction = new ThreadLocal(); private static boolean useThreadLocal = true; static ...{ // Create the initial SessionFactory from the default configuration files try ...{ // Replace with Configuration() if you don't use annotations or JDK 5.0 //configuration = new AnnotationConfiguration(); configuration = new Configuration(); // Read not only hibernate.properties, but also hibernate.cfg.xml configuration.configure(); // Assign a global, user-defined interceptor with no-arg constructor String interceptorName = configuration.getProperty(INTERCEPTOR_CLASS); if (interceptorName != null) ...{ Class interceptorClass = HibernateUtil.class.getClassLoader().loadClass(interceptorName); Interceptor interceptor = (Interceptor)interceptorClass.newInstance(); configuration.setInterceptor(interceptor); } // Disable ThreadLocal Session/Transaction handling if CMT is used if (org.hibernate.transaction.CMTTransactionFactory.class.getName() .equals( configuration.getProperty(Environment.TRANSACTION_STRATEGY) ) ) useThreadLocal = false; if (configuration.getProperty(Environment.SESSION_FACTORY_NAME) != null) ...{ // Let Hibernate bind it to JNDI configuration.buildSessionFactory(); } else ...{ // or use static variable handling sessionFactory = configuration.buildSessionFactory(); } } catch (Throwable ex) ...{ // We have to catch Throwable, otherwise we will miss // NoClassDefFoundError and other subclasses of Error log.error("Building SessionFactory failed.", ex); throw new ExceptionInInitializerError(ex); } } /** *//** * Returns the original Hibernate configuration. * * @return Configuration */ public static Configuration getConfiguration() ...{ return configuration; } /** *//** * Returns the global SessionFactory. * * @return SessionFactory */ public static SessionFactory getSessionFactory() ...{ SessionFactory sf = null; String sfName = configuration.getProperty(Environment.SESSION_FACTORY_NAME); if ( sfName != null) ...{ log.debug("Looking up SessionFactory in JNDI."); try ...{ sf = (SessionFactory) new InitialContext().lookup(sfName); } catch (NamingException ex) ...{ throw new RuntimeException(ex); } } else ...{ sf = sessionFactory; } if (sf == null) throw new IllegalStateException("SessionFactory not available."); return sf; } /** *//** * Closes the current SessionFactory and releases all resources. * <p> * The only other method that can be called on HibernateUtil * after this one is rebuildSessionFactory(Configuration). */ public static void shutdown() ...{ log.debug("Shutting down Hibernate."); // Close caches and connection pools getSessionFactory().close(); // Clear static variables configuration = null; sessionFactory = null; // Clear ThreadLocal variables threadSession.set(null); threadTransaction.set(null); } /** *//** * Rebuild the SessionFactory with the static Configuration. * <p> * This method also closes the old SessionFactory before, if still open. * Note that this method should only be used with static SessionFactory * management, not with JNDI or any other external registry. */ public static void rebuildSessionFactory() ...{ log.debug("Using current Configuration for rebuild."); rebuildSessionFactory(configuration); } /** *//** * Rebuild the SessionFactory with the given Hibernate Configuration. * <p> * HibernateUtil does not configure() the given Configuration object, * it directly calls buildSessionFactory(). This method also closes * the old SessionFactory before, if still open. * * @param cfg */ public static void rebuildSessionFactory(Configuration cfg) ...{ log.debug("Rebuilding the SessionFactory from given Configuration."); synchronized(sessionFactory) ...{ if (sessionFactory != null && !sessionFactory.isClosed()) sessionFactory.close(); if (cfg.getProperty(Environment.SESSION_FACTORY_NAME) != null) cfg.buildSessionFactory(); else sessionFactory = cfg.buildSessionFactory(); configuration = cfg; } } /** *//** * Retrieves the current Session local to the thread. * <p/> * If no Session is open, opens a new Session for the running thread. * If CMT is used, returns the Session bound to the current JTA * container transaction. Most other operations on this class will * then be no-ops or not supported, the container handles Session * and Transaction boundaries, ThreadLocals are not used. * * @return Session */ public static Session getCurrentSession() ...{ if (useThreadLocal) ...{ Session s = (Session) threadSession.get(); if (s == null) ...{ log.debug("Opening new Session for this thread."); s = getSessionFactory().openSession(); threadSession.set(s); } return s; } else ...{ return getSessionFactory().getCurrentSession(); } } /** *//** * Closes the Session local to the thread. * <p> * Is a no-op (with warning) if called in a CMT environment. Should be * used in non-managed environments with resource local transactions, or * with EJBs and bean-managed transactions. */ public static void closeSession() ...{ if (useThreadLocal) ...{ Session s = (Session) threadSession.get(); threadSession.set(null); Transaction tx = (Transaction) threadTransaction.get(); if (tx != null && (!tx.wasCommitted() || !tx.wasRolledBack()) ) throw new IllegalStateException("Closing Session but Transaction still open!"); if (s != null && s.isOpen()) ...{ log.debug("Closing Session of this thread."); s.close(); } } else ...{ log.warn("Using CMT/JTA, intercepted superfluous close call."); } } /** *//** * Start a new database transaction. * <p> * Is a no-op (with warning) if called in a CMT environment. Should be * used in non-managed environments with resource local transactions, or * with EJBs and bean-managed transactions. In both cases, it will either * start a new transaction or join the existing ThreadLocal or JTA * transaction. */ public static void beginTransaction() ...{ if (useThreadLocal) ...{ Transaction tx = (Transaction) threadTransaction.get(); if (tx == null) ...{ log.debug("Starting new database transaction in this thread."); tx = getCurrentSession().beginTransaction(); threadTransaction.set(tx); } } else ...{ log.warn("Using CMT/JTA, intercepted superfluous tx begin call."); } } /** *//** * Commit the database transaction. * <p> * Is a no-op (with warning) if called in a CMT environment. Should be * used in non-managed environments with resource local transactions, or * with EJBs and bean-managed transactions. It will commit the * ThreadLocal or BMT/JTA transaction. */ public static void commitTransaction() ...{ if (useThreadLocal) ...{ Transaction tx = (Transaction) threadTransaction.get(); try ...{ if ( tx != null && !tx.wasCommitted() && !tx.wasRolledBack() ) ...{ log.debug("Committing database transaction of this thread."); tx.commit(); } threadTransaction.set(null); } catch (RuntimeException ex) ...{ log.error(ex); rollbackTransaction(); throw ex; } } else ...{ log.warn("Using CMT/JTA, intercepted superfluous tx commit call."); } } /** *//** * Rollback the database transaction. * <p> * Is a no-op (with warning) if called in a CMT environment. Should be * used in non-managed environments with resource local transactions, or * with EJBs and bean-managed transactions. It will rollback the * resource local or BMT/JTA transaction. */ public static void rollbackTransaction() ...{ if (useThreadLocal) ...{ Transaction tx = (Transaction) threadTransaction.get(); try ...{ threadTransaction.set(null); if ( tx != null && !tx.wasCommitted() && !tx.wasRolledBack() ) ...{ log.debug("Tyring to rollback database transaction of this thread."); tx.rollback(); log.debug("Database transaction rolled back."); } } catch (RuntimeException ex) ...{ throw new RuntimeException("Might swallow original cause, check ERROR log!", ex); } finally ...{ closeSession(); } } else ...{ log.warn("Using CMT/JTA, intercepted superfluous tx rollback call."); } } /** *//** * Reconnects a Hibernate Session to the current Thread. * <p> * Unsupported in a CMT environment. * * @param session The Hibernate Session to be reconnected. */ public static void reconnect(Session session) ...{ if (useThreadLocal) ...{ log.debug("Reconnecting Session to this thread."); session.reconnect(); threadSession.set(session); } else ...{ log.error("Using CMT/JTA, intercepted not supported reconnect call."); } } /** *//** * Disconnect and return Session from current Thread. * * @return Session the disconnected Session */ public static Session disconnectSession() ...{ if (useThreadLocal) ...{ Transaction tx = (Transaction) threadTransaction.get(); if (tx != null && (!tx.wasCommitted() || !tx.wasRolledBack()) ) throw new IllegalStateException("Disconnecting Session but Transaction still open!"); Session session = getCurrentSession(); threadSession.set(null); if (session.isConnected() && session.isOpen()) ...{ log.debug("Disconnecting Session from this thread."); session.disconnect(); } return session; } else ...{ log.error("Using CMT/JTA, intercepted not supported disconnect call."); return null; } } /** *//** * Register a Hibernate interceptor with the current SessionFactory. * <p> * Every Session opened is opened with this interceptor after * registration. Has no effect if the current Session of the * thread is already open, effective on next close()/getCurrentSession(). * <p> * Attention: This method effectively restarts Hibernate. If you * need an interceptor active on static startup of HibernateUtil, set * the <tt>hibernateutil.interceptor</tt> system property to its * fully qualified class name. */ public static void registerInterceptorAndRebuild(Interceptor interceptor) ...{ log.debug("Setting new global Hibernate interceptor and restarting."); configuration.setInterceptor(interceptor); rebuildSessionFactory(); } public static Interceptor getInterceptor() ...{ return configuration.getInterceptor(); }}
<? 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" > <!-- Generated by MyEclipse Hibernate Tools. --> < hibernate-configuration > < session-factory > < property name ="hibernate.connection.username" > root </ property > < property name ="hibernate.connection.url" > jdbc:mysql://localhost:3306/guestmessagebook </ property > < property name ="hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ property > < property name ="myeclipse.connection.profile" > mysql </ property > < property name ="hibernate.connection.password" > 1234 </ property > < property name ="hibernate.connection.driver_class" > com.mysql.jdbc.Driver </ property > < property name ="show_sql" > true </ property > < mapping resource ="cn/hxex/message/model/Message.hbm.xml" /> < mapping resource ="cn/hxex/message/model/User.hbm.xml" /> </ session-factory > </ hibernate-configuration >
MessageConfig.xml
<? xml version="1.0" encoding="UTF-8" ?> < config > < bean id ="userDao" type ="cn.hxex.message.dao.hibernate.UserDAO" /> < bean id ="messageDao" type ="cn.hxex.message.dao.hibernate.MessageDAO" /> </ config >
index.jsp
<% @ page contentType = " text/html;charset=gb2312 " %> <% @ page isErrorPage = " true " %> < html > < head > < title > 欢迎使用留言板系统 !</ title > < meta http - equiv = " content-type " content = " text/html;charset=gb2312 " > < link rel = " stylesheet " href = " css/common.css " > < script language = " Javascript " src = " pub/js/common.js " ></ script > < script language = " javascript " > function checkValues(form) ... { var checked=[[form.name,"请输入用户名"],[form.password,"请输入密码"]]; if(!isRequired(checked))...{ return false; } return true; } function regist() ... { window.location="registinput.jsp"; } </ script > </ head > < body > < center > < h1 > 欢迎使用留言板系统 !</ h1 > < br > < table width = " 500 " > < form name = " main " method = " post " action = " logon.jsp " onSubmit = " return checkValues( this ); " > <% if (exception != null ) ... { %> <tr> <td colspan="2" class="warning"> <%=exception.getMessage() %> </td> </tr> <% } %> < tr > < td align = " right " > 用户名: </ td > < td >< input type = " text " name = " name " > *</ td > </ tr > < tr > < td align = " right " > 密码: </ td > < td >< input type = " password " name = " password " > *</ td > </ tr > < tr > < td align = " left " >& nbsp; & nbsp; </ td > < td align = " left " >< input type = " submit " name = " login " value = " 登录 " > < input type = " button " name = " register " value = " 注册 " onClick = " regist(); " ></ td > </ tr > < tr > < td align = " right " colspan = " 2 " > < img height = " 200 " src = " img/welcome.gif " > </ td > </ tr > </ form > </ table > </ center > </ body > </ html >
logon.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IUserDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.User, cn.hxex.message.exception.MessageDAOException, cn.hxex.message.constants.Constants" %><jsp:useBean id="user" scope="request" class="cn.hxex.message.model.User"></jsp:useBean><jsp:setProperty name="user" property="*"/><% IUserDAO userDAO = (IUserDAO)DaoFactory.getDao( "userDao" ); User u = userDAO.getUser( user.getName() ); if( u==null || !u.getPassword().equals( user.getPassword() ) ) { throw new MessageDAOException( "用户不存在或者密码错误!" ); } session.setAttribute( Constants.SESSION_USER, u.getId() ); response.sendRedirect( "message.jsp" ); %>
message.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IMessageDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.Message, cn.hxex.message.constants.Constants, java.util.List" %><html><head><title>留言列表</title><meta http-equiv="content-type" content="text/html;charset=gb2312"><link rel="stylesheet" href="css/common.css"><script language="Javascript" src="pub/js/common.js"></script><script language="javascript"> function checkValues(form){ var checked=[[form.title,"请输入留言标题"],[form.content,"请输入留言内容"]]; if(!isRequired(checked)){ return false; } return true; }</script></head><body><center><h1>留言列表</h1><table width="80%" border="1"> <tr> <td align="center">标题</td> <td align="center">发布人</td> <td align="center">内容</td> <td align="center">操作</td> </tr> <% String id=(String)session.getAttribute(Constants.SESSION_USER); IMessageDAO msgDao=(IMessageDAO)DaoFactory.getDao("messageDao"); List msgs=msgDao.getMessages(); for(int i=0;i<msgs.size();i++) { Message msg=(Message)msgs.get(i); %> < tr > < td width ="120" align ="left" > <% = msg.getTitle() %> </ td > < td width ="60" align ="left" > <% = msg.getUser().getName() %> </ td > < td width ="250" align ="left" > <% = msg.getContent() %> </ td > < td width ="80" align ="center" > <% ... if(msg.getUser().getId().equals(id)){ %> < a href ="messagedel.jsp?id=<%=msg.getId()%>" > 删除 </ a > < a href ="messageupdateinput.jsp?id=<%=msg.getId() %>" > 修改 </ a > <% ... } else{ out.println(" "); } %> </ td > </ tr > <% ... } %> </ table > < hr > < table width ="80%" > < form name ="main" method ="post" action ="messagesave.jsp" onSubmit ="return checkValues( this );" > < tr > < td > 标题: </ td > < td >< input type ="text" name ="title" size ="40" maxlength ="32" > * </ td > < td rowspan ="3" > < img src ="img/content.gif" width ="120" > </ td > </ tr > < tr > < td > 内容: </ td > < td >< textarea name ="content" cols ="40" rows ="10" ></ textarea > * </ td > </ tr > < tr > < td align ="center" colspan ="2" > < input type ="submit" name ="regist" value ="发布" > < input type ="reset" name ="reset" value ="重写" > </ td > </ tr > </ form > </ table > </ center > </ body > </ html >messagedel.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IUserDAO, cn.hxex.message.dao.IMessageDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.User, cn.hxex.message.model.Message, cn.hxex.message.constants.Constants, cn.hxex.message.exception.MessageDAOException, java.util.List" %><% String id=request.getParameter("id"); String userid=(String)session.getAttribute(Constants.SESSION_USER); IMessageDAO msgDao=(IMessageDAO)DaoFactory.getDao("messageDao"); msgDao.deleteMessage(id,userid); response.sendRedirect("message.jsp"); %>
messagesave.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IUserDAO, cn.hxex.message.dao.IMessageDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.User, cn.hxex.message.model.Message, cn.hxex.message.constants.Constants, java.util.List" %><jsp:useBean id="msg" scope="request" class="cn.hxex.message.model.Message"></jsp:useBean><jsp:setProperty name="msg" property="*"/><% String userId=(String)session.getAttribute(Constants.SESSION_USER); IUserDAO userDao=(IUserDAO)DaoFactory.getDao("userDao"); User u=userDao.getUserById(userId); IMessageDAO msgDao=(IMessageDAO)DaoFactory.getDao("messageDao"); msg.setUser(u); msgDao.saveMessage(msg); response.sendRedirect("message.jsp"); %>messageupdate.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IUserDAO, cn.hxex.message.dao.IMessageDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.User, cn.hxex.message.model.Message, cn.hxex.message.constants.Constants, cn.hxex.message.exception.MessageDAOException, java.util.List" %><jsp:useBean id="msg" scope="request" class="cn.hxex.message.model.Message"></jsp:useBean><jsp:setProperty property="*" name="msg"/><% String userId=(String)session.getAttribute(Constants.SESSION_USER); IUserDAO userDao=(IUserDAO)DaoFactory.getDao("userDao"); User u=userDao.getUserById(userId); IMessageDAO msgDao=(IMessageDAO)DaoFactory.getDao("messageDao"); msg.setUser(u); msgDao.updateMessage(msg); response.sendRedirect("message.jsp"); %>messageupdateinput.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IUserDAO, cn.hxex.message.dao.IMessageDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.User, cn.hxex.message.model.Message, cn.hxex.message.constants.Constants, cn.hxex.message.exception.MessageDAOException, java.util.List" %><jsp:include flush="true" page="pub/jsp/authority.jsp"></jsp:include><% String id=(String)request.getParameter("id"); IMessageDAO msgDao=(IMessageDAO)DaoFactory.getDao("messageDao"); Message msg=(Message)msgDao.getMessage(id); if(msg==null){ throw new MessageDAOException("找不到需要修改的留言"); } %> < html > < head > < title > 修改留言 </ title > < meta http-equiv ="content-type" content ="text/html;charset=gb2312" > < link rel ="stylesheet" href ="css/common.css" > < script language ="Javascript" src ="pub/js/common.js" ></ script > < script language ="javascript" > ... function checkValues(form)...{ var checked=[[form.title,"请输入留言标题"],[form.content,"请输入留言内容"]]; if(!isRequired(checked))...{ return false; } return true; } function message()...{ window.location="message.jsp"; } </ script > </ head > < body > < center > < h1 > 修改留言 </ h1 > < table width ="80%" > < form name ="main" method ="post" action ="messageupdate.jsp" onsubmit ="return checkValues( this );" > < tr > < td > 标题: </ td > < td >< input type ="text" name ="title" size ="50" maxlength ="32" value ="<%=msg.getTitle() %>" > * </ td > </ tr > < tr > < td > 内容: </ td > < td >< textarea name ="content" cols ="50" > <% = msg.getContent() %> </ textarea > * </ td > </ tr > < tr > < td align ="center" colspan ="2" > < input type ="submit" name ="save" value ="保存" > < input type ="reset" name ="reset" value ="重填" > < input type ="button" name ="return" value ="取消" onclick ="message();" > < input type ="hidden" name ="id" value ="<%=msg.getId() %>" > </ td > </ tr > < tr > < td align ="center" colspan ="2" > < br > < img src ="img/update.gif" width ="150" > </ td > </ tr > </ form > </ table > </ center > </ body > </ html > regist.jsp <% ... @ page contentType="text/html;charset=gb2312" %> <% ... @ page import="cn.hxex.message.dao.IUserDAO, cn.hxex.message.util.DaoFactory, cn.hxex.message.model.User, cn.hxex.message.constants.Constants" %> <jsp:useBean id="user" scope="request" class="cn.hxex.message.model.User"></jsp:useBean><jsp:setProperty property="*" name="user"/><% System.out.println(user); IUserDAO userDao=(IUserDAO)DaoFactory.getDao("userDao"); userDao.saveUser(user); session.setAttribute(Constants.SESSION_USER,user.getId()); response.sendRedirect("message.jsp"); %>
registinput.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> < html > < head > < title > 请输入注册信息! </ title > < meta http-equiv ="content-type" content ="text/html;charset=gb2312" > < link rel ="stylesheet" href ="css/common.css" > < script language ="Javascript" src ="pub/js/common.js" ></ script > </ head > < script language ="javascript" > ... function checkValues(form)...{ var checks=[[form.name,"请输入用户名"],[form.password,"请输入密码"],[form.repassword,"请输入确认密码"]]; if(!isRequired(checks))...{ return false; } if(form.password.value!=form.repassword.value)...{ alert("密码输入不一致,请重新输入"); form.password.value=""; form.repassword.value=""; form.password.focus(); return false; } return true; } function logon()...{ window.location="index.jsp"; } </ script > < body > < center > < h1 > 用户注册 </ h1 > < br > < table width ="300" > < tr > < td colspan ="2" align ="center" class ="warnning" > 请输入注册信息! </ td > </ tr > < form name ="main" method ="post" action ="regist.jsp" onSubmit ="return checkValues( this );" > < tr > < td align ="right" > 用户名: </ td > < td >< input type ="text" name ="name" > * </ td > </ tr > < tr > < td align ="right" > 密码: </ td > < td >< input type ="password" name ="password" > * </ td > </ tr > < tr > < td align ="right" > 确认密码: </ td > < td >< input type ="password" name ="repassword" > * </ td > </ tr > < tr > < td align ="center" colspan ="2" > < input type ="submit" name ="regist" value ="注册" > < input type ="reset" name ="reset" value ="重填" > < input type ="button" name ="Logon" value ="返回" onClick ="logon();" > </ td > </ tr > < tr > < td align ="center" colspan ="2" > < p >< p > < img src ="img/register.gif" height ="120" > </ td > </ tr > </ form > </ table > </ center > </ body > </ html >
web.xml
<? xml version="1.0" encoding="UTF-8" ?> < web-app xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" version ="2.4" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" > < filter > < filter-name > HibernateFilter </ filter-name > < filter-class > cn.hxex.message.util.HibernateFilter </ filter-class > </ filter > < filter-mapping > < filter-name > HibernateFilter </ filter-name > < url-pattern > /* </ url-pattern > </ filter-mapping > < servlet > < servlet-name > action </ servlet-name > < servlet-class > org.apache.struts.action.ActionServlet </ servlet-class > < init-param > < param-name > config </ param-name > < param-value > /WEB-INF/struts-config.xml </ param-value > </ init-param > < init-param > < param-name > debug </ param-name > < param-value > 3 </ param-value > </ init-param > < init-param > < param-name > detail </ param-name > < param-value > 3 </ param-value > </ init-param > < load-on-startup > 0 </ load-on-startup > </ servlet > < servlet-mapping > < servlet-name > action </ servlet-name > < url-pattern > *.do </ url-pattern > </ servlet-mapping > < welcome-file-list > < welcome-file > index.jsp </ welcome-file > </ welcome-file-list > < error-page > < exception-type > cn.hxex.message.exception.MessageDAOException </ exception-type > < location > /error/daoerror.jsp </ location > </ error-page > < error-page > < error-code > 404 </ error-code > < location > /index.jsp </ location > </ error-page > < error-page > < exception-type > cn.hxex.message.exception.MessageAuthorityException </ exception-type > < location > /index.jsp </ location > </ error-page > </ web-app >
common.js
function isRequired( checked ) ... { for( var i=0; i<checked.length; i++ ) ...{ var input = checked[i][0]; if( input.value==null || input.value.length==0 ) ...{ alert( checked[i][1] ); input.focus(); return false; } } return true;}
authority.jsp
<% ... @ page contentType="text/html;charset=gb2312" %> <% ... @page import="cn.hxex.message.constants.Constants, cn.hxex.message.exception.MessageAuthorityException" %><% String id = (String)session.getAttribute(Constants.SESSION_USER); if( id==null || id.length()==0 ) { throw new MessageAuthorityException( "你没有登录,请重新登录!" ); } %>