SSH整合

Top

JAVA SSH DAY01

  1. 使用Spring整合Hibernate
  2. 使用Spring整合Struts2
  3. SSH整合

1 使用Spring整合Hibernate

1.1 问题

使用Spring整合Hibernate,并实现资费表的增、删、改、查。

1.2 方案

Spring整合Hibernate的步骤:

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:导包

创建WEB项目SpringHibernate,并导入数据库驱动包、Hibernate开发包以及Spring开发包,完成后项目中包结构如下图

图-1

步骤二:配置applicationContext.xml

引入Spring配置文件applicationContext.xml,放在src根路径下。在该文件中配置数据源、SessionFactory、开启组件扫描、声明式事务,代码如下


    
    
  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.         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.         xsi:schemaLocation="
  9.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  10.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  11.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  12.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  13.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
  14.     <!-- 配置数据源 -->
  15.     <bean id="ds"
  16.         class="com.mchange.v2.c3p0.ComboPooledDataSource"
  17.         destroy-method="close">
  18.         <!-- 配置连接参数 -->
  19.         <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
  20.         <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
  21.         <property name="user" value="lhh"/>
  22.         <property name="password" value="123456"/>
  23.         <!-- 配置连接池 -->
  24.         <property name="initialPoolSize" value="3"/>
  25.         <property name="maxPoolSize" value="10"/>
  26.         <property name="minPoolSize" value="1"/>
  27.         <property name="acquireIncrement" value="3"/>
  28.         <property name="maxIdleTime" value="60"/>
  29.     </bean>
  30.     
  31.     <!-- 配置SessionFactory -->
  32.     <bean id="sessionFactory"
  33.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  34.         <!-- 依赖数据源 -->
  35.         <property name="dataSource" ref="ds"/>
  36.         <!-- Hibernate框架相关配置 -->
  37.         <property name="hibernateProperties">
  38.             <props>
  39.                 <prop key="hibernate.dialect">
  40.                     org.hibernate.dialect.OracleDialect
  41.                 </prop>
  42.                 <prop key="hibernate.show_sql">true</prop>
  43.                 <prop key="hibernate.formate_sql">true</prop>
  44.             </props>
  45.         </property>
  46.     </bean>
  47.     
  48.     <!-- 开启注解扫描 -->
  49.     <context:component-scan base-package="com.tarena"/>
  50.     <!-- 声明式事务管理,采用AOP形式切入 -->
  51.     <bean id="txManager"
  52.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  53.         <property name="sessionFactory" ref="sessionFactory" />
  54.     </bean>
  55.     <tx:advice id="txAdvice" transaction-manager="txManager">
  56.         <tx:attributes>
  57.             <tx:method name="update*" propagation="REQUIRED" />
  58.             <tx:method name="delete*" propagation="REQUIRED" />
  59.             <tx:method name="add*" propagation="REQUIRED" />
  60.             <tx:method name="load*" read-only="true" />
  61.             <tx:method name="execute" propagation="REQUIRED" />
  62.         </tx:attributes>
  63.     </tx:advice>
  64.     <aop:config proxy-target-class="true">
  65.         <aop:advisor advice-ref="txAdvice"
  66.             pointcut="within(com.tarena.action.*)" />
  67.     </aop:config>
  68. </beans>

步骤三:创建实体类和映射关系文件

