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页面的连接。

原文地址:https://www.cnblogs.com/jeniss/p/3364430.html