zoukankan      html  css  js  c++  java
  • Spring3+Struts2+Hibernate4+Mybatis整合的一个maven例子

    说明:

    1.用了maven去搞这个demo,懒得去导jar包。。。

    2.这个demo用了spring去做Ioc,事务的aop;用了struts2去做“MVC”(没有用到任何UI技术,有点对不起这个MVC,就单单一个后台。。。);用了hibernate和Mybatis两个持久层,用上MyBatis是用来应对复杂的SQL查询逻辑,结果集映射也灵活。

    3.此demo目的只是一个笔记,搞java web 开发的都懂的,要学的太多,很多东西过段时间不接触就忘了,也用作一个测试环境。同时也是给自己的一个小礼物以自勉之,下周鄙人就要跳去搞外包了。。。只因实力不济啊,吾为索道不辞路远,希望未来有所长进。。。

    4.很遗憾,Junit test 用不了。。。

    demo的整合大致示意图:

    demo的目录结构:


     

    给出demo用到的依赖包,pom.xml:

    Xml代码  收藏代码
    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
    3.     <modelVersion>4.0.0</modelVersion>  
    4.     <groupId>org.oham.ssh</groupId>  
    5.     <artifactId>ssh</artifactId>  
    6.     <packaging>war</packaging>  
    7.     <version>0.0.1-SNAPSHOT</version>  
    8.     <name>ssh Maven Webapp</name>  
    9.     <url>http://maven.apache.org</url>  
    10.   
    11.   
    12.     <!-- 设置一些全局常量  -->  
    13.     <properties>  
    14.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    15.         <spring.version>3.1.0.RELEASE</spring.version>  
    16.         <struts2.version>2.3.15.1</struts2.version>  
    17.         <hibernate.version>4.1.4.Final</hibernate.version>  
    18.         <mybatis.version>3.1.1</mybatis.version>  
    19.     </properties>  
    20.   
    21.     <!-- 设置maven build的时候环境 -->  
    22.     <build>  
    23.         <plugins>  
    24.             <plugin>  
    25.                 <groupId>org.apache.maven.plugins</groupId>  
    26.                 <artifactId>maven-compiler-plugin</artifactId>  
    27.                 <version>2.3.2</version>  
    28.                 <configuration>  
    29.                     <source>1.6</source>  
    30.                     <target>1.6</target>  
    31.                 </configuration>  
    32.             </plugin>  
    33.         </plugins>  
    34.     </build>   
    35.   
    36.     <!-- 项目用到的jar包依赖 -->  
    37.     <dependencies>  
    38.   
    39.         <!-- spring start -->  
    40.         <dependency>  
    41.             <groupId>org.springframework</groupId>  
    42.             <artifactId>spring-core</artifactId>  
    43.             <version>${spring.version}</version>  
    44.         </dependency>  
    45.           
    46.         <dependency>  
    47.             <groupId>org.springframework</groupId>  
    48.             <artifactId>spring-beans</artifactId>  
    49.             <version>${spring.version}</version>  
    50.         </dependency>  
    51.               
    52.          <dependency>    
    53.             <groupId>org.springframework</groupId>    
    54.             <artifactId>spring-context</artifactId>    
    55.             <version>${spring.version}</version>  
    56.         </dependency>    
    57.         
    58.         <dependency>    
    59.             <groupId>org.springframework</groupId>    
    60.             <artifactId>spring-web</artifactId>    
    61.             <version>${spring.version}</version>  
    62.         </dependency>      
    63.           
    64.         <dependency>    
    65.             <groupId>org.springframework</groupId>    
    66.             <artifactId>spring-orm</artifactId>    
    67.             <version>3.1.1.RELEASE</version>    
    68.         </dependency>    
    69.           
    70.         <dependency>  
    71.             <groupId>org.springframework</groupId>  
    72.             <artifactId>spring-tx</artifactId>  
    73.             <version>3.1.1.RELEASE</version>  
    74.         </dependency>  
    75.         <!-- spring end -->  
    76.           
    77.           
    78.         <!-- struts2 start -->  
    79.         <dependency>  
    80.             <groupId>org.apache.struts</groupId>  
    81.             <artifactId>struts2-core</artifactId>  
    82.             <version>${struts2.version}</version>  
    83.         </dependency>  
    84.   
    85.         <dependency>  
    86.             <groupId>org.apache.struts</groupId>  
    87.             <artifactId>struts2-spring-plugin</artifactId>  
    88.             <version>${struts2.version}</version>  
    89.         </dependency>  
    90.               
    91.          <!-- struts2中对于注解的支持 -->    
    92.         <dependency>    
    93.             <groupId>org.apache.struts</groupId>    
    94.             <artifactId>struts2-convention-plugin</artifactId>    
    95.             <version>${struts2.version}</version>    
    96.         </dependency>    
    97.           
    98.          <!-- 用于查看struts2中注册的action, 可不用 -->    
    99.         <dependency>  
    100.             <groupId>org.apache.struts</groupId>  
    101.             <artifactId>struts2-config-browser-plugin</artifactId>  
    102.             <version>${struts2.version}</version>  
    103.         </dependency>  
    104.           
    105.          <!-- 用于struts2的JSON支持, 可不用 -->    
    106.         <dependency>  
    107.             <groupId>org.apache.struts</groupId>  
    108.             <artifactId>struts2-json-plugin</artifactId>  
    109.             <version>${struts2.version}</version>  
    110.         </dependency>  
    111.         <!-- struts2 end -->  
    112.           
    113.         <!-- c3p0数据源  start -->  
    114.         <dependency>  
    115.             <groupId>com.mchange.c3p0</groupId>  
    116.             <artifactId>com.springsource.com.mchange.v2.c3p0</artifactId>  
    117.             <version>0.9.1.2</version>  
    118.         </dependency>  
    119.         <!-- c3p0数据源  end -->  
    120.           
    121.         <!-- MySQL 驱动 start -->  
    122.         <dependency>  
    123.             <groupId>mysql</groupId>  
    124.             <artifactId>mysql-connector-java</artifactId>  
    125.             <version>5.1.15</version>  
    126.         </dependency>  
    127.         <!-- MySQL 驱动 end -->  
    128.           
    129.         <!-- Hibernate start -->  
    130.         <dependency>  
    131.             <groupId>org.hibernate</groupId>  
    132.             <artifactId>hibernate-core</artifactId>  
    133.             <version>${hibernate.version}</version>  
    134.         </dependency>  
    135.           
    136.         <dependency>  
    137.             <groupId>org.hibernate</groupId>  
    138.             <artifactId>hibernate-ehcache</artifactId>  
    139.             <version>${hibernate.version}</version>  
    140.         </dependency>  
    141.           
    142.         <dependency>  
    143.             <groupId>org.slf4j</groupId>  
    144.             <artifactId>slf4j-log4j12</artifactId>  
    145.             <version>1.6.1</version>  
    146.         </dependency>  
    147.         <!-- Hibernate end -->  
    148.           
    149.         <!-- MyBatis start-->  
    150.         <dependency>  
    151.             <groupId>org.mybatis</groupId>  
    152.             <artifactId>mybatis</artifactId>  
    153.             <version>${mybatis.version}</version>  
    154.         </dependency>  
    155.   
    156.         <dependency>  
    157.             <groupId>org.mybatis</groupId>  
    158.             <artifactId>mybatis-spring</artifactId>  
    159.             <version>1.1.1</version>  
    160.         </dependency>  
    161.         <!-- End of MyBatis -->  
    162.           
    163.         <!-- Junit test start -->  
    164.         <dependency>  
    165.             <groupId>junit</groupId>  
    166.             <artifactId>junit</artifactId>  
    167.             <version>4.8.2</version>  
    168.             <scope>test</scope>  
    169.         </dependency>  
    170.         <!-- Junit test end -->  
    171.           
    172.         <!-- J2EE start -->  
    173.         <dependency>  
    174.             <groupId>org.apache.openejb</groupId>  
    175.             <artifactId>javaee-api</artifactId>  
    176.             <version>5.0-1</version>  
    177.             <scope>provided</scope>  
    178.         </dependency>  
    179.         <dependency>  
    180.             <groupId>javax.faces</groupId>  
    181.             <artifactId>jsf-api</artifactId>  
    182.             <version>1.2_04</version>  
    183.             <scope>provided</scope>  
    184.         </dependency>  
    185.         <dependency>  
    186.             <groupId>javax.servlet</groupId>  
    187.             <artifactId>jstl</artifactId>  
    188.             <version>1.2</version>  
    189.             <scope>provided</scope>  
    190.         </dependency>  
    191.         <dependency>  
    192.             <groupId>javax.servlet.jsp</groupId>  
    193.             <artifactId>jsp-api</artifactId>  
    194.             <version>2.1</version>  
    195.             <scope>provided</scope>  
    196.         </dependency>  
    197.         <!-- J2EE end -->  
    198.     </dependencies>  
    199.       
    200. </project>  

    demo是web项目,web.xml:

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    6.   
    7.     <!-- 设置spring的配置文件路径 -->  
    8.     <context-param>  
    9.         <param-name>contextConfigLocation</param-name>  
    10.         <param-value>classpath:spring/applicationContext.xml,classpath:spring/**/applicationContext*.xml</param-value>  
    11.     </context-param>  
    12.   
    13.   
    14.     <!-- 设置启用log4j -->  
    15.     <listener>  
    16.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
    17.     </listener>  
    18.       
    19.     <!-- 设置struts的filter,给了个param,读取指定的struts配置文件 -->  
    20.     <filter>  
    21.         <filter-name>struts2</filter-name>  
    22.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    23.         <init-param>  
    24.             <param-name>config</param-name>  
    25.             <param-value>platform-web.xml,struts-default.xml,struts-plugin.xml,struts/struts.xml</param-value>  
    26.         </init-param>  
    27.     </filter>  
    28.     <filter-mapping>  
    29.         <filter-name>struts2</filter-name>  
    30.         <url-pattern>*.action</url-pattern>  
    31.     </filter-mapping>  
    32.   
    33.     <!-- 设置spring的listener -->  
    34.     <listener>  
    35.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    36.     </listener>  
    37.   
    38. </web-app>  

    先看spring的配置,有两个,

    applicationContext.xml:

    Xml代码  收藏代码
    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" xmlns:context="http://www.springframework.org/schema/context"  
    4.     xmlns:util="http://www.springframework.org/schema/util"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    6.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    7.         http://www.springframework.org/schema/context   
    8.         http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    9.         http://www.springframework.org/schema/util  
    10.         http://www.springframework.org/schema/util/spring-util-3.0.xsd">  
    11.   
    12.     <!-- 读入配置文件 -->  
    13.     <context:property-placeholder location="classpath:config/*.properties" />  
    14.   
    15.     <!-- 设置配置文件引用变量 -->  
    16.     <util:properties id="dbProp" location="classpath:config/db.properties" />  
    17.   
    18.   
    19.     <!-- 启动 spring 的注解功能 -->  
    20.     <context:annotation-config />  
    21.       
    22.     <!-- register annotated class with @Service, @Repository as Spring beans -->  
    23.     <!-- 指定  spring 注解的扫描路径 -->  
    24.     <context:component-scan base-package="org.oham.learn.ssh.controllers;org.oham.learn.ssh.services" />  
    25.   
    26. </beans>  

     applicationContext-persistence.xml:

    Xml代码  收藏代码
    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:tx="http://www.springframework.org/schema/tx"  
    5.     xsi:schemaLocation="  
    6.         http://www.springframework.org/schema/beans   
    7.         http://www.springframework.org/schema/beans/spring-beans.xsd  
    8.         http://www.springframework.org/schema/tx   
    9.         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"  
    10. >  
    11.   
    12.     <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
    13.         destroy-method="close">  
    14.         <property name="driverClass" value="#{dbProp.driverClass_MySql}" />  
    15.         <property name="jdbcUrl" value="#{dbProp.jdbcUrl_MySql}" />  
    16.         <property name="user" value="#{dbProp.username_MySql}" />  
    17.         <property name="password" value="#{dbProp.password_MySql}" />  
    18.         <property name="initialPoolSize" value="#{dbProp.initialPoolSize_MySql}" />  
    19.         <property name="maxPoolSize" value="#{dbProp.maxPoolSize_MySql}" />  
    20.         <property name="minPoolSize" value="#{dbProp.minPoolSize_MySql}" />  
    21.         <property name="acquireIncrement" value="#{dbProp.acquireIncrement_MySql}" />  
    22.         <property name="autoCommitOnClose" value="#{dbProp.autoCommitOnClose_MySql}" />  
    23.     </bean>  
    24.       
    25.     <!-- Hibernate 的 session factory 配置 -->  
    26.     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
    27.         <property name="dataSource" ref="c3p0DataSource"/>  
    28.         <property name="hibernateProperties">  
    29.             <props>  
    30.                 <prop key="hibernate.dialect">#{dbProp.hibernate_dialect}</prop>  
    31.                 <prop key="hibernate.show_sql">#{dbProp.hibernate_showSql}</prop>  
    32.                 <prop key="hibernate.format_sql">#{dbProp.hibernate_formatSql}</prop>  
    33.                 <prop key="hibernate.use_sql_comments">#{dbProp.hibernate_useSqlComments}</prop>  
    34.                 <prop key="hibernate.hbm2ddl.auto">#{dbProp.hibernate_hbm2ddlAuto}</prop>  
    35.                   
    36.                 <!-- 配置hibernate的缓存机制的,但demo里没有具体的体现 -->  
    37.                 <prop key="hibernate.cache.provider_class">#{dbProp.hibernate_cacheProviderClass}</prop>  
    38.                 <prop key="hibernate.cache.use_query_cache">#{dbProp.hibernate_cacheUseQueryCache}</prop>  
    39.                 <prop key="hibernate.cache.use_second_level_cache">#{dbProp.hibernate_cacheUseSecondLevelCache}</prop>  
    40.             </props>  
    41.         </property>  
    42.           
    43.         <!-- demo用了hibernate的两种映射配置方式:xml与annotation -->  
    44.         <property name="packagesToScan" value="org.oham.learn.ssh.beans" />  
    45.         <property name="mappingResources">  
    46.             <list>  
    47.                 <value>org/oham/learn/ssh/beans/TPerson.hbm.xml</value>  
    48.             </list>  
    49.         </property>  
    50.     </bean>  
    51.   
    52.       
    53.     <!-- Mybatis 的 session factory 配置 -->  
    54.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
    55.         <property name="dataSource" ref="c3p0DataSource" />  
    56.         <property name="configLocation" value="classpath:mybatis/sqlmap-config.xml" />  
    57.     </bean>  
    58.   
    59.     <!-- 扫描  mapper 接口 -->  
    60.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
    61.         <property name="basePackage" value="org.oham.learn.ssh.sqlmapper" />  
    62.         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>  
    63.     </bean>  
    64.   
    65.     <!-- 这个是配置AOP形式的transaction管理,有兴趣的可以放开注释自己玩玩 -->  
    66.     <!--  
    67.      handle default transaction management for service - start   
    68.     <tx:advice id="transactionAdvice" transaction-manager="transactionManager">  
    69.         <tx:attributes>  
    70.             <tx:method name="update*" read-only="false" propagation="REQUIRED"/>  
    71.             <tx:method name="save*" read-only="false" propagation="REQUIRED"/>  
    72.             <tx:method name="insert*" read-only="false" propagation="REQUIRED"/>  
    73.             <tx:method name="delete*" read-only="false" propagation="REQUIRED"/>  
    74.             <tx:method name="handleLink*" read-only="false" propagation="REQUIRED"/>  
    75.             <tx:method name="*" read-only="true" propagation="NOT_SUPPORTED"/>  
    76.         </tx:attributes>  
    77.     </tx:advice>  
    78.       
    79.     <aop:config>  
    80.         <aop:pointcut id="txOperationForService"  
    81.             expression="execution(* com.hkt.engineering.iris.ws.service.impl..*.*(..))" />  
    82.         <aop:advisor advice-ref="transactionAdvice" pointcut-ref="txOperationForService" />  
    83.     </aop:config>  
    84.     -->  
    85.     <!-- handle default transaction management for service - end -->  
    86.       
    87.       
    88.         <!-- Transaction Manager -->  
    89.      <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
    90.         <!-- 用于Mybatis 的事务配置 -->    
    91.         <property name="dataSource" ref="c3p0DataSource"/>  
    92.             
    93.         <!-- 用于Hibernate 的事务配置 -->    
    94.         <property name="sessionFactory" ref="sessionFactory"/>    
    95.     </bean>    
    96.       
    97.     <!-- 注解形式的transaction管理 -->  
    98.     <!-- Transaction Manager Annotation set active-->  
    99.     <tx:annotation-driven transaction-manager="transactionManager"/>  
    100. </beans>  

    struts.xml:

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE struts PUBLIC    
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    
    4.     "http://struts.apache.org/dtds/struts-2.0.dtd">    
    5. <struts>    
    6.   
    7.     <!-- 开启使用开发模式,详细错误提示 -->    
    8.     <constant name="struts.devMode" value="true" />  
    9.       
    10.     <!-- 指定每次配置文件更改后,自动重新加载 -->    
    11.     <constant name="struts.configuration.xml.reload" value="true" />  
    12.         
    13.     <!-- 将对象交给spring管理 -->    
    14. <!--   <constant name="struts.objectFactory" value="spring" />-->  
    15.      
    16.     <!-- 指定资源编码类型 -->    
    17.     <constant name="struts.i18n.encoding" value="UTF-8" />  
    18.         
    19.     <!-- 指定struts-convention插件扫描的本demo里action所在的路径,若没有被扫描,注解了的action类是不会被注册为action的,此处我尝试使用  
    20.         struts的注解形式的action配置  
    21.      -->    
    22.     <constant name="struts.convention.action.packages" value="org.oham.learn.ssh.controllers" />  
    23.        
    24.      <!-- 配置注解action默认的result视图文件路径 -->  
    25. <!--    <constant name="struts.convention.result.path" value="/WEB-INF/jsp" />-->  
    26.   
    27.   
    28.   
    29.     <!-- 默认的package,此处只搞了个json的 -->  
    30.     <package name="ssh-default" namespace="/" extends="struts-default">  
    31.         <result-types>  
    32.             <result-type name="json" class="org.apache.struts2.json.JSONResult"/>  
    33.         </result-types>  
    34.         <interceptors>  
    35.             <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>  
    36.         </interceptors>  
    37.     </package>  
    38.       
    39.     <!-- 传统的以xml的形式注册了action,注意action的class,是spring bean的id -->  
    40.     <package name="testStruts" namespace="/struts" extends="ssh-default">    
    41.         <action name="testCall" method="testCall" class="testStrutsAction">    
    42.             <result name="success">/WEB-INF/jsp/Main.jsp</result>    
    43.             <result name="json" type="json"/>    
    44.         </action>    
    45.         <action name="testAnnotationCall" method="testAnnotationCall" class="testStrutsAction">    
    46.             <result name="success">/WEB-INF/jsp/Main.jsp</result>    
    47.         </action>    
    48.     </package>    
    49.   
    50.     
    51. </struts>     

    基本配置写完了,现在挑选一个action试试,TestStrutsAction.java:

    Java代码  收藏代码
    1. package org.oham.learn.ssh.controllers;  
    2.   
    3.   
    4. import java.util.HashMap;  
    5. import java.util.List;  
    6. import java.util.Map;  
    7.   
    8. import javax.annotation.Resource;  
    9.   
    10. import org.oham.learn.ssh.beans.TGroup;  
    11. import org.oham.learn.ssh.beans.TPerson;  
    12. import org.oham.learn.ssh.beans.TUser;  
    13. import org.oham.learn.ssh.services.TestHibernateService;  
    14. import org.oham.learn.ssh.sqlmapper.TUserMapper;  
    15. import org.springframework.context.annotation.Scope;  
    16. import org.springframework.stereotype.Service;  
    17.   
    18. import com.opensymphony.xwork2.ActionSupport;  
    19.   
    20.   
    21. /** 
    22.  * 此处的action由spring去负责实例化,默认是单例的, 
    23.  * 为迎合struts的action,现设置器scope为protoype 
    24.  */  
    25. @Service(value="testStrutsAction")  
    26. @Scope("prototype")  
    27. public class TestStrutsAction extends ActionSupport {  
    28.     private static final long serialVersionUID = 3362122496775495186L;  
    29.       
    30.     @Resource(name="TestHibernate")  
    31.     private TestHibernateService testHibernateService;  
    32.       
    33.     @Resource  
    34.     private TUserMapper tUserMapper;  
    35.       
    36.     private Map<String, Object> jsonMap;  
    37.       
    38.     /** 
    39.      * 该action为xml方式配置的,此处测试其方法的调用, 
    40.      * 用Hibernate执行了查询,此处的映射配置基于xml  
    41.      */  
    42.     public String testCall() {  
    43.         List<TPerson> list = testHibernateService.getTpersonList();  
    44.         for(TPerson p : list) {  
    45.             System.out.println(p.getName());  
    46.         }  
    47.           
    48.         return "success";  
    49.     }  
    50.       
    51.     /** 
    52.      * 用Hibernate执行了查询,此处的映射配置基于annotation  
    53.      */  
    54.     public String testAnnotationCall() {  
    55.         List<TGroup> list = testHibernateService.getTGroupList();  
    56.           
    57.         for(TGroup g : list) {  
    58.             System.out.println(g.getName());  
    59.         }  
    60.           
    61.         return "success";  
    62.     }  
    63.       
    64.       
    65.     /** 
    66.      * 测试json interceptor是否起作用 
    67.      */  
    68.     public String testJsonCall() {  
    69.         jsonMap = new HashMap<String, Object>();  
    70.         jsonMap.put("a", "aa");  
    71.         jsonMap.put("b", "b");  
    72.         return "json";  
    73.     }  
    74.       
    75.     /** 
    76.      * 测试MyBatis 整合 
    77.      */  
    78.     public String testMybatisCall() {  
    79.         TUser user = new TUser();  
    80.         user.setId(1);  
    81.         user.setName("oham");  
    82.         List<TUser> list = tUserMapper.selectTUserByExample(user);  
    83.         for(TUser t : list) {  
    84.             System.out.println(t.getName());  
    85.         }  
    86.         return SUCCESS;  
    87.     }  
    88.   
    89.     public Map<String, Object> getJsonMap() {  
    90.         return jsonMap;  
    91.     }  
    92. }  

    看其testCall方法, 用到一个注入的testHibernateService,进入看看,TestHibernateServiceImpl.java:

    Java代码  收藏代码
    1. package org.oham.learn.ssh.services.impl;  
    2.   
    3. import java.util.List;  
    4.   
    5. import javax.annotation.Resource;  
    6.   
    7. import org.hibernate.Criteria;  
    8. import org.hibernate.Session;  
    9. import org.hibernate.SessionFactory;  
    10. import org.oham.learn.ssh.beans.TGroup;  
    11. import org.oham.learn.ssh.beans.TPerson;  
    12. import org.oham.learn.ssh.services.TestHibernateService;  
    13. import org.springframework.stereotype.Service;  
    14. import org.springframework.transaction.annotation.Propagation;  
    15. import org.springframework.transaction.annotation.Transactional;  
    16.   
    17. @Service(value="TestHibernate")  
    18. public class TestHibernateServiceImpl implements TestHibernateService {  
    19.   
    20.     @Resource(name="sessionFactory")  
    21.     private SessionFactory factory;  
    22.       
    23.       
    24.     @Transactional(readOnly=true, propagation=Propagation.REQUIRED)  
    25.     public List<TPerson> getTpersonList() {  
    26.         Session session = factory.getCurrentSession();  
    27.         Criteria criteria = session.createCriteria(TPerson.class);  
    28.         List<TPerson> list = criteria.list();   
    29.         return list;  
    30.     }  
    31.       
    32.     @Transactional(readOnly=true, propagation=Propagation.REQUIRED)  
    33.     public List<TGroup> getTGroupList() {  
    34.         Session session = factory.getCurrentSession();  
    35.         Criteria criteria = session.createCriteria(TGroup.class);  
    36.         List<TGroup> list = criteria.list();  
    37.         return list;  
    38.     }  
    39.   
    40. }  

      factory.getCurrentSession();这句,若当前没有事务,抛session closed异常的,可以注释@Transactional试试,方法调用结束,随着事务关闭,session也关闭。可以自己写个方法测试,形如:

    Java代码  收藏代码
    1. @Transactional(readOnly=true, propagation=Propagation.REQUIRED)  
    2.     public Session testSession() {  
    3.         Session session = factory.getCurrentSession();  
    4.         return session;  
    5.     }  

     然后action里如此调用:

    Java代码  收藏代码
    1. Session session = testHibernateService.testSession();  
    2.         Criteria criteria = session.createCriteria(TPerson.class);  
    3.         List<TPerson> list = criteria.list();   

    给出hibernate的映射相关,

     TPerson.java:

    Java代码  收藏代码
    1. package org.oham.learn.ssh.beans;  
    2.   
    3. import java.io.Serializable;  
    4.   
    5.   
    6. public class TPerson implements Serializable{  
    7.     private static final long serialVersionUID = 4135349486988951197L;  
    8.       
    9.     private int id;  
    10.     private String name;  
    11.     private String address;  
    12.     private String tel;  
    13.     private String zipCode;  
    14.     public int getId() {  
    15.         return id;  
    16.     }  
    17.     public void setId(int id) {  
    18.         this.id = id;  
    19.     }  
    20.     public String getName() {  
    21.         return name;  
    22.     }  
    23.     public void setName(String name) {  
    24.         this.name = name;  
    25.     }  
    26.     public String getAddress() {  
    27.         return address;  
    28.     }  
    29.     public void setAddress(String address) {  
    30.         this.address = address;  
    31.     }  
    32.     public String getTel() {  
    33.         return tel;  
    34.     }  
    35.     public void setTel(String tel) {  
    36.         this.tel = tel;  
    37.     }  
    38.     public String getZipCode() {  
    39.         return zipCode;  
    40.     }  
    41.     public void setZipCode(String zipCode) {  
    42.         this.zipCode = zipCode;  
    43.     }  
    44. }  

     TPerson.hbm.xml:

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    
    3.  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    4.     
    5. <hibernate-mapping package="org.oham.learn.ssh.beans">  
    6.     <class name="TPerson" table="t_person">  
    7.         <id name="id" column="id" type="java.lang.Integer">  
    8.             <generator class="native"/>  
    9.         </id>  
    10.           
    11.         <property name="name" column="name" type="java.lang.String"/>  
    12.             <property name="address" column="address" type="java.lang.String"/>  
    13.             <property name="tel" column="tel" type="java.lang.String"/>  
    14.             <property name="zipCode" column="zipcode" type="java.lang.String"/>  
    15.     </class>  
    16.       
    17. </hibernate-mapping>  

    TGroup.java,这个是基于hibernate的注解来做映射的:

    Java代码  收藏代码
    1. package org.oham.learn.ssh.beans;  
    2.   
    3. import java.io.Serializable;  
    4.   
    5. import javax.persistence.Column;  
    6. import javax.persistence.Entity;  
    7. import javax.persistence.Id;  
    8. import javax.persistence.Table;  
    9.   
    10. @Entity  
    11. @Table(name="t_group")  
    12. public class TGroup implements Serializable {  
    13.     private static final long serialVersionUID = 2177231731375781687L;  
    14.   
    15.     @Id  
    16.     @Column(name="id")  
    17.     private int id;  
    18.       
    19.     @Column(name="name", nullable= true)  
    20.     private String name;  
    21.       
    22.     public int getId() {  
    23.         return id;  
    24.     }  
    25.     public void setId(int id) {  
    26.         this.id = id;  
    27.     }  
    28.     public String getName() {  
    29.         return name;  
    30.     }  
    31.     public void setName(String name) {  
    32.         this.name = name;  
    33.     }  
    34. }  

    然后试着调用:http://你的IP加端口/ssh/struts/testCall.action,看看可否。也可调用本action的其他方法,诸如:http://你的IP加端口/ssh/struts/testCall!testJsonCall.action,再看看。

    再给出基于struts注解形式注册的另一个action,TestStrutsAnnotationAction.java:

    Java代码  收藏代码
    1. package org.oham.learn.ssh.controllers;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.List;  
    5. import java.util.Map;  
    6.   
    7. import javax.annotation.Resource;  
    8.   
    9. import org.apache.struts2.convention.annotation.Action;  
    10. import org.apache.struts2.convention.annotation.Namespace;  
    11. import org.apache.struts2.convention.annotation.ParentPackage;  
    12. import org.apache.struts2.convention.annotation.Result;  
    13. import org.oham.learn.ssh.beans.TGroup;  
    14. import org.oham.learn.ssh.beans.TPerson;  
    15. import org.oham.learn.ssh.beans.TUser;  
    16. import org.oham.learn.ssh.services.TestHibernateService;  
    17. import org.oham.learn.ssh.sqlmapper.TUserMapper;  
    18. import org.springframework.context.annotation.Scope;  
    19. import org.springframework.stereotype.Component;  
    20.   
    21. import com.opensymphony.xwork2.ActionSupport;  
    22.   
    23. @ParentPackage("ssh-default")  
    24. @Namespace("/sa")  
    25. @Scope(value="prototype")  
    26. @Component("saAction")  
    27. public class TestStrutsAnnotationAction extends ActionSupport{  
    28.     private static final long serialVersionUID = -2793512785203051741L;  
    29.       
    30.     private Map<String, Object> jsonMap;  
    31.       
    32.     @Resource(name="TestHibernate")  
    33.     private TestHibernateService testHibernateService;  
    34.       
    35.     @Resource  
    36.     private TUserMapper tUserMapper;  
    37.       
    38.     @Action(value="testSACall",  
    39.             results={  
    40.                 @Result(name="success", location="/WEB-INF/jsp/Main.jsp")  
    41.     })  
    42.     public String testAnnotaionCall() {  
    43.         List<TPerson> list = testHibernateService.getTpersonList();  
    44.         for(TPerson p : list) {  
    45.             System.out.println(p.getName());  
    46.         }  
    47.           
    48.         List<TGroup> list2 = testHibernateService.getTGroupList();  
    49.         for(TGroup g : list2) {  
    50.             System.out.println(g.getName());  
    51.         }  
    52.         return "success";  
    53.     }  
    54.       
    55.       
    56.     @Action(value="testSAMyBatis",  
    57.             results={  
    58.                 @Result(name="success", location="/WEB-INF/jsp/Main.jsp")  
    59.     })  
    60.     public String testMyBatisCall() {  
    61.         List<TUser> list = tUserMapper.selectTUserByExample(null);  
    62.         for(TUser t : list) {  
    63.             System.out.println(t.getName());  
    64.         }  
    65.         return SUCCESS;  
    66.     }  
    67.       
    68.     @Action(value="testJ",  
    69.             results={@Result(name="json", type="json")})  
    70.     public String testJ() {  
    71.           
    72.         jsonMap = new HashMap<String, Object>();  
    73.         jsonMap.put("a", "aa");  
    74.         jsonMap.put("b", "b");  
    75.         return "json";  
    76.           
    77.     }  
    78.   
    79.     public Map<String, Object> getJsonMap() {  
    80.         return jsonMap;  
    81.     }  
    82. }  

     调用:诸如,http://你的IP加端口/ssh/sa/testSACall.action试试可否。

    本demo用到了struts2-config-browser-plugin这个插件,主要用来看看注册的action有哪些,因为鄙人为了搞基于注解的struts action搞半天没成,起初不知原因为何,后来struts.xml中加上:<constant name="struts.convention.action.packages" value="org.oham.learn.ssh.controllers" />就行了,但看别人的一些demo他们没加,所以至今也不太敢确定是否就是这个原因了。

    调用http://你的IP加端口/ssh/config-browser/actionNames.action就可以看到成功注册的action。

    完了,希望对诸君有所助。

    附上项目源码ssh.zip,解压——>导入Existing Maven Project。

    • ssh.zip (62.8 KB)
    • 下载次数: 176
  • 相关阅读:
    2011年03月28日
    如何响应UIScrollView的touchesBegan和touchesEnd消息
    使用Git在Mac和Windows系统之间进行同步数据
    ActionScript 3.0 编程 中文版PDF下载地址
    WIN7 英文 语言包(KB972813)/多国语言包下载(转)
    如何根据内容和字体调整UILabel的大小
    xcode 快捷键(转)
    VMware, Win7, Mac系统之间使用Git版本控制器的解决方案
    iOS 开发教程资源列表(转载)
    取消UITableViewCell高亮颜色
  • 原文地址:https://www.cnblogs.com/telwanggs/p/5403240.html
Copyright © 2011-2022 走看看