创建com.tarena.entity包,并在包下创建资费实体类和映射关系文件,这两个文件可以从NETCTOSS项目中复制过来。其中实体类Cost代码如下


    
    
  1. package com.tarena.entity;
  2. import java.sql.Date;
  3. /**
  4. * 资费实体类
  5. */
  6. public class Cost {
  7.     private Integer id;// 主键
  8.     private String name;// 资费名称
  9.     private Integer baseDuration;// 在线时长
  10.     private Double baseCost;// 基本费用
  11.     private Double unitCost;// 单位费用
  12.     private String status;// 状态
  13.     private String descr;// 资费说明
  14.     private Date createTime;// 创建日期
  15.     private Date startTime;// 启用日期
  16.     private String costType;// 资费类型
  17.     public Integer getId() {
  18.         return id;
  19.     }
  20.     public void setId(Integer id) {
  21.         this.id = id;
  22.     }
  23.     public String getName() {
  24.         return name;
  25.     }
  26.     public void setName(String name) {
  27.         this.name = name;
  28.     }
  29.     public Integer getBaseDuration() {
  30.         return baseDuration;
  31.     }
  32.     public void setBaseDuration(Integer baseDuration) {
  33.         this.baseDuration = baseDuration;
  34.     }
  35.     public Double getBaseCost() {
  36.         return baseCost;
  37.     }
  38.     public void setBaseCost(Double baseCost) {
  39.         this.baseCost = baseCost;
  40.     }
  41.     public Double getUnitCost() {
  42.         return unitCost;
  43.     }
  44.     public void setUnitCost(Double unitCost) {
  45.         this.unitCost = unitCost;
  46.     }
  47.     public String getStatus() {
  48.         return status;
  49.     }
  50.     public void setStatus(String status) {
  51.         this.status = status;
  52.     }
  53.     public String getDescr() {
  54.         return descr;
  55.     }
  56.     public void setDescr(String descr) {
  57.         this.descr = descr;
  58.     }
  59.     public Date getCreateTime() {
  60.         return createTime;
  61.     }
  62.     public Date getStartTime() {
  63.         return startTime;
  64.     }
  65.     public void setStartTime(Date startTime) {
  66.         this.startTime = startTime;
  67.     }
  68.     public void setCreateTime(Date createTime) {
  69.         this.createTime = createTime;
  70.     }
  71.     public String getCostType() {
  72.         return costType;
  73.     }
  74.     public void setCostType(String costType) {
  75.         this.costType = costType;
  76.     }
  77. }

映射关系文件Cost.hbm.xml代码如下


    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.tarena.entity.Cost" table="cost">
  7.         <id name="id" type="integer" column="id">
  8.             <!-- 用来指明主键的生成方式 -->
  9.             <generator class="sequence">
  10.                 <param name="sequence">cost_seq</param>
  11.             </generator>
  12.         </id>
  13.         
  14.         <property name="name"
  15.             type="string" column="name" />
  16.         <property name="baseDuration"
  17.             type="integer" column="base_duration" />
  18.         <property name="baseCost"
  19.             type="double" column="base_cost" />
  20.         <property name="unitCost"
  21.             type="double" column="unit_cost" />
  22.         <property name="status"
  23.             type="string" column="status" />
  24.         <property name="descr"
  25.             type="string" column="descr" />
  26.         <property name="createTime"
  27.             type="date" column="creatime" />
  28.         <property name="startTime"
  29.             type="date" column="startime" />
  30.         <property name="costType"
  31.             type="string" column="cost_type" />
  32.     </class>
  33. </hibernate-mapping>

在applicationContext.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.         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.         xsi:schemaLocation="
  9.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  10.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  11.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  12.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  13.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
  14.     <!-- 配置数据源 -->
  15.     <bean id="ds"
  16.         class="com.mchange.v2.c3p0.ComboPooledDataSource"
  17.         destroy-method="close">
  18.         <!-- 配置连接参数 -->
  19.         <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
  20.         <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
  21.         <property name="user" value="lhh"/>
  22.         <property name="password" value="123456"/>
  23.         <!-- 配置连接池 -->
  24.         <property name="initialPoolSize" value="3"/>
  25.         <property name="maxPoolSize" value="10"/>
  26.         <property name="minPoolSize" value="1"/>
  27.         <property name="acquireIncrement" value="3"/>
  28.         <property name="maxIdleTime" value="60"/>
  29.     </bean>
  30.     
  31.     <!-- 配置SessionFactory -->
  32.     <bean id="sessionFactory"
  33.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  34.         <!-- 依赖数据源 -->
  35.         <property name="dataSource" ref="ds"/>
  36.         <!-- Hibernate框架相关配置 -->
  37.         <property name="hibernateProperties">
  38.             <props>
  39.                 <prop key="hibernate.dialect">
  40.                     org.hibernate.dialect.OracleDialect
  41.                 </prop>
  42.                 <prop key="hibernate.show_sql">true</prop>
  43.                 <prop key="hibernate.formate_sql">true</prop>
  44.             </props>
  45.         </property>
  46.         <property name="mappingResources">
  47.             <list>
  48.                 <value>com/tarena/entity/Cost.hbm.xml</value>
  49.             </list>
  50.         </property>
  51.     </bean>
  52.     
  53.     <!-- 开启注解扫描 -->
  54.     <context:component-scan base-package="com.tarena"/>
  55.     <!-- 声明式事务管理,采用AOP形式切入 -->
  56.     <bean id="txManager"
  57.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  58.         <property name="sessionFactory" ref="sessionFactory" />
  59.     </bean>
  60.     <tx:advice id="txAdvice" transaction-manager="txManager">
  61.         <tx:attributes>
  62.             <tx:method name="update*" propagation="REQUIRED" />
  63.             <tx:method name="delete*" propagation="REQUIRED" />
  64.             <tx:method name="add*" propagation="REQUIRED" />
  65.             <tx:method name="load*" read-only="true" />
  66.             <tx:method name="execute" propagation="REQUIRED" />
  67.         </tx:attributes>
  68.     </tx:advice>
  69.     <aop:config proxy-target-class="true">
  70.         <aop:advisor advice-ref="txAdvice"
  71.             pointcut="within(com.tarena.action.*)" />
  72.     </aop:config>
  73. </beans>

