struts2.3.4+spring3.2+hibernate4.1.1
第一步:导入框架所需要的包
http://pan.baidu.com/share/link?shareid=119830&uk=909074031
第二步:修改web.xml文件
<?xml version="1.0"encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- Welcome File List --> <welcome-file-list 配置欢迎界面> <welcome-file>test.jsp</welcome-file> </welcome-file-list> <!-- WebApp Root --> <context-param> <param-name>webAppRootKey</param-name> <param-value>SSH</param-value> </context-param> <!-- Spring Encoding Filter --> <filter> <filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- Spring Encoding Filter Mapping--> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Struts2 Filter --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- Struts2 Filter Mapping --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Log4j ConfigurationFile Location Log4j 日志系统本地信息的配置--> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <!-- Spring Log4j Listener --> <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> <!-- Spring ConfigurationFile Location spring的xml配置文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Spring Context Listener --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- Spring Web Request Listener --> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <!-- Spring 防止内存溢出Spring Introspector Cleanup Listener --> <listener> <listener-class> org.springframework.web.util.IntrospectorCleanupListener </listener-class> </listener> </web-app>
第三步:添加LOG4J的配置文件
# Set The RootLogger log4j.rootLogger=info,console,html,txt # Direct Log Messages ToConsole 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=%d{yyyy-MM-dd HH:mm:ss} %p %c:%L - %m%n #html log4j.appender.html=org.apache.log4j.RollingFileAppender log4j.appender.html.File=c:/log.html log4j.appender.html.MaxFileSize=900KB log4j.appender.html.MaxBackupIndex=1 log4j.appender.html.layout=org.apache.log4j.HTMLLayout log4j.appender.html.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n #\u6587\u672c\u6587\u4ef6\u8f93\u51fa\u6e90 log4j.appender.txt=org.apache.log4j.RollingFileAppender log4j.appender.txt.File=c:/log.txt log4j.appender.txt.MaxFileSize=500KB log4j.appender.txt.MaxBackupIndex=1 log4j.appender.txt.layout=org.apache.log4j.PatternLayout log4j.appender.txt.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n # Log Hibernate log4j.logger.org.hibernate=info # Log Just The SQL log4j.logger.org.hibernate.SQL=info # Log Schema Export Update log4j.logger.org.hibernate.tool.hbm2ddl=info
第四步:创建hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.show_sql">true</property> <mapping resource="entity/Person.hbm.xml"/> </session-factory> </hibernate-configuration>
第五步:struts.xml
<?xml version="1.0"encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="false" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="default" extends="struts-default"> <action name="person_*"method="{1}" class="action.PersonAction"> <result name="input">/index.jsp</result> <result name="ok">/index.jsp</result> <result name="ajax-json">/ajax.jsp</result> </action> </package> </struts>
第六步:applicationContext.xml
<?xml version="1.0"encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:component-scan base-package="action,dao,biz,util"/> <!-- DataSource --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"value="oracle.jdbc.driver.OracleDriver"/> <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.3.186:1521:orcl"/> <property name="user" value="bam1"/> <property name="password" value="bam1"/> </bean> <!—SessionFactory的注入--> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="classpath:hibernate.cfg.xml"/> <!-- SessionFactory 另一种配置hibernate属性的信息,通过这种方式配置,就不需要hibernate.cfg.xml文件 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" p:dataSource-ref="dataSource" > <propertyname="hibernateProperties"> <props> <propkey="hibernate.show_sql">true</prop> <propkey="hibernate.format_sql">true</prop> <propkey="hibernate.hbm2ddl.auto">update</prop> <propkey="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> </props> </property> <property name="mappingResouce"> <list> //各种实体映射文件 <value>entity/Person.hbm.xml</value> <value>entity/Person.hbm.xml</value> <value>entity/Person.hbm.xml</value> <value>entity/Person.hbm.xml</value> </list> </property> </bean> --> </beans>
第七步:工具辅助类HibernateUtil
package util; importjava.io.Serializable; import java.util.ArrayList; importjava.util.List; importjavax.annotation.Resource; importorg.hibernate.Criteria; importorg.hibernate.Query; importorg.hibernate.Session; importorg.hibernate.SessionFactory; importorg.hibernate.Transaction; importorg.hibernate.criterion.DetachedCriteria; import org.springframework.stereotype.Component; /** * @author Administrator 工具类适用于WEB版,通过SPRING容器注入SessionFactory */ @Component public classHibernateUtil { @Resource(name = "sessionFactory") private SessionFactory factory; //这里名称指向applicationContext.xml中注入的bean名 /** * @return返回会话工厂 */ public SessionFactory getFactory() { return factory; } /** * @return返回会话 */ public Session getSession() { return factory.openSession(); } /** * @param obj * @return返回是否添加成功 */ public boolean add(Object obj) { Session s = null; Transaction t = null; boolean result = false; try { s = getSession(); t =s.beginTransaction(); s.save(obj); t.commit(); result = true; } catch (Exception e) { if (t != null) t.rollback(); e.printStackTrace(); } finally { if (s != null) s.close(); } return result; } /** * @param obj * @return返回是否修改成功 */ public boolean update(Object obj) { Session s = null; Transaction t = null; boolean result = false; try { s = getSession(); t =s.beginTransaction(); s.update(obj); t.commit(); result = true; } catch (Exception e) { if (t != null) t.rollback(); e.printStackTrace(); } finally { if (s != null) s.close(); } return result; } /** * @param obj * @return返回是否删除成功 */ public boolean delete(Object obj) { Session s = null; Transaction t = null; boolean result = false; try { s = getSession(); t =s.beginTransaction(); s.delete(obj); t.commit(); result = true; } catch (Exception e) { if (t != null) t.rollback(); e.printStackTrace(); } finally { if (s != null) s.close(); } return result; } /** * @param cla * @param id * @return根据主键ID查询一条数据 */ @SuppressWarnings("unchecked") public <T> T get(Class<T>cla, Serializable id) { Session s = null; T obj = null; try { s = getSession(); obj = (T) s.get(cla,id); } catch (Exception e) { e.printStackTrace(); } finally { if (s != null) s.close(); } return obj; } /** * @param hql语句 * @param pras参数数组 * @param isCache是否要缓存数据 * @return返回多条数据 */ public <T> List<T>query(String hql, boolean isCache, Object... pras) { List<T> list = new ArrayList<T>(); Session s = null; try { s = getSession(); Query q =s.createQuery(hql); // 设置允许二级缓存 q.setCacheable(isCache); if (pras != null) { for (int i= 0; i < pras.length; i++) { q.setString(i,pras[i].toString()); } } list = q.list(); } catch (Exception e) { e.printStackTrace(); } finally { if (s != null) s.close(); } return list; } /** * @param <T> * @param hql语句 * @param pras参数 * @param page当前第几页 * @param size一页显示数据个数 * @return分页获取数据 */ public <T> List<T>queryByPage(String hql, int page, int size, Object... pras) { List<T> list = newArrayList<T>(); Session s = null; try { s = getSession(); Query q =s.createQuery(hql); if (pras != null) { for (int i= 0; i < pras.length; i++) { q.setString(i,pras[i].toString()); } } // 设置开始记录数 q.setFirstResult((page- 1) * size); // 设置每页获取的数据数量 q.setMaxResults(size); list = q.list(); } catch (Exception e) { e.printStackTrace(); } finally { if (s != null) s.close(); } return list; } /** * @param hql语句 * @param pras参数 * @return * @return返回单条查询数据 */ public <T> T queryUnique(Stringhql, Object... pras) { T obj = null; Session s = null; try { s = getSession(); Query q =s.createQuery(hql); if (pras != null) { for (int i= 0; i < pras.length; i++) { q.setString(i,pras[i].toString()); } } obj = (T)q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); } finally { if (s != null) s.close(); } return obj; } public <T> List<T>dcQuery(DetachedCriteria dc) { Session s = getSession(); Criteria c =dc.getExecutableCriteria(s); List list = c.list(); s.close(); return list; } }
第八步:数据层操作的接口
package dao; importjava.util.List; importorg.hibernate.criterion.DetachedCriteria; /** * @author Administrator 通过的数据操作接口 */ public interfaceBaseDao { /** * @param <T> * @param t添加 */ public <T> void save(T t); /** * @param <T> * @param t删除 */ public <T> void delete(T t); /** * @param <T> * @param entityClass * @param id根据主键ID删除 */ public <T> void delete(Class<T>entityClass, Integer id); /** * @param <T> * @param t更新数据 */ public <T> void update(T t); /** * @param <T> * @param entityClass * @param id * @return根据ID查询单条数据,适用于JDBC的操作,不适用于hibernate */ public <T> T get(Class<T>entityClass, Integer id); /** * @param <T> * @param entityClass * @param pras * @return根据多个条件查询,但返回数据必须是单条数据 */ public <T> T get(Class<T>entityClass, String hql, Object... pras); /** * @param <T> * @param hql * @param entityClass * @param param * @return根据条件或无条件查询多条数据 */ public <T> List<T>findAll(String hql, Class<T> entityClass, Object... param); /** * @param <T> * @param hql * @param entityClass * @param page页数 * @param size每页显示的数据记录数 * @param param * @return根据条件或无条件,分页获取数据 */ public <T> List<T>findByPage(String hql, Class<T> entityClass, int page, int size, Object...param); /** * @param hql * @param param * @return获取通过聚合函数取到的数据,如获取总的记录数 */ public int findCount(String hql,Object... param); public ObjectfindByOne(DetachedCriteria dc); }
第九步:数据层操作类的实现
package dao; importjava.util.List; importjavax.annotation.Resource; importorg.hibernate.criterion.DetachedCriteria; import org.springframework.stereotype.Repository; importutil.HibernateUtil; /** * @author Administrator 通过表数据操作类 */ @Repository public classBaseDaoImpl implements BaseDao { @Resource private HibernateUtil util; public <T> void save(T t) { util.add(t); } public <T> void update(T t) { util.update(t); } public <T> void delete(T t) { util.delete(t); } public <T> voiddelete(Class<T> entityClass, Integer id) { // JDBC使用 } public <T> List<T>findAll(String hql, Class<T> entityClass, Object... param) { return util.query(hql, false,param); } public <T> List<T>findByPage(String hql, Class<T> entityClass, int page, int size, Object...param) { // TODO Auto-generated methodstub return util.queryByPage(hql,page, size, param); } public <T> T get(Class<T>entityClass, Integer id) { // TODO Auto-generated methodstub return util.get(entityClass,id); } public <T> T get(Class<T>entityClass, String hql, Object... pras) { // TODO Auto-generated methodstub return util.queryUnique(hql,pras); } public int findCount(String hql,Object... param) { // TODO Auto-generated methodstub Object[] obj =util.queryUnique(hql, param); returnInteger.parseInt(obj[0].toString()); } public ObjectfindByOne(DetachedCriteria dc) { // TODO Auto-generated methodstub return util.dcQuery(dc).size(); } }
第十步:编写实体类映射元文件
<hibernate-mapping package="entity"> <class name="Person" table="t_person"> <id name="personId"> <generator class="native"/> </id> <property name="personName"/> </class> </hibernate-mapping>
第十一步:编写业务逻辑层接口和实现类
package biz; import java.util.List; import entity.Person; public interface PersonBiz { public void add(Person person); public void update(Person person); public void delete(int id); public Person queryByUnique(int id); public List<Person> queryByAll(); public List<Person> queryByPage(intpage, int size); public int getCount(); } 实现类 packagebiz; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import util.LogUtil; import dao.BaseDao; import entity.Person; @Service //注解 public class PersonBizImpl implementsPersonBiz { @Resource //注解 privateBaseDao dao; publicvoid add(Person person) { //TODO Auto-generated method stub dao.save(person); LogUtil.getLog(PersonBizImpl.class).info( "执行了添加用户的操作:用户名=" +person.getPersonName()); } publicvoid delete(int id) { dao.delete(newPerson(id)); } publicint getCount() { //TODO Auto-generated method stub //使用多条件查询时 //DetachedCriteria dc = DetachedCriteria.forClass(Person.class); //for (int i = 0; i < fieds.length; i++) { //dc.add(Restrictions.eq(fieds[i], value[i])); //} returndao.findCount("select count(*) from Person"); } publicList<Person> queryByAll() { //TODO Auto-generated method stub returndao.findAll("from Person", Person.class); } publicList<Person> queryByPage(int page, int size) { //TODO Auto-generated method stub returndao.findByPage("from Person", Person.class, page, size); } publicPerson queryByUnique(int id) { //TODO Auto-generated method stub returndao.get(Person.class, id); } publicvoid update(Person person) { //TODO Auto-generated method stub dao.update(person); } }
第十二步:编写Action类
package action; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import biz.PersonBiz; import com.google.gson.Gson; import entity.Person; @Controller public class PersonAction { privateString message; privatePerson person; publicString getMessage() { returnmessage; } publicvoid setMessage(String message) { this.message= message; } publicPerson getPerson() { returnperson; } publicvoid setPerson(Person person) { this.person= person; } @Resource privatePersonBiz biz; publicString add() { biz.add(person); setMessage("添加成功!"); return"ok"; } publicString query() { Gsonjson = new Gson(); List<Person>list = biz.queryByAll(); Stringstr = json.toJson(list); setMessage(str); return"ajax-json"; } }