1.导入Struts包
2.导入Spring包.
选择Spring1.2 Core Libraries;
Spring1.2 AOP Libraries;
Spring1.2 ORM/DAO/Hibernate3 Libraries;
其它为可选包.
3.导入Hibernate3.0包
hibernate.cfg.xml中配置数据源,建议设定<property name="show_sql">true</property>以跟踪数据交互中的SQL语句.全文如下:
<?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="connection.username">gl114</property>
<property name="connection.url">jdbc:oracle:thin:@132.159.173.154:1521:ora10g</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.password">gl114</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="show_sql">true</property>
<property name="myeclipse.connection.profile">ORACLE10G</property>
<! -----以下是映射文件,Myeclipse Database Explorer工具可以选定数据表自动生成此文件以及框架中至关重要的POJO和DAO类 -------->
<mapping resource="com/ideal/framework/dao/RoleSource.hbm.xml"></mapping>
<mapping resource="com/ideal/framework/dao/Source.hbm.xml"></mapping>
<mapping resource="com/ideal/framework/dao/Role.hbm.xml"></mapping>
<mapping resource="com/ideal/framework/dao/RoleUser.hbm.xml"></mapping>
<mapping resource="com/ideal/framework/dao/RoadName.hbm.xml" />
</session-factory>
</hibernate-configuration>
4.在Spring的applicationContext.xml中配置Hibernate sessionFactory及事务处理,全文如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-----配置HibernateSessionFactory------->
<bean id="HibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>/hibernate.cfg.xml</value>
</property>
</bean>
<!-- Session end -->
<!-----配置事务处理------->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="HibernateSessionFactory" />
</property>
</bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- Transaction end -->
<!----在Service中注入DAO实例---->
<bean id="RoadNameService" parent="txProxyTemplate">
<property name="target">
<bean class="com.ideal.framework.service.RoadNameService">
<!-----此name需与RoadNameService中的属性名大小写一致,且Service中必须要定义有它相应的getter和setter方法.此处亦可定义多个属性----->
<property name="roadNameDAO">
<!-----此bean需与DAO部分中定义的 <bean id="RoadNameDAO" >一致----->
<ref bean="RoadNameDAO" />
</property>
</bean>
</property>
</bean>
<!-- Service end -->
<!----DAO部分在生成映射文件及DAO和POJO的时候会自动更新到此文件-------->
<bean id="RoleSourceDAO" class="com.ideal.framework.dao.RoleSourceDAO">
<property name="sessionFactory">
<ref bean="HibernateSessionFactory" />
</property>
</bean>
<bean id="SourceDAO" class="com.ideal.framework.dao.SourceDAO">
<property name="sessionFactory">
<ref bean="HibernateSessionFactory" />
</property>
</bean>
<bean id="RoleDAO" class="com.ideal.framework.dao.RoleDAO">
<property name="sessionFactory">
<ref bean="HibernateSessionFactory" />
</property>
</bean>
<bean id="RoleUserDAO" class="com.ideal.framework.dao.RoleUserDAO">
<property name="sessionFactory">
<ref bean="HibernateSessionFactory" />
</property>
</bean>
<bean id="RoadNameDAO" class="com.ideal.framework.dao.RoadNameDAO">
<property name="sessionFactory">
<ref bean="HibernateSessionFactory" />
</property>
</bean>
<!------DAO end-------->
</beans>
5.log4j.properties文件用来记载服务启动日志.如下:
#set the level of the root logger
log4j.rootLogger = INFO,CONSOLE,DAYFILE
#################### Console Appender ###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,} %m%n
#################### File Appender ###################
log4j.appender.DAYFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAYFILE.file=log4j.log
log4j.appender.DAYFILE.datePattern = '.'yyyy-MM-dd
log4j.appender.DAYFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DAYFILE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,} %m%n
6.设计框架类BaseAction.java继承Struts中的DispatchAction
package com.ideal.framework.design;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.actions.DispatchAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BaseAction extends DispatchAction {
// 加载日志跟踪文件
public final Log log = LogFactory.getLog(getClass());
private static ApplicationContext ctx = null;
// 定义getBean(String name)方法用以从spring beanfactory中查找对应的bean.
public Object getBean(String name) {
if (ctx == null) {
initSpringConfig();
}
return ctx.getBean(name);
}
// 初始化applicationContext.xml得到beanfactory
public void initSpringConfig() {
try {
if (ctx == null) {
String[] ctxs = new String[] { "applicationContext.xml" };
ctx = new ClassPathXmlApplicationContext(ctxs);
log.debug(" |Load Spring Config succeed.");
}
} catch (Exception e) {
log.debug(" |Load Spring Config Fail.");
e.printStackTrace();
System.exit(0);
}
}
/**
* Convenience method to initialize messages in a subclass.
*
* @param request
* the current request
* @return the populated (or empty) messages
*/
public ActionMessages getMessages(HttpServletRequest request) {
ActionMessages messages = null;
HttpSession session = request.getSession();
if (request.getAttribute(Globals.MESSAGE_KEY) != null) {
messages = (ActionMessages) request
.getAttribute(Globals.MESSAGE_KEY);
saveMessages(request, messages);
} else if (session.getAttribute(Globals.MESSAGE_KEY) != null) {
messages = (ActionMessages) session
.getAttribute(Globals.MESSAGE_KEY);
saveMessages(request, messages);
session.removeAttribute(Globals.MESSAGE_KEY);
} else {
messages = new ActionMessages();
}
return messages;
}
}
7.定义BaseService.java中跟踪日志的代码
package com.ideal.framework.design;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class BaseService {
private final Log log = LogFactory.getLog(getClass());
}
8.DAO类中会自动生成对表操作的基本方法,设计人员也可自行添加业务所需要的方法.
package com.ideal.framework.dao;
// default package
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.criterion.Example;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* Data access object (DAO) for domain model class Role.
* @see .Role
* @author MyEclipse - Hibernate Tools
*/
public class RoleDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(RoleDAO.class);
protected void initDao() {
//do nothing
}
public void save(Role transientInstance) {
log.debug("saving Role instance");
try {
getHibernateTemplate().saveOrUpdate(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void delete(Role persistentInstance) {
log.debug("deleting Role instance");
try {
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public Role findById( RoleId id) {
log.debug("getting Role instance with id: " + id);
try {
Role instance = (Role) getHibernateTemplate()
.get("Role", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
public List findByExample(Role instance) {
log.debug("finding Role instance by example");
try {
List results = getSession()
.createCriteria("Role")
.add(Example.create(instance))
.list();
log.debug("find by example successful, result size: " + results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
public Role merge(Role detachedInstance) {
log.debug("merging Role instance");
try {
Role result = (Role) getHibernateTemplate()
.merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
public void attachDirty(Role instance) {
log.debug("attaching dirty Role instance");
try {
getHibernateTemplate().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public void attachClean(Role instance) {
log.debug("attaching clean Role instance");
try {
getHibernateTemplate().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public static RoleDAO getFromApplicationContext(ApplicationContext ctx) {
return (RoleDAO) ctx.getBean("RoleDAO");
}
}
9.每个业务模块对应最基本的四层,即DAO(继承HibernateDaoSupport类)-->Service(继承BaseService)-->Action(继承BaseAction)-->JSP
DAO:组装SQL.,访问数据库.HibernateDaoSupport中定义了getHibernateTemplate()方法.
Service:拥有DAO实例.处理业务逻辑
Action:调用Service对象,根据处理结果定义用户响应页面的跳转.同时也可包含少量的业务逻辑.
JSP:与用户信息交互的窗口