步骤四:

创建包com.tarena.dao,并在包下创建资费DAO接口,声明增、删、改、查的方法,代码如下


    
    
  1. package com.tarena.dao;
  2. import java.util.List;
  3. import com.tarena.entity.Cost;
  4. public interface ICostDao {
  5.     List<Cost> findAll();
  6.     Cost findById(int id);
  7.     void save(Cost cost);
  8.     void update(Cost cost);
  9.     void delete(int id);
  10. }

创建DAO实现类CostDaoImpl,继承于HibernateDaoSupport,实现接口ICostDao。代码如下


    
    
  1. package com.tarena.dao;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.hibernate.SessionFactory;
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  6. import org.springframework.stereotype.Repository;
  7. import com.tarena.entity.Cost;
  8. @Repository
  9. public class CostDaoImpl
  10.     extends HibernateDaoSupport implements ICostDao {
  11.     
  12.     @Resource
  13.     public void setSF(SessionFactory sf) {
  14.         super.setSessionFactory(sf);
  15.     }
  16.     @Override
  17.     public List<Cost> findAll() {
  18.         String hql = "from Cost";
  19.         return getHibernateTemplate().find(hql);
  20.     }
  21.     @Override
  22.     public Cost findById(int id) {
  23.         return (Cost) getHibernateTemplate().get(Cost.class, id);
  24.     }
  25.     @Override
  26.     public void save(Cost cost) {
  27.         getHibernateTemplate().save(cost);
  28.     }
  29.     @Override
  30.     public void update(Cost cost) {
  31.         getHibernateTemplate().update(cost);
  32.     }
  33.     @Override
  34.     public void delete(int id) {
  35.         Cost c = new Cost();
  36.         c.setId(id);
  37.         getHibernateTemplate().delete(c);
  38.     }
  39. }

步骤五:测试

在com.tarena.dao包下,创建JUNIT测试类TestDao,分别写出资费的增、删、改

查测试方法,并执行这些方法进行测试。代码如下


    
    
  1. package com.tarena.dao;
  2. import java.util.List;
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. import com.tarena.entity.Cost;
  7. public class TestDao {
  8.     
  9.     private String conf = "applicationContext.xml";
  10.     @Test
  11.     public void test1() {
  12.         ApplicationContext ctx =
  13.             new ClassPathXmlApplicationContext(conf);
  14.         ICostDao dao = (ICostDao) ctx.getBean("costDaoImpl");
  15.         List<Cost> list = dao.findAll();
  16.         for(Cost c : list) {
  17.             System.out.println(
  18.                 c.getId() + " " + c.getName()
  19.             );
  20.         }
  21.     }
  22.     
  23.     @Test
  24.     public void test2() {
  25.         ApplicationContext ctx =
  26.             new ClassPathXmlApplicationContext(conf);
  27.         ICostDao dao = (ICostDao) ctx.getBean("costDaoImpl");
  28.         Cost c = dao.findById(1);
  29.         System.out.println(
  30.             c.getId() + " " + c.getName()
  31.         );
  32.     }
  33.     
  34.     @Test
  35.     public void test3() {
  36.         ApplicationContext ctx =
  37.             new ClassPathXmlApplicationContext(conf);
  38.         ICostDao dao = (ICostDao) ctx.getBean("costDaoImpl");
  39.         Cost c = new Cost();
  40.         c.setName("aaa");
  41.         c.setBaseDuration(20);
  42.         c.setBaseCost(2.0);
  43.         c.setUnitCost(0.2);
  44.         c.setCostType("1");
  45.         c.setStatus("0");
  46.         dao.save(c);
  47.     }
  48.     
  49.     @Test
  50.     public void test4() {
  51.         ApplicationContext ctx =
  52.             new ClassPathXmlApplicationContext(conf);
  53.         ICostDao dao = (ICostDao) ctx.getBean("costDaoImpl");
  54.         Cost c = dao.findById(351);
  55.         c.setName("bbb");
  56.         dao.update(c);
  57.     }
  58.     
  59.     @Test
  60.     public void test5() {
  61.         ApplicationContext ctx =
  62.             new ClassPathXmlApplicationContext(conf);
  63.         ICostDao dao = (ICostDao) ctx.getBean("costDaoImpl");
  64.         dao.delete(351);
  65.     }
  66. }

