JSP+Hibernate入门级实例--留言系统
2007-07-19 14:52
441 查看
这是个用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"> </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( "你没有登录,请重新登录!" );
}
%>
开发工具: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"> </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( "你没有登录,请重新登录!" );
}
%>
相关文章推荐
- JSP+Hibernate入门级实例--留言系统
- Struts+hibernate入门实例-投票系统
- Struts+hibernate入门实例-投票系统
- ExtJS5 - 一个简洁完整的后台管理系统入门实例
- hibernate入门实例
- JSP网站开发入门基础与实例高清视频教程
- Hibernate入门实例——Hibernate分页查询
- javaWeb入门<1>Servlet+Jsp+JavaBean实现MVC开发模式登陆注册实例详解
- hibernate 入门实例
- JSP入门<1>九大内置对象实例详解
- Hibernate入门经典实例
- Eclipse快速上手Hibernate之入门实例
- eclipse hibernate入门实例
- Hibernate入门实例
- hibernate入门实例-1
- hibernate入门实例(一)(初学者)
- JSP入门之HelloWorld程序实例
- hibernate入门实例
- 【框架】[Hibernate]构架知识点详解入门与测试实例
- struct hibernate spring 经典框架 搭建 入门实例