zoukankan      html  css  js  c++  java
  • Struts2.3+Spring3.2+Hibernate4.2框架搭建

    一、环境

    SSH使用的版本:struts2.3.14、spring3.2.2、hibernate4.2.0

    数据库:MYSQL

    tomcat版本:apache-tomcat-7.0.42

     

    二、所需要导入的jar包

    2.1 struts2的jar包

      同时,整合hibernate还需要一下jar包:

    2.2 spring3的jar包

    2.3 hibernate4的jar包

      导入/lib/required文件夹下的所有jar包

      配置连接池需要导入/lib/optional/c3p0文件夹中的所有jar包

      数据库使用的是MYSQL,因此还需要mysql的连接驱动:mysql-connector-java-5.1.22-bin.jar

    2.4 用于日志的jar包

    log4j-1.2.17.jar,slf4j-api-1.7.5.jar,slf4j-log4j12-1.7.5.jar

    2.5 AspectJ相关的jar包

    aopalliance-1.0.jar,aspectjrt.jar,aspectjweaver.jar

    三、web.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <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"
        id="WebApp_ID" version="2.5">
        <display-name>BillLogger</display-name>
        
        <!-- WebApp Root -->
        <context-param>
            <param-name>webAppRootKey</param-name>
            <param-value>webapp.root</param-value>
        </context-param>
        
        <!-- Struts2 Filter -->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>struts-default.xml,struts-plugin.xml,com/billLogger/resources/struts.xml</param-value>
            </init-param>
        </filter>
        <!-- Struts2 Filter Mapping -->
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <!-- Log4j ConfigurationFile Location -->
        <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>classpath:com/billLogger/resources/log4j.properties</param-value>
        </context-param>
    
        <!-- Spring Log4j Listener -->
        <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
    
        <!-- Spring Web Request Listener -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    </web-app>

      struts的配置文件struts.xml默认存放路径在/WEB-INF/classes目录下,即将struts.xml放在src的目录下。我这里把配置文件放在com.billLogger.resources包内,因此要在init-param标签设置config的值。

      需要注意的是若设置了<param-name>config</param-name>参数,则struts-default.xml和struts-plugin.xml原来struts2默认加载的文件也要手动指定,否则不会自动加载。

    四、配置struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <constant name="struts.devMode" value="true"></constant><!-- default set 
            to false for prod -->
    
        <package name="bills" namespace="/bills" extends="struts-default">
            <action name="*" class="com.billLogger.actions.bill.{1}">
                <result>/views/bills/{1}.jsp</result>
                <result name="redirect" type="redirect">${redirectUrl}</result>
            </action>
        </package>
    
        <package name="root-redirect" namespace="/" extends="struts-default">
            <action name="">
                <result type="redirect">bills/Listing.action</result>
            </action>
        </package>
    </struts>

    五、配置hibernate.cfg.xml

    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <!-- Database connection settings -->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/moneymanagement</property>
            <property name="connection.username">root</property>
            <property name="connection.password">tyc1234</property>
    
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    
            <!-- Enable c3p0 connection pooling,beacause hibernate pooling is not prod-ready. 
                Apparently connection.provider_class is needed in hibernate 3+ -->
            <!-- <property name="connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property> -->
            <property name="hibernate.c3p0.min_size">1</property>
            <property name="hibernate.c3p0.max_size">100</property>
            <property name="hibernate.c3p0.idle_test_period">30</property>
    
            <!-- Echo all ececuted SQLto stdout for debugging -->
            <property name="show_sql">true</property>
    
            <!-- 对象与数据库表格映像文件 -->
            <mapping resource="com/billLogger/mode/bill.hbm.xml" />
            <mapping resource="com/billLogger/mode/category.hbm.xml" />
        </session-factory>
    </hibernate-configuration>

      在配置c3p0连接池的时候,hibernate3一定要写上

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>这句话是用于指定hibernate的连接方式,如果没有的话,将不会指定c3p0为hibernate的连接池,c3p0的连接类直接在核心jar包中。在hibernate4中c3p0有专用jar包,这里不需要设置connection.provider_class。

    六、applicationContext.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-3.2.xsd
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
                http://www.springframework.org/schema/tx 
                http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
    
        <!-- SessionFactory -->
        <bean id="sessionFactory" scope="singleton" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"<!-- 和hibernate3导入的不同 --> 
        p:configLocation
    ="classpath:/com/billLogger/resources/hibernate.cfg.xml" /> <!-- TransactionManager --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"<!-- 和hibernate3导入的不同 -->
        p:sessionFactory-ref
    ="sessionFactory" /> <!-- Spring Advice --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true"></tx:method> <tx:method name="*"></tx:method> </tx:attributes> </tx:advice> <!-- Spring Aop Config --> <aop:config> <aop:pointcut id="pointcut" expression=" execution(* com.billLogger.services.*Impl.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <!-- Dao --> <bean id="billDao" class="com.billLogger.dao.BillDao"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!-- Service --> <bean id="billService" class="com.billLogger.services.BillService"> <property name="billDao"> <ref bean="billDao" /> </property> </bean> <!-- Action --> <bean id="billListAction" class="com.billLogger.actions.bill.Listing" scope="session"> <property name="billService"> <ref bean="billService" /> </property> </bean> </beans>

      这里想说下spring在对hibernate4的支持上和3是有区别的。在Hibernate4.0以上的版本,session已经自己封装了事务处理,所以在spring3.1以上的版本把HibernateTemplate去掉了。在hibernate4中获取session的时候,不需要再继承HibernateDaoSupport类,可以直接baseDao类中添加一个SessionFactory属性,再添上它的setter方法。我们使用的DAO层的实现层是要添加到applicationContext.xml中的(其实也就是spring的依赖注入)。

    七、java代码

    7.1 mode层

    package com.billLogger.mode;
    
    import java.sql.Date;
    
    public class Bill {
        Long id;
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        
        Float money;
        public Float getMoney() {
            return money;
        }
        public void setMoney(Float money) {
            this.money = money;
        }
        
        Date date;
        public Date getDate() {
            return date;
        }
        public void setDate(Date date) {
            this.date = date;
        }
        
        Integer account;
        public Integer getAccount() {
            return account;
        }
        public void setAccount(Integer account) {
            this.account = account;
        }
    }

    7.2 DAO层

    package com.billLogger.dao;
    
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    
    import com.billLogger.mode.Bill;
    
    /*
     *@author Jeniss 2013-10-14 下午4:09:26
     *@tag
     */
    public class BillDao{
        protected SessionFactory sessionFactory;
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
        
        public Session getSession() {
            return sessionFactory.getCurrentSession();
        }
        
        public List<Bill> getAllBills() {
            String hql = "from Bill";
            Query query = getSession().createQuery(hql);
            List<Bill> bills = query.list();
            return bills;
        }
    }

     7.3 service层

    package com.billLogger.services;
    
    import java.util.List;
    
    import com.billLogger.dao.BillDao;
    import com.billLogger.mode.Bill;
    
    /*
     *@author Jeniss 2013-10-14 下午4:13:32
     *@tag
     */
    public class BillService {
        private BillDao billDao;
        public void setBillDao(BillDao billDao) {
            this.billDao = billDao;
        }
        
        public List<Bill> getAllBills() {
            List<Bill> bills = billDao.getAllBills();
            return bills;
        }
    }

     7.4 action层

    package com.billLogger.actions.bill;
    
    import java.util.Map;
    
    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.interceptor.SessionAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /*
     *@author Jeniss  2013-10-8 下午5:23:37
     *@Tag
     */
    public class ActionBase extends ActionSupport implements RequestAware, SessionAware, ApplicationAware {
        private static final long serialVersionUID = 1L;
        
        protected Map<String, Object> request;  
        protected Map<String, Object> session;  
        protected Map<String, Object> application;  
        public Map<String, Object> getRequest() {
            return request;
        }
    
        public Map<String, Object> getSession() {
            return session;
        }
    
        public Map<String, Object> getApplication() {
            return application;
        }
    
        @Override
        public void setApplication(Map<String, Object> application) {
            this.application = application;
        }
    
        @Override
        public void setSession(Map<String, Object> session) {
            this.session = session;
        }
    
        @Override
        public void setRequest(Map<String, Object> request) {
            this.request = request;
        }
    }
    package com.billLogger.actions.bill;
    
    import java.util.List;
    
    import com.billLogger.mode.Bill;
    import com.billLogger.services.BillService;
    
    public class Listing extends ActionBase{
        private static final long serialVersionUID = 1L;
        
        private BillService billService;
        public void setBillService(BillService billService) {
            this.billService = billService;
        }
        
        List<Bill> bills;
        public List<Bill> getBills() {
            return bills;
        }
    
        public String execute() throws Exception{
            bills = billService.getAllBills();
            return SUCCESS;
        }
    }

      环境搭建成功。这次搭建环境花了两天的时间,在搭的过程中,主要是对打印的日志不太熟悉,造成了查错能力降低。通过搭建这个环境,对SSH各个层的作用认识更形象了。

      hibernate通过Session接口实现了对数据的操作(例如:对数据库的数据进行增删改查操作),其SessionFactory接口可以调用Session。

      spring主要特性是DI和AOP。在SSH中的作用是连接hibernate和spring。在applicationContext文件中定义sessionFactory,通过设置配置文件路径,实现对hibernate配置文件的注入和解析。定义sessionManager(事务声明),通过注入sessionFactory,得到hibernate session,实现hibernate的事务管理。把sessionFactory注入DAO层,在到daoImpl类中可以使用hibernate session。再通过依赖注入,实现service层和action。

      struts则是控制action和jsp页面的连接。

  • 相关阅读:
    初始化toolstrip
    XmlWriter.WriteString() problem__“.”(十六进制值 0x00)是无效的字符。
    C#使用Dotfuscator混淆代码的加密方法(转)
    新软件收钱老软件不能用的思路
    位标记
    编程的严谨性
    制作安装项目后无法保存图片
    学习泛型
    Sql Server 中一个非常强大的日期格式化函数
    淘宝api 桌面程序(cs,客户端)接入规则
  • 原文地址:https://www.cnblogs.com/jeniss/p/3364430.html
Copyright © 2011-2022 走看看