1.4 完整代码

本案例的完整代码如下所示:

applicationContext.xml完整代码如下

实体类Cost完整代码如下

映射关系文件Cost.hbm.xml完整代码如下

DAO接口ICostDao完整代码如下

DAO实现类CostDaoImpl完整代码如下

测试类TestDao完整代码如下

2 使用Spring整合Struts2

2.1 问题

使用Spring整合Struts2,并实现Struts2的HelloWorld案例。

2.2 方案

Spring整合Struts2步骤:

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:导包

创建WEB项目SpringStruts2,并导入Struts2开发包、Spring开发包以及Spring整合Struts2开发包,完成后项目中包结构如下图

图-2

步骤二:配置web.xml

在web.xml中配置一个listener,用于tomcat启动时自动加载Spring。再配置出Struts2的前端控制器,代码如下


    
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3.     xmlns="http://java.sun.com/xml/ns/javaee"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <display-name></display-name>    
  8. <welcome-file-list>
  9. <welcome-file>index.jsp</welcome-file>
  10. </welcome-file-list>
  11. <!-- 配置listener,在容器启动时自动加载Spring -->
  12. <listener>
  13.     <listener-class>
  14.         org.springframework.web.context.ContextLoaderListener
  15.     </listener-class>
  16. </listener>
  17. <context-param>
  18.     <param-name>contextConfigLocation</param-name>
  19.     <param-value>classpath:applicationContext.xml</param-value>
  20. </context-param>
  21. <!-- 配置Struts2前端控制器 -->
  22. <filter>
  23.     <filter-name>Struts2</filter-name>
  24.     <filter-class>
  25.         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  26.     </filter-class>
  27. </filter>
  28. <filter-mapping>
  29.     <filter-name>Struts2</filter-name>
  30.     <url-pattern>/*</url-pattern>
  31. </filter-mapping>
  32. </web-app>

步骤三:配置applicationContext.xml

引入Spring配置文件,放在src根路径下,在该文件下开启组件扫描,代码如下


    
    
  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.         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.         xsi:schemaLocation="
  9.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  10.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  11.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  12.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  13.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
  14.     <!-- 开启注解扫描 -->
  15.     <context:component-scan base-package="com.tarena"/>
  16. </beans>

步骤四:创建并声明DAO

创建包com.tarena.dao,并在包下创建一个类HelloDao,在这个类中写一个say方法,其返回值为字符串,返回一句话即可。另外要使用Spring注解声明这个DAO组件,将其纳入到Spring容器中,代码如下


    
    
  1. package com.tarena.dao;
  2. import org.springframework.stereotype.Repository;
  3. @Repository
  4. public class HelloDao {
  5.     public String say() {
  6.         return "Hello, Spring整合Struts2.";
  7.     }
  8. }

步骤五:创建并声明Action

创建包com.tarena.action,并在包下创建HelloAction,在这个Action的业务方法中,调用HelloDao返回一句话并通过输出属性输出给页面。需要使用Spring注解声明这个Action组件,将其纳入到Spring容器中,另外也需要通过注解将DAO注入进来。代码如下


    
    
  1. package com.tarena.action;
  2. import javax.annotation.Resource;
  3. import org.springframework.stereotype.Controller;
  4. import com.tarena.dao.HelloDao;
  5. @Controller
  6. public class HelloAction {
  7.     @Resource
  8.     private HelloDao dao;
  9.     private String msg;
  10.     public String execute() {
  11.         // 通过dao获取输出消息
  12.         msg = dao.say();
  13.         return "success";
  14.     }
  15.     public String getMsg() {
  16.         return msg;
  17.     }
  18.     public void setMsg(String msg) {
  19.         this.msg = msg;
  20.     }
  21. }

步骤六:配置Action

在struts.xml中配置Action。由于使用Spring管理Action,在action元素中通过class属性指定Action类型时,需要指定的是组件的ID。代码如下


    
    
  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.     <package name="demo"
  7.         namespace="/demo" extends="struts-default">
  8.         <!--
  9.             由于使用Spring来管理Action,因此需要通过Spring
  10.             容器来创建Action,因此class属性指定的是组件的ID。
  11.          -->
  12.         <action name="hello" class="helloAction">
  13.             <result name="success">
  14.                 /hello.jsp
  15.             </result>
  16.         </action>
  17.     </package>
  18. </struts>

步骤七:创建JSP

在WebRoot下创建hello.jsp,并在这个页面上输出HelloAction中的输出属性,代码如下


    
    
  1. <%@page pageEncoding="utf-8" isELIgnored="false"%>
  2. <%@taglib uri="/struts-tags" prefix="s"%>
  3. <html>
  4. <head>
  5. </head>
  6. <body>
  7.     <h1>
  8.         <s:property value="msg"/>
  9.     </h1>
  10.     
  11. </body>
  12. </html>

步骤八:测试

部署项目并启动tomcat,访问HelloAction,页面输出效果如下图

图-3

2.4 完整代码

本案例的完整代码如下所示:

web.xml完整代码如下

applicationContext.xml完整代码如下

HelloDao完整代码如下

HelloAction完整代码如下

struts.xml完整代码如下

hello.jsp完整代码如下

3 SSH整合

3.1 问题

使用Spring整合Hibernate及Struts2,实现资费查询功能。

3.2 方案

SSH整合步骤

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:导包

创建WEB项目NETCTOSS-SSH,并导入数据库驱动包、Struts2开发包、Hibernate开发包以及Spring开发包,完成后项目中包结构如下图

图-4

注意,Hibernate开发包中的freemarker.jar,与Struts2中的包重复,且版本较低,去掉。Spring开发包中的commons-logging.jar,与Hibernate中的包重复,且版本较低,去掉。

步骤二:使用Spring整合Hibernate

在src根路径下引入并配置applicationContext.xml,并在该文件中配置数据源、SessionFactory、开启组件扫描以及声明式事务,代码如下


    
    
  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.         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.         xsi:schemaLocation="
  9.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  10.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  11.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  12.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  13.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
  14.     <!-- 配置数据源 -->
  15.     <bean id="ds"
  16.         class="com.mchange.v2.c3p0.ComboPooledDataSource"
  17.         destroy-method="close">
  18.         <!-- 配置连接参数 -->
  19.         <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
  20.         <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
  21.         <property name="user" value="lhh"/>
  22.         <property name="password" value="123456"/>
  23.         <!-- 配置连接池 -->
  24.         <property name="initialPoolSize" value="3"/>
  25.         <property name="maxPoolSize" value="10"/>
  26.         <property name="minPoolSize" value="1"/>
  27.         <property name="acquireIncrement" value="3"/>
  28.         <property name="maxIdleTime" value="60"/>
  29.     </bean>
  30.     
  31.     <!-- 配置SessionFactory -->
  32.     <bean id="sessionFactory"
  33.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  34.         <!-- 依赖数据源 -->
  35.         <property name="dataSource" ref="ds"/>
  36.         <!-- Hibernate框架相关配置 -->
  37.         <property name="hibernateProperties">
  38.             <props>
  39.                 <prop key="hibernate.dialect">
  40.                     org.hibernate.dialect.OracleDialect
  41.                 </prop>
  42.                 <prop key="hibernate.show_sql">true</prop>
  43.                 <prop key="hibernate.formate_sql">true</prop>
  44.             </props>
  45.         </property>
  46.         <property name="mappingResources">
  47.             <list>
  48.                 <value>com/tarena/entity/Cost.hbm.xml</value>
  49.             </list>
  50.         </property>
  51.     </bean>
  52.     
  53.     <!-- 开启注解扫描 -->
  54.     <context:component-scan base-package="com.tarena"/>
  55.     <!-- 声明式事务管理,采用AOP形式切入 -->
  56.     <bean id="txManager"
  57.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  58.         <property name="sessionFactory" ref="sessionFactory" />
  59.     </bean>
  60.     <tx:advice id="txAdvice" transaction-manager="txManager">
  61.         <tx:attributes>
  62.             <tx:method name="update*" propagation="REQUIRED" />
  63.             <tx:method name="delete*" propagation="REQUIRED" />
  64.             <tx:method name="add*" propagation="REQUIRED" />
  65.             <tx:method name="load*" read-only="true" />
  66.             <tx:method name="execute" propagation="REQUIRED" />
  67.         </tx:attributes>
  68.     </tx:advice>
  69.     <aop:config proxy-target-class="true">
  70.         <aop:advisor advice-ref="txAdvice"
  71.             pointcut="within(com.tarena.action.*)" />
  72.     </aop:config>
  73. </beans>

在com.tarena.entity包下创建实体类Cost,代码如下


    
    
  1. package com.tarena.entity;
  2. import java.sql.Date;
  3. /**
  4. * 资费实体类
  5. */
  6. public class Cost {
  7.     private Integer id;// 主键
  8.     private String name;// 资费名称
  9.     private Integer baseDuration;// 在线时长
  10.     private Double baseCost;// 基本费用
  11.     private Double unitCost;// 单位费用
  12.     private String status;// 状态
  13.     private String descr;// 资费说明
  14.     private Date createTime;// 创建日期
  15.     private Date startTime;// 启用日期
  16.     private String costType;// 资费类型
  17.     public Integer getId() {
  18.         return id;
  19.     }
  20.     public void setId(Integer id) {
  21.         this.id = id;
  22.     }
  23.     public String getName() {
  24.         return name;
  25.     }
  26.     public void setName(String name) {
  27.         this.name = name;
  28.     }
  29.     public Integer getBaseDuration() {
  30.         return baseDuration;
  31.     }
  32.     public void setBaseDuration(Integer baseDuration) {
  33.         this.baseDuration = baseDuration;
  34.     }
  35.     public Double getBaseCost() {
  36.         return baseCost;
  37.     }
  38.     public void setBaseCost(Double baseCost) {
  39.         this.baseCost = baseCost;
  40.     }
  41.     public Double getUnitCost() {
  42.         return unitCost;
  43.     }
  44.     public void setUnitCost(Double unitCost) {
  45.         this.unitCost = unitCost;
  46.     }
  47.     public String getStatus() {
  48.         return status;
  49.     }
  50.     public void setStatus(String status) {
  51.         this.status = status;
  52.     }
  53.     public String getDescr() {
  54.         return descr;
  55.     }
  56.     public void setDescr(String descr) {
  57.         this.descr = descr;
  58.     }
  59.     public Date getCreateTime() {
  60.         return createTime;
  61.     }
  62.     public Date getStartTime() {
  63.         return startTime;
  64.     }
  65.     public void setStartTime(Date startTime) {
  66.         this.startTime = startTime;
  67.     }
  68.     public void setCreateTime(Date createTime) {
  69.         this.createTime = createTime;
  70.     }
  71.     public String getCostType() {
  72.         return costType;
  73.     }
  74.     public void setCostType(String costType) {
  75.         this.costType = costType;
  76.     }
  77. }

