首页 > 代码库 > Struts2.3.16.1+Hibernate4.3.4+Spring4.0.2 框架整合

Struts2.3.16.1+Hibernate4.3.4+Spring4.0.2 框架整合

最新版Struts2+Hibernate+Spring整合

目前为止三大框架最新版本是:

struts2.3.16.1

hibernate4.3.4

spring4.0.2

其中struts2和hibernate的下载方式比较简单,但是spring下载有点麻烦,可以直接复制下面链接下载最新版spring


\http://repo.springsource.org/libs-release-local/org/springframework/spring/4.0.2.RELEASE/spring-framework-4.0.2.RELEASE-dist.zip 

一. 所需的jar包(其中aopaliance-1.0.jar,是spring所依赖的jar,直接复制粘贴到谷歌百度就有的下载)

框架

版本

所需jar包

Struts2

2.3.16.1

  

Hibernate

4.3.4   

spring

4.0.2


其它


二. 创建一张表

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. CREATE TABLE `user` (  
  2.   
  3. `id` int(11) NOT NULL AUTO_INCREMENT,  
  4.   
  5. `user_name` varchar(20) DEFAULT NULL,  
  6.   
  7. `password` varchar(20) DEFAULT NULL,  
  8.   
  9. `address` varchar(100) DEFAULT NULL,  
  10.   
  11. `phone_number` varchar(20) DEFAULT NULL,  
  12.   
  13. `create_time` datetime DEFAULT NULL,  
  14.   
  15. `update_time` datetime DEFAULT NULL,  
  16.   
  17. PRIMARY KEY (`id`)  
  18.   
  19. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULTCHARSET=utf8;  
  20.   
  21. ---并插入一条数据  
  22. INSERT INTO `user` VALUES ("1‘, ‘test‘,‘test‘, ‘test‘, ‘test‘, ‘2014-03-29 00:48:14‘, ‘2014-03-29 00:48:17‘);  

三. 先看下myeclipse的目录结构



四. 配置文件

1. web.xml

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!--?xml version="1.0" encoding="UTF-8"?-->  
  2. <web-app version="3.0" 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   
  3.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
  4.   <display-name></display-name>   
  5.      
  6.   <!-- 添加对spring的支持 -->  
  7.   <context-param>  
  8.     <param-name>contextConfigLocation</param-name>  
  9.     <param-value>classpath:applicationContext.xml</param-value>  
  10.   </context-param>  
  11.      
  12.     <listener>  
  13.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  14.     </listener>  
  15.        
  16.   <!-- 添加对struts2的支持 -->  
  17.   <filter>  
  18.     <filter-name>struts2</filter-name>  
  19.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  20.   </filter>   
  21.   <!-- 当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,  
  22.      hibernate会自动关闭session,这样,当要使用子数据的时候,系统会抛出lazyinit的错误,  
  23.       这时就需要使用spring提供的 OpenSessionInViewFilter,OpenSessionInViewFilter主要是保持Session状态  
  24.       知道request将全部页面发送到客户端,这样就可以解决延迟加载带来的问题 -->  
  25.    <filter>  
  26.     <filter-name>openSessionInViewFilter</filter-name>  
  27.     <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>  
  28.     <init-param>  
  29.       <param-name>singleSession</param-name>  
  30.       <param-value>true</param-value>  
  31.     </init-param>  
  32.   </filter>  
  33.      
  34.   <filter-mapping>  
  35.     <filter-name>struts2</filter-name>  
  36.     <url-pattern>/*</url-pattern>  
  37.   </filter-mapping>  
  38.    <filter-mapping>  
  39.     <filter-name>openSessionInViewFilter</filter-name>  
  40.     <url-pattern>*.do,*.action</url-pattern>  
  41.   </filter-mapping>  
  42.      
  43.   <welcome-file-list>  
  44.     <welcome-file>index.jsp</welcome-file>  
  45.   </welcome-file-list>  
  46. </web-app>  

2. applicationContext.xml

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"   
  6.     xmlns:context="http://www.springframework.org/schema/context"  
  7.     xmlns:jee="http://www.springframework.org/schema/jee"  
  8.     xmlns:tx="http://www.springframework.org/schema/tx"  
  9.     xsi:schemaLocation="    
  10.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  11.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  12.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  13.         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd  
  14.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">    
  15.    
  16.     <!-- 加载数据库属性配置文件 -->  
  17.     <context:property-placeholder location="classpath:db.properties" />  
  18.    
  19.     <!-- 数据库连接池c3p0配置 -->  
  20.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  21.         destroy-method="close">  
  22.         <property name="jdbcUrl" value=http://www.mamicode.com/"${db.url}"></property>  
  23.         <property name="driverClass" value=http://www.mamicode.com/"${db.driverClassName}"></property>  
  24.         <property name="user" value=http://www.mamicode.com/"${db.username}"></property>  
  25.         <property name="password" value=http://www.mamicode.com/"${db.password}"></property>  
  26.         <property name="maxPoolSize" value=http://www.mamicode.com/"40"></property>  
  27.         <property name="minPoolSize" value=http://www.mamicode.com/"1"></property>  
  28.         <property name="initialPoolSize" value=http://www.mamicode.com/"1"></property>  
  29.         <property name="maxIdleTime" value=http://www.mamicode.com/"20"></property>  
  30.     </bean>  
  31.       
  32.     <!-- session工厂 -->  
  33.     <bean id="sessionFactory"  
  34.         class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  35.         <property name="dataSource">  
  36.             <ref bean="dataSource" />  
  37.         </property>  
  38.         <property name="configLocation" value=http://www.mamicode.com/"classpath:hibernate.cfg.xml"/>  
  39.         <!-- 自动扫描注解方式配置的hibernate类文件 -->  
  40.         <property name="packagesToScan">  
  41.             <list>  
  42.                 <value>com.bufoon.entity</value>  
  43.             </list>  
  44.         </property>  
  45.     </bean>  
  46.    
  47.     <!-- 配置事务管理器 -->  
  48.     <bean id="transactionManager"  
  49.         class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
  50.         <property name="sessionFactory" ref="sessionFactory" />  
  51.     </bean>  
  52.    
  53.     <!-- 配置事务通知属性 -->  
  54.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  55.         <!-- 定义事务传播属性 -->  
  56.         <tx:attributes>  
  57.             <tx:method name="insert*" propagation="REQUIRED" />  
  58.             <tx:method name="update*" propagation="REQUIRED" />  
  59.             <tx:method name="edit*" propagation="REQUIRED" />  
  60.             <tx:method name="save*" propagation="REQUIRED" />  
  61.             <tx:method name="add*" propagation="REQUIRED" />  
  62.             <tx:method name="new*" propagation="REQUIRED" />  
  63.             <tx:method name="set*" propagation="REQUIRED" />  
  64.             <tx:method name="remove*" propagation="REQUIRED" />  
  65.             <tx:method name="delete*" propagation="REQUIRED" />  
  66.             <tx:method name="change*" propagation="REQUIRED" />  
  67.             <tx:method name="get*" propagation="REQUIRED" read-only="true" />  
  68.             <tx:method name="find*" propagation="REQUIRED" read-only="true" />  
  69.             <tx:method name="load*" propagation="REQUIRED" read-only="true" />  
  70.             <tx:method name="*" propagation="REQUIRED" read-only="true" />  
  71.         </tx:attributes>  
  72.     </tx:advice>  
  73.       
  74.     <!-- 应用普通类获取bean    
  75.     <bean id="appContext" class="com.soanl.util.tool.ApplicationUtil"/>-->  
  76.    
  77.     <!-- 配置事务切面 -->  
  78.     <aop:config>  
  79.         <aop:pointcut id="serviceOperation"  
  80.             expression="execution(* com.bufoon.service..*.*(..))" />  
  81.         <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />  
  82.     </aop:config>  
  83.    
  84.     <!-- 自动加载构建bean -->  
  85.     <context:component-scan base-package="com.bufoon" />  
  86.    
  87. </beans>  



3. db.properties

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. db.driverClassName=com.mysql.jdbc.Driver  
  2. db.url=jdbc:mysql://localhost:3306/test  
  3. db.username=root  
  4. db.password=root  

4. hibernate.cfg.xml

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <!--?xml version=‘1.0‘ encoding=‘UTF-8‘?-->  
  2.    
  3.    
  4. <hibernate-configuration>  
  5.     <session-factory>  
  6.    
  7.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  8.         <property name="jdbc.batch_size">20</property>  
  9.         <property name="connection.autocommit">true</property>  
  10.    
  11.         <!-- 显示sql语句 -->  
  12.         <property name="show_sql">true</property>  
  13.         <property name="connection.useUnicode">true</property>  
  14.         <property name="connection.characterEncoding">UTF-8</property>  
  15.    
  16.         <!-- 缓存设置 -->  
  17.         <property name="cache.provider_configuration_file_resource_path">/ehcache.xml</property>  
  18.         <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  
  19.         <property name="cache.use_query_cache">true</property>  
  20.    
  21.     </session-factory>  
  22. </hibernate-configuration>  

5. struts.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
  5. <struts>  
  6.     <!-- 配置为开发模式 -->  
  7.     <constant name="struts.devMode" value="false" />  
  8.     <!-- 配置扩展名为action -->  
  9.     <constant name="struts.action.extension" value="action" />  
  10.     <!-- 配置主题 -->  
  11.     <constant name="struts.ui.theme" value="simple" />  
  12.     <!-- 配置上传文件大小此处默认为20M -->  
  13.     <constant name="struts.multipart.maxSize" value="2097152" />  
  14.       
  15.     <!-- 国际化编码 -->     
  16.     <constant name="struts.i18n.encoding" value="UTF-8" />     
  17.     <!-- 定位视图资源的根路径。默认值为/WEB-INF/content -->     
  18.     <constant value="/WEB-INF/templates" name="struts.convention.result.path" />     
  19.     <!-- 指定convention扫描以xxx结尾的包 -->     
  20.     <constant value="action" name="struts.convention.package.locators" />     
  21.     <!-- 是否将Action类转换成小写 -->     
  22.     <constant value="false" name="struts.convention.package.lowercase" />        
  23.          
  24.     <!-- 是否将actionName分割,去掉action部分,以大写字母作为分割 -->  
  25.     <constant name="struts.convention.action.name.separator" value="_" />  
  26.     <!-- 浏览器是否缓存静态内容 ,开发阶段最好关闭-->  
  27.     <constant name="struts.serve.static.browserCache" value="false"/>  
  28.     <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->   
  29.     <constant name="struts.configuration.xml.reload" value="true"/>      
  30.     <!-- 配置使用Spring管理Action -->  
  31.     <constant name="struts.objectFactory" value="spring"/>  
  32.     <!-- 让struts2始终先考虑spring的自动装箱   -->  
  33.     <constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />  
  34.     <!-- 设置默认的父包  
  35.     <constant value="MAIN" name="struts.convention.default.parent.package" />  
  36.     <package name="MAIN" extends="struts-default" namespace="/">  
  37.     </package>  
  38.      -->  
  39.   
  40.       
  41.     <package name="default" namespace="/" extends="struts-default">  
  42.         <interceptors>  
  43.             <!--  声明一个拦截器   进行登录检查  -->  
  44.             <interceptor name="checkePrivilege" class="com.oa168.interceptor.CheckPrivilegeInterceptor"></interceptor>  
  45.               
  46.             <!--  重新定义defaultStack拦截器栈,需要先判断权限    -->   
  47.             <interceptor-stack name="defaultStack">  
  48.                 <interceptor-ref name="checkePrivilege" />  
  49.                 <interceptor-ref name="defaultStack" />  
  50.             </interceptor-stack>  
  51.         </interceptors>  
  52.            
  53.         <!-- 配置全局的Result -->  
  54.         <global-results>  
  55.             <result name="loginUI">/WEB-INF/jsp/userAction/loginUI.jsp</result>  
  56.             <result name="noPrivilegeError">/noPrivilegeError.jsp</result>  
  57.         </global-results>  
  58.           
  59.         <!-- 测试用的action,当与Spring整合后,class属性写的就是Spring中bean的名称   
  60.              不需要写com.oa168.test.TestAction形式  
  61.              所以整合就是在Action类中加入@Controller  @Scope("prototype")  
  62.              并在Web.xml中加入监听器  
  63.         <listener>  
  64.             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  65.         </listener>  
  66.         <context-param>  
  67.             <param-name>contextConfigLocation</param-name>  
  68.             <param-value>classpath:applicationContext*.xml</param-value>  
  69.         </context-param>  
  70.            -->  
  71.         <action name="test" class="testAction">  
  72.             <result name="success">/test.jsp</result>  
  73.         </action>   
  74.       
  75.         <!-- 首页 -->  
  76.         <action name="homeAction_*" class="homeAction" method="{1}">  
  77.             <result name="{1}">/WEB-INF/jsp/homeAction/{1}.jsp</result>  
  78.             <!--   
  79.             <result name="index">/WEB-INF/jsp/homeAction/Index.jsp</result>  
  80.             <result name="top">/WEB-INF/jsp/homeAction/Top.jsp</result>  
  81.             <result name="bottom">/WEB-INF/jsp/homeAction/Bottom.jsp</result>  
  82.             <result name="left">/WEB-INF/jsp/homeAction/Left.jsp</result>  
  83.             <result name="mainFrame">/WEB-INF/jsp/homeAction/MainFrame.jsp</result> -->  
  84.         </action>  
  85.            
  86.     </package>  
  87.   
  88. </struts>  


 

FreeMark的配置

 

为了在FreeMarker模板中使用标签库,可按如下步骤进行

1.将struts-tags.tld文件复制到WEB-INF目录下

   即将系统所需的标签库定义文件(*.tld文件)复制到web应用中。对于基于struts2框架的JAVA_Web应用,则需要将Struts2-core.jar包解压,取出其中的struts-tags.tld文件,并复制到web应用的WEB-INF目录下。同时所需的最少Jar包如下图

2.在web.xml文件中启动JspSupportServlet

  在web.xml文件中作如下配置,如下:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1.  <servlet>  
  2. <servlet-name>JspSupportServlet</servlet-name>  
  3. <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>  
  4.       <!--配置JspSupportServlet自启动-->  
  5. <load-on-startup>1</load-on-startup>  
  6. </servlet>  

此配置本人没配FreeMark一样可以,具体用处有待研究。

 

3. 在FreeMarker模板文件中使用“assign指令”导入标签库

 导入标签库的代码如下:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <#--定义web-inf/strust-tags.tld文件对应的标签库前缀为s-->  
  2.  <#assigns=JspTaglibs["/WEB-INF/struts-tags.tld"]/>  

说明:在上面导入的标签库定义文件中,指定了标签库前缀为s,而该前缀对应的标签库定义文件主放置在/WEB-INF/struts-tags.tld路径下、

4.完毕

经过上述步骤后,即可在应用的FreeMarker模板中使用Struts2标签。在FreeMarker模板中增加了标签库定义后,就可以在FreeMarker模板中使用Struts2标签了。在FreeMarker使用标签与在jsp中使用标签略有差别.

补充说明

   我们不能直接通过浏览器直接请求该页面,否则看到的不是我们想要的结果,而是该模板页面的源代码(因为WEB容器默认不会处理 FreeMarker模板页面)。

        正如前面使用FreeMarker模板作为视图组件时看到的,FreeMarker作为视图组件是由Servlet负责加载该模板,并使用数据模型填充该模板,并且填充后的标准HTML响应输出给浏览者。

   在Strtus2框架的支持下,Struts2框架充当了之前的Servlet角色,只要浏览者的请求经过了Struts2处理后,Struts2框架就会自动加载FreeMarker模板,并使用数据模型填充该模板,并且将最后的HTML页面输出给浏览者.。

   为了让所有的用户请求都经过Struts2框架处理,我们将所有的FreeMarker模板文件放在web-inf/ftl路径下.

   因为浏览者无法直接访问web-inf/ftl路径下的资源,所以我们在struts.xml配置文中增加了如下配置片段:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <action name="*">  
  2.           <result type="freemarker">/WEB-INF/ftl/{1}.ftl</result>  
  3.       </action>  

也就是把原来的Action中的result属性中type值改成“freemarker”

6. ehcache.xml (可以到下载的hibernate文件目录(hibernate-release-4.3.4.Final\hibernate-release-4.3.4.Final\project\etc)下找

五. JAVA类

1.BaseDAO.java(网上找的一个)

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.bufoon.dao;  
  2.    
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.    
  6. /** 
  7.  * 基础数据库操作类 
  8.  *  
  9.  * @author ss 
  10.  *  
  11.  */  
  12. public interface BaseDAO<T> {  
  13.    
  14.     /** 
  15.      * 保存一个对象 
  16.      *  
  17.      * @param o 
  18.      * @return 
  19.      */  
  20.     public Serializable save(T o);  
  21.    
  22.     /** 
  23.      * 删除一个对象 
  24.      *  
  25.      * @param o 
  26.      */  
  27.     public void delete(T o);  
  28.    
  29.     /** 
  30.      * 更新一个对象 
  31.      *  
  32.      * @param o 
  33.      */  
  34.     public void update(T o);  
  35.    
  36.     /** 
  37.      * 保存或更新对象 
  38.      *  
  39.      * @param o 
  40.      */  
  41.     public void saveOrUpdate(T o);  
  42.    
  43.     /** 
  44.      * 查询 
  45.      *  
  46.      * @param hql 
  47.      * @return 
  48.      */  
  49.     public List<T> find(String hql);  
  50.    
  51.     /** 
  52.      * 查询集合 
  53.      *  
  54.      * @param hql 
  55.      * @param param 
  56.      * @return 
  57.      */  
  58.     public List<T> find(String hql, Object[] param);  
  59.    
  60.     /** 
  61.      * 查询集合 
  62.      *  
  63.      * @param hql 
  64.      * @param param 
  65.      * @return 
  66.      */  
  67.     public List<T> find(String hql, List<Object> param);  
  68.    
  69.     /** 
  70.      * 查询集合(带分页) 
  71.      *  
  72.      * @param hql 
  73.      * @param param 
  74.      * @param page 
  75.      *            查询第几页 
  76.      * @param rows 
  77.      *            每页显示几条记录 
  78.      * @return 
  79.      */  
  80.     public List<T> find(String hql, Object[] param, Integer page, Integer rows);  
  81.    
  82.     /** 
  83.      * 查询集合(带分页) 
  84.      *  
  85.      * @param hql 
  86.      * @param param 
  87.      * @param page 
  88.      * @param rows 
  89.      * @return 
  90.      */  
  91.     public List<T> find(String hql, List<Object> param, Integer page, Integer rows);  
  92.    
  93.     /** 
  94.      * 获得一个对象 
  95.      *  
  96.      * @param c 
  97.      *            对象类型 
  98.      * @param id 
  99.      * @return Object 
  100.      */  
  101.     public T get(Class<T> c, Serializable id);  
  102.    
  103.     /** 
  104.      * 获得一个对象 
  105.      *  
  106.      * @param hql 
  107.      * @param param 
  108.      * @return Object 
  109.      */  
  110.     public T get(String hql, Object[] param);  
  111.    
  112.     /** 
  113.      * 获得一个对象 
  114.      *  
  115.      * @param hql 
  116.      * @param param 
  117.      * @return 
  118.      */  
  119.     public T get(String hql, List<Object> param);  
  120.    
  121.     /** 
  122.      * select count(*) from 类 
  123.      *  
  124.      * @param hql 
  125.      * @return 
  126.      */  
  127.     public Long count(String hql);  
  128.    
  129.     /** 
  130.      * select count(*) from 类 
  131.      *  
  132.      * @param hql 
  133.      * @param param 
  134.      * @return 
  135.      */  
  136.     public Long count(String hql, Object[] param);  
  137.    
  138.     /** 
  139.      * select count(*) from 类 
  140.      *  
  141.      * @param hql 
  142.      * @param param 
  143.      * @return 
  144.      */  
  145.     public Long count(String hql, List<Object> param);  
  146.    
  147.     /** 
  148.      * 执行HQL语句 
  149.      *  
  150.      * @param hql 
  151.      * @return 响应数目 
  152.      */  
  153.     public Integer executeHql(String hql);  
  154.    
  155.     /** 
  156.      * 执行HQL语句 
  157.      *  
  158.      * @param hql 
  159.      * @param param 
  160.      * @return 响应数目 
  161.      */  
  162.     public Integer executeHql(String hql, Object[] param);  
  163.    
  164.     /** 
  165.      * 执行HQL语句 
  166.      *  
  167.      * @param hql 
  168.      * @param param 
  169.      * @return 
  170.      */  
  171.     public Integer executeHql(String hql, List<Object> param);  
  172.    
  173. }  


2. BaseDAOImpl.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.bufoon.dao.impl;  
  2.    
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.    
  6. import org.hibernate.Query;  
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.springframework.beans.factory.annotation.Autowired;  
  10. import org.springframework.stereotype.Repository;  
  11.    
  12. import com.bufoon.dao.BaseDAO;  
  13.    
  14. @Repository("baseDAO")  
  15. @SuppressWarnings("all")  
  16. public class BaseDAOImpl<T> implements BaseDAO<T> {  
  17.    
  18.     private SessionFactory sessionFactory;  
  19.    
  20.     public SessionFactory getSessionFactory() {  
  21.         return sessionFactory;  
  22.     }  
  23.    
  24.     @Autowired  
  25.     public void setSessionFactory(SessionFactory sessionFactory) {  
  26.         this.sessionFactory = sessionFactory;  
  27.     }  
  28.    
  29.     private Session getCurrentSession() {  
  30.         return sessionFactory.getCurrentSession();  
  31.     }  
  32.    
  33.     public Serializable save(T o) {  
  34.         return this.getCurrentSession().save(o);  
  35.     }  
  36.    
  37.     public void delete(T o) {  
  38.         this.getCurrentSession().delete(o);  
  39.     }  
  40.    
  41.     public void update(T o) {  
  42.         this.getCurrentSession().update(o);  
  43.     }  
  44.    
  45.     public void saveOrUpdate(T o) {  
  46.         this.getCurrentSession().saveOrUpdate(o);  
  47.     }  
  48.    
  49.     public List<T> find(String hql) {  
  50.         return this.getCurrentSession().createQuery(hql).list();  
  51.     }  
  52.    
  53.     public List<T> find(String hql, Object[] param) {  
  54.         Query q = this.getCurrentSession().createQuery(hql);  
  55.         if (param != null && param.length > 0) {  
  56.             for (int i = 0; i < param.length; i++) {  
  57.                 q.setParameter(i, param[i]);  
  58.             }  
  59.         }  
  60.         return q.list();  
  61.     }  
  62.    
  63.     public List<T> find(String hql, List<Object> param) {  
  64.         Query q = this.getCurrentSession().createQuery(hql);  
  65.         if (param != null && param.size() > 0) {  
  66.             for (int i = 0; i < param.size(); i++) {  
  67.                 q.setParameter(i, param.get(i));  
  68.             }  
  69.         }  
  70.         return q.list();  
  71.     }  
  72.    
  73.     public List<T> find(String hql, Object[] param, Integer page, Integer rows) {  
  74.         if (page == null || page < 1) {  
  75.             page = 1;  
  76.         }  
  77.         if (rows == null || rows < 1) {  
  78.             rows = 10;  
  79.         }  
  80.         Query q = this.getCurrentSession().createQuery(hql);  
  81.         if (param != null && param.length > 0) {  
  82.             for (int i = 0; i < param.length; i++) {  
  83.                 q.setParameter(i, param[i]);  
  84.             }  
  85.         }  
  86.         return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();  
  87.     }  
  88.    
  89.     public List<T> find(String hql, List<Object> param, Integer page, Integer rows) {  
  90.         if (page == null || page < 1) {  
  91.             page = 1;  
  92.         }  
  93.         if (rows == null || rows < 1) {  
  94.             rows = 10;  
  95.         }  
  96.         Query q = this.getCurrentSession().createQuery(hql);  
  97.         if (param != null && param.size() > 0) {  
  98.             for (int i = 0; i < param.size(); i++) {  
  99.                 q.setParameter(i, param.get(i));  
  100.             }  
  101.         }  
  102.         return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();  
  103.     }  
  104.    
  105.     public T get(Class<T> c, Serializable id) {  
  106.         return (T) this.getCurrentSession().get(c, id);  
  107.     }  
  108.    
  109.     public T get(String hql, Object[] param) {  
  110.         List<T> l = this.find(hql, param);  
  111.         if (l != null && l.size() > 0) {  
  112.             return l.get(0);  
  113.         } else {  
  114.             return null;  
  115.         }  
  116.     }  
  117.    
  118.     public T get(String hql, List<Object> param) {  
  119.         List<T> l = this.find(hql, param);  
  120.         if (l != null && l.size() > 0) {  
  121.             return l.get(0);  
  122.         } else {  
  123.             return null;  
  124.         }  
  125.     }  
  126.    
  127.     public Long count(String hql) {  
  128.         return (Long) this.getCurrentSession().createQuery(hql).uniqueResult();  
  129.     }  
  130.    
  131.     public Long count(String hql, Object[] param) {  
  132.         Query q = this.getCurrentSession().createQuery(hql);  
  133.         if (param != null && param.length > 0) {  
  134.             for (int i = 0; i < param.length; i++) {  
  135.                 q.setParameter(i, param[i]);  
  136.             }  
  137.         }  
  138.         return (Long) q.uniqueResult();  
  139.     }  
  140.    
  141.     public Long count(String hql, List<Object> param) {  
  142.         Query q = this.getCurrentSession().createQuery(hql);  
  143.         if (param != null && param.size() > 0) {  
  144.             for (int i = 0; i < param.size(); i++) {  
  145.                 q.setParameter(i, param.get(i));  
  146.             }  
  147.         }  
  148.         return (Long) q.uniqueResult();  
  149.     }  
  150.    
  151.     public Integer executeHql(String hql) {  
  152.         return this.getCurrentSession().createQuery(hql).executeUpdate();  
  153.     }  
  154.    
  155.     public Integer executeHql(String hql, Object[] param) {  
  156.         Query q = this.getCurrentSession().createQuery(hql);  
  157.         if (param != null && param.length > 0) {  
  158.             for (int i = 0; i < param.length; i++) {  
  159.                 q.setParameter(i, param[i]);  
  160.             }  
  161.         }  
  162.         return q.executeUpdate();  
  163.     }  
  164.    
  165.     public Integer executeHql(String hql, List<Object> param) {  
  166.         Query q = this.getCurrentSession().createQuery(hql);  
  167.         if (param != null && param.size() > 0) {  
  168.             for (int i = 0; i < param.size(); i++) {  
  169.                 q.setParameter(i, param.get(i));  
  170.             }  
  171.         }  
  172.         return q.executeUpdate();  
  173.     }  
  174.    
  175. }  


3. UserService.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.bufoon.service.user;  
  2.    
  3. import java.util.List;  
  4.    
  5. import com.bufoon.entity.User;  
  6.    
  7. public interface UserService {  
  8.    
  9.     public void saveUser(User user);  
  10.       
  11.     public void updateUser(User user);  
  12.       
  13.     public User findUserById(int id);  
  14.       
  15.     public void deleteUser(User user);  
  16.       
  17.     public List<User> findAllList();  
  18.       
  19.     public User findUserByNameAndPassword(String username, String password);  
  20. }  


4. UserServiceImpl.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.bufoon.service.user.impl;  
  2.    
  3. import java.util.List;  
  4.    
  5. import javax.annotation.Resource;  
  6.    
  7. import org.springframework.stereotype.Service;  
  8.    
  9. import com.bufoon.dao.BaseDAO;  
  10. import com.bufoon.entity.User;  
  11. import com.bufoon.service.user.UserService;  
  12.    
  13. @Service("userService")  
  14. public class UserServiceImpl implements UserService {  
  15.       
  16.     @Resource  
  17.     private BaseDAO<User> baseDAO;  
  18.    
  19.     @Override  
  20.     public void saveUser(User user) {  
  21.         baseDAO.save(user);  
  22.     }  
  23.    
  24.     @Override  
  25.     public void updateUser(User user) {  
  26.         baseDAO.update(user);  
  27.     }  
  28.    
  29.     @Override  
  30.     public User findUserById(int id) {  
  31.         return baseDAO.get(User.class, id);  
  32.     }  
  33.    
  34.     @Override  
  35.     public void deleteUser(User user) {  
  36.         baseDAO.delete(user);  
  37.     }  
  38.    
  39.     @Override  
  40.     public List<User> findAllList() {  
  41.         return baseDAO.find(" from User u order by u.createTime");  
  42.     }  
  43.    
  44.     @Override  
  45.     public User findUserByNameAndPassword(String username, String password) {  
  46.         return baseDAO.get(" from User u where u.userName = ? and u.password = ? "new Object[] { username, password });  
  47.     }  
  48.    
  49. }  


5. LoginAction

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.bufoon.action;  
  2.    
  3. import javax.annotation.Resource;  
  4. import javax.servlet.http.HttpServletRequest;  
  5.    
  6. import org.apache.struts2.ServletActionContext;  
  7. import org.springframework.stereotype.Controller;  
  8.    
  9. import com.bufoon.entity.User;  
  10. import com.bufoon.service.user.UserService;  
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.    
  13. @Controller  
  14. public class LoginAction extends ActionSupport {  
  15.    
  16.     private static final long serialVersionUID = 1L;  
  17.    
  18.     @Resource  
  19.     private UserService userService;  
  20.       
  21.     private String username;  
  22.     private String password;  
  23.       
  24.     public String login(){  
  25.           
  26.         HttpServletRequest request = ServletActionContext.getRequest();  
  27.         User user = userService.findUserByNameAndPassword(username, password);  
  28.         if (user != null) {  
  29.             request.setAttribute("username", username);  
  30.             return SUCCESS;  
  31.         } else {  
  32.             return ERROR;  
  33.         }  
  34.               
  35.     }  
  36.     public String getUsername() {  
  37.         return username;  
  38.     }  
  39.     public void setUsername(String username) {  
  40.         this.username = username;  
  41.     }  
  42.     public String getPassword() {  
  43.         return password;  
  44.     }  
  45.     public void setPassword(String password) {  
  46.         this.password = password;  
  47.     }  
  48.       
  49. }  


6. Util.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.bufoon.util;  
  2.    
  3. import java.io.PrintWriter;  
  4. import java.io.StringWriter;  
  5. import java.security.MessageDigest;  
  6.    
  7. import org.springframework.context.ApplicationContext;  
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  9.    
  10. import com.bufoon.entity.User;  
  11. import com.bufoon.service.user.UserService;  
  12.    
  13. import sun.misc.BASE64Encoder;  
  14.    
  15. /** 
  16.  * 通用工具类 
  17.  */  
  18. public class Util {  
  19.    
  20.     /** 
  21.      * 对字符串进行MD5加密 
  22.      *  
  23.      * @param str 
  24.      * @return String 
  25.      */  
  26.     public static String md5Encryption(String str) {  
  27.         String newStr = null;  
  28.         try {  
  29.             MessageDigest md5 = MessageDigest.getInstance("MD5");  
  30.             BASE64Encoder base = new BASE64Encoder();  
  31.             newStr = base.encode(md5.digest(str.getBytes("UTF-8")));  
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         return newStr;  
  36.     }  
  37.        
  38.    
  39.     /** 
  40.      * 判断字符串是否为空 
  41.      *  
  42.      * @param str 
  43.      *            字符串 
  44.      * @return true:为空; false:非空 
  45.      */  
  46.     public static boolean isNull(String str) {  
  47.         if (str != null && !str.trim().equals("")) {  
  48.             return false;  
  49.         } else {  
  50.             return true;  
  51.         }  
  52.     }  
  53. }  

六. JSP文件

1. login.jsp

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.    
  7.    
  8. <html>  
  9.      
  10.     <base href=http://www.mamicode.com/"<%=basePath%>">  
  11.        
  12.     <title>My JSP ‘index.jsp‘ starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!--  
  19.     <link rel="stylesheet" type="text/css" href=http://www.mamicode.com/"styles.css">  
  20.     -->  
  21.      
  22.      
  23.      
  24.   <form action="${pageContext.request.contextPath}/user/login.action" method="post">  
  25.      username:<input type="text" name="username"> <br>  
  26.      password:<input type="password" name="password"> <br>  
  27.     <input type="submit" value=http://www.mamicode.com/"login"><input type="reset" value=http://www.mamicode.com/"reset">  
  28.   </form>  

2. success.jsp

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.    
  7.    
  8.    
  9.      
  10.     <base href=http://www.mamicode.com/"<%=basePath%>">  
  11.        
  12.     <title>My JSP ‘index.jsp‘ starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!--  
  19.     <link rel="stylesheet" type="text/css" href=http://www.mamicode.com/"styles.css">  
  20.     -->  
  21.      
  22.      
  23.      
  24.   <form action="${pageContext.request.contextPath}/user/login.action" method="post">  
  25.      username:<input type="text" name="username"> <br>  
  26.      password:<input type="password" name="password"> <br>  

  1.     <input type="submit" value=http://www.mamicode.com/"login"><input type="reset" value=http://www.mamicode.com/"reset">  
  2. </form>

Struts2.3.16.1+Hibernate4.3.4+Spring4.0.2 框架整合