在com.tarena.entity包下创建映射关系文件Cost.hbm.xml,代码如下


    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6.     <class name="com.tarena.entity.Cost" table="cost">
  7.         <id name="id" type="integer" column="id">
  8.             <!-- 用来指明主键的生成方式 -->
  9.             <generator class="sequence">
  10.                 <param name="sequence">cost_seq</param>
  11.             </generator>
  12.         </id>
  13.         
  14.         <property name="name"
  15.             type="string" column="name" />
  16.         <property name="baseDuration"
  17.             type="integer" column="base_duration" />
  18.         <property name="baseCost"
  19.             type="double" column="base_cost" />
  20.         <property name="unitCost"
  21.             type="double" column="unit_cost" />
  22.         <property name="status"
  23.             type="string" column="status" />
  24.         <property name="descr"
  25.             type="string" column="descr" />
  26.         <property name="createTime"
  27.             type="date" column="creatime" />
  28.         <property name="startTime"
  29.             type="date" column="startime" />
  30.         <property name="costType"
  31.             type="string" column="cost_type" />
  32.     </class>
  33. </hibernate-mapping>

在com.tarena.dao包下创建DAO接口ICostDao,并在接口中声明查询全部资费数据的方法,代码如下


    
    
  1. package com.tarena.dao;
  2. import java.util.List;
  3. import com.tarena.entity.Cost;
  4. public interface ICostDao {
  5.     List<Cost> findAll();
  6. }

在com.tarena.dao包下创建DAO实现类CostDaoImpl,继承于HibernateDaoSupport,并实现接口ICostDao,代码如下


    
    
  1. package com.tarena.dao;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.hibernate.SessionFactory;
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  6. import org.springframework.stereotype.Repository;
  7. import com.tarena.entity.Cost;
  8. @Repository
  9. public class CostDaoImpl
  10.     extends HibernateDaoSupport implements ICostDao {
  11.     @Resource
  12.     public void setSF(SessionFactory sf) {
  13.         super.setSessionFactory(sf);
  14.     }
  15.     @Override
  16.     public List<Cost> findAll() {
  17.         String hql = "from Cost";
  18.         return getHibernateTemplate().find(hql);
  19.     }
  20. }

步骤三:使用Spring整合Struts2

配置web.xml,配置一个listener,使tomcat启动时自动加载Spring。另外再配置Struts2的前端控制器,代码如下


    
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  3. <display-name></display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.jsp</welcome-file>
  6. </welcome-file-list>
  7. <!-- 配置listener,使tomcat启动时自动加载Spring -->
  8. <listener>
  9. <listener-class>
  10.         org.springframework.web.context.ContextLoaderListener
  11.     </listener-class>
  12. </listener>
  13. <context-param>
  14. <param-name>contextConfigLocation</param-name>
  15. <param-value>classpath:applicationContext.xml</param-value>
  16. </context-param>
  17. <!-- 配置前端控制器 -->
  18. <filter>
  19. <filter-name>Struts2</filter-name>
  20. <filter-class>
  21.         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  22.     </filter-class>
  23. </filter>
  24. <filter-mapping>
  25. <filter-name>Struts2</filter-name>
  26. <url-pattern>/*</url-pattern>
  27. </filter-mapping>
  28. </web-app>

在com.tarena.action包下创建Action类FindCostAction,调用DAO实现对资费的查询,代码如下


    
    
  1. package com.tarena.action;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.springframework.stereotype.Controller;
  5. import com.tarena.dao.ICostDao;
  6. import com.tarena.entity.Cost;
  7. @Controller
  8. @Scope("prototype")
  9. public class FindCostAction {
  10.     @Resource
  11.     private ICostDao costDao;
  12.     private List<Cost> costs;
  13.     public String load() {
  14.         costs = costDao.findAll();
  15.         return "success";
  16.     }
  17.     public List<Cost> getCosts() {
  18.         return costs;
  19.     }
  20.     public void setCosts(List<Cost> costs) {
  21.         this.costs = costs;
  22.     }
  23. }

在src根路径下引入struts.xml并配置Action,代码如下


    
    
  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.     <package name="cost"
  8.         namespace="/cost" extends="json-default">
  9.         <action name="findCost"
  10.             class="findCostAction" method="load">
  11.             <result name="success">
  12.                 /WEB-INF/cost/find_cost.jsp
  13.             </result>
  14.         </action>
  15.     </package>
  16. </struts>

在WEB-INF/cost下创建页面find_cost.jsp,实现资费数据的显示,代码如下


    
    
  1. <%@page pageEncoding="utf-8" isELIgnored="false"%>
  2. <%@taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <title>达内-NetCTOSS</title>
  8. <link type="text/css" rel="stylesheet" media="all" href="../styles/global.css" />
  9. <link type="text/css" rel="stylesheet" media="all" href="../styles/global_color.css" />
  10. <script language="javascript" type="text/javascript">
  11. //排序按钮的点击事件
  12. function sort(btnObj) {
  13. if (btnObj.className == "sort_desc")
  14. btnObj.className = "sort_asc";
  15. else
  16. btnObj.className = "sort_desc";
  17. }
  18. //启用
  19. function startFee() {
  20. var r = window.confirm("确定要启用此资费吗?资费启用后将不能修改和删除。");
  21. document.getElementById("operate_result_info").style.display = "block";
  22. }
  23. //删除
  24. function deleteFee() {
  25. var r = window.confirm("确定要删除此资费吗?");
  26. document.getElementById("operate_result_info").style.display = "block"; }
  27. </script>
  28. </head>
  29. <body>
  30. <!--Logo区域开始-->
  31. <div id="header">
  32. <img src="../images/logo.png" alt="logo" class="left"/>
  33. <a href="#">[退出]</a>
  34. </div>
  35. <!--Logo区域结束-->
  36. <!--导航区域开始-->
  37. <div id="navi">
  38. <ul id="menu">
  39. <li><a href="../index.html" class="index_off"></a></li>
  40. <li><a href="../role/role_list.html" class="role_off"></a></li>
  41. <li><a href="../admin/admin_list.html" class="admin_off"></a></li>
  42. <li><a href="../fee/fee_list.html" class="fee_on"></a></li>
  43. <li><a href="../account/account_list.html" class="account_off"></a></li>
  44. <li><a href="../service/service_list.html" class="service_off"></a></li>
  45. <li><a href="../bill/bill_list.html" class="bill_off"></a></li>
  46. <li><a href="../report/report_list.html" class="report_off"></a></li>
  47. <li><a href="../user/user_info.html" class="information_off"></a></li>
  48. <li><a href="../user/user_modi_pwd.html" class="password_off"></a></li>
  49. </ul>
  50. </div>
  51. <!--导航区域结束-->
  52. <!--主要区域开始-->
  53. <div id="main">
  54. <form action="" method="">
  55. <!--排序-->
  56. <div class="search_add">
  57. <div>
  58. <!--<input type="button" value="月租" class="sort_asc" onclick="sort(this);" />-->
  59. <input type="button" value="基费" class="sort_asc" onclick="sort(this);" />
  60. <input type="button" value="时长" class="sort_asc" onclick="sort(this);" />
  61. </div>
  62. <input type="button" value="增加" class="btn_add" onclick="location.href='fee_add.html';" />
  63. </div>
  64. <!--启用操作的操作提示-->
  65. <div id="operate_result_info" class="operate_success">
  66. <img src="../images/close.png" onclick="this.parentNode.style.display='none';" />
  67. 删除成功!
  68. </div>
  69. <!--数据区域:用表格展示数据-->
  70. <div id="data">
  71. <table id="datalist">
  72. <tr>
  73. <th>资费ID</th>
  74. <th class="width100">资费名称</th>
  75. <th>基本时长</th>
  76. <th>基本费用</th>
  77. <th>单位费用</th>
  78. <th>创建时间</th>
  79. <th>开通时间</th>
  80. <th class="width50">状态</th>
  81. <th class="width200"></th>
  82. </tr>
  83. <!-- 使用Struts2标签遍历集合,使用OGNL表达式输出内容。 -->
  84. <s:iterator value="costs">
  85.      <tr>
  86.      <td><s:property value="id"/></td>
  87.      <td><a href="fee_detail.html"><s:property value="name"/></a></td>
  88.      <td><s:property value="baseDuration"/></td>
  89.      <td><s:property value="baseCost"/></td>
  90.      <td><s:property value="unitCost"/></td>
  91.      <td><s:property value="createTime"/></td>
  92.      <td><s:property value="startTime"/></td>
  93.      <td>
  94.          <s:if test="status==0">开通</s:if>
  95.          <s:else>暂停</s:else>
  96.      </td>
  97.      <td>
  98.      <input type="button" value="启用" class="btn_start" onclick="startFee();" />
  99.      <input type="button" value="修改" class="btn_modify" onclick="location.href='fee_modi.html';" />
  100.      <input type="button" value="删除" class="btn_delete" onclick="deleteFee();" />
  101.      </td>
  102.      </tr>
  103. </s:iterator>
  104. </table>
  105. <p>业务说明:<br />
  106. 1、创建资费时,状态为暂停,记载创建时间;<br />
  107. 2、暂停状态下,可修改,可删除;<br />
  108. 3、开通后,记载开通时间,且开通后不能修改、不能再停用、也不能删除;<br />
  109. 4、业务账号修改资费时,在下月底统一触发,修改其关联的资费ID(此触发动作由程序处理)
  110. </p>
  111. </div>
  112. <!--分页-->
  113. <div id="pages">
  114.      <a href="#">上一页</a>
  115. <a href="#" class="current_page">1</a>
  116. <a href="#">2</a>
  117. <a href="#">3</a>
  118. <a href="#">4</a>
  119. <a href="#">5</a>
  120. <a href="#">下一页</a>
  121. </div>
  122. </form>
  123. </div>
  124. <!--主要区域结束-->
  125. <div id="footer">
  126. <p>[源自北美的技术,最优秀的师资,最真实的企业环境,最适用的实战项目]</p>
  127. <p>版权所有(C)加拿大达内IT培训集团公司 </p>
  128. </div>
  129. </body>
  130. </html>

步骤四:测试

部署项目并启动tomcat,访问资费列表,效果如下图

图-5

3.4 完整代码

本案例的完整代码如下所示:

applicationContext.xml完整代码如下

Cost完整代码如下

Cost.hbm.xml完整代码如下

ICostDao完整代码如下

CostDaoImpl完整代码如下

web.xml完整代码如下

FindCostAction完整代码如下

struts.xml完整代码如下

find_cost.jsp完整代码如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值