项目实战---国税协同办公平台---day01

本文档详细介绍了SSH框架(Struts2、Hibernate、Spring)的搭建及整合过程,包括新建数据库和web项目,配置hibernate、spring的jar包和配置文件,整合测试,资源文件分类以及日志工具的配置。通过一系列步骤,实现了框架的集成并成功运行测试,确保了各组件协同工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSH框架搭建及整合

1、 新建数据库及web项目

**1.1 创建数据库**
CREATE DATABASE itcastTax DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2、新建web项目

2.1 新建工作空间指定项目编码(或工作空间编码)为utf-8,再建 web project,

这里写图片描述

2.2 配置buildpath

这里写图片描述

2.3 引入tomcat 的包:

这里写图片描述

这里写图片描述

2.4 添加jstl jar包和mysql驱动包;

这里写图片描述

2.5 添加struts2的jar包和配置文件

添加jar包:

commons-fileupload-1.3.1.jar,commons-io-2.2.jar,commons-lang-2.4.jar ,commons-lang3-3.2.jar,freemarker-2.3.19.jar,ognl-3.0.6.jar,struts2-core-2.x.jar
,struts2-spring-plugin-2.x.jar,xwork-core-2.x.jar 到web-inf/lib目录下。

添加struts.xml到src目录下。可在“struts-2.x\apps\struts2-blank\WEB-INF\classes”下复制。

在struts.xml中添加几个常用属性:

<!-- 禁用动态方法访问 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <!-- 配置成开发模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- 配置拓展名为action -->
    <constant name="struts.action.extention" value="action" />
    <!-- 把主题配置成simple -->
    <constant name="struts.ui.theme" value="simple" />

配置web.xml:添加struts2 过滤器:

<filter>
        <filter-name>struts2</filter-name>    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

3、添加hibernate的jar包和配置文件

3.1 添加hibernate jar包:

hibernate3.jar,lib/required/*.jar,lib\jpa\hibernate-jpa-2.0-api-1.0.0.Final.jar,lib\bytecode\cglib\cglib-2.2.jar到web-inf/lib目录下。

4、添加spring的jar包和配置文件

4.1添加spring3.0.2中的jar包

这里写图片描述

添加spring配置文件applicationContext.xml 到src目录下;

  <!-- 引入外部sprign配置文件 -->
    <import resource="classpath:cn/itcast/*/conf/*-spring.xml"/>

在web.xml中注册spring监听器,启动spring容器:

<listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

5、整合测试项目

5.1 整合struts 和 spring

预期:如果可以在action中能够正确调用service里面的方法执行并返回到一个页面中;那么我们认定struts和spring的整合是成功的。

编写JUnit测试类,测试spring加载是否正确:

package cn.itcast.test;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.itcast.test.entity.Person;
import cn.itcast.test.service.TestService;

public class TestMerge {

    ClassPathXmlApplicationContext ctx;

    @Before
    public void loadCtx() {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }

    @Test
    public void testSpring() {
        TestService ts = (TestService)ctx.getBean("testService");
        ts.say();
    }

    @Test
    public void testHibernate() {
        SessionFactory sf = (SessionFactory)ctx.getBean("sessionFactory");

        Session session = sf.openSession();
        Transaction transaction = session.beginTransaction();
        //保存人员
        session.save(new Person("人员1"));
        transaction.commit();
        session.close();
    }

    @Test
    public void testServiceAndDao() {
        TestService ts = (TestService)ctx.getBean("testService");
        ts.save(new Person("人员2"));
        //System.out.println(ts.findPerson("4028eea54c8cdb1f014c8cdb20ab0000").getName());
    }

    @Test
    public void testTransationReadOnly() {//只读事务,如果在只读事务中出现更新操作则回滚
        TestService ts = (TestService)ctx.getBean("testService");
        System.out.println(ts.findPerson("4028eea54c8cdb1f014c8cdb20ab0000").getName());
    }

    @Test
    public void testTransationRollback() {//回滚事务,如果操作中出现有任务异常则回滚先前的操作
        TestService ts = (TestService)ctx.getBean("testService");
        ts.save(new Person("人员4"));
    }

}

编写 TestService 接口

package cn.itcast.test.service;

import java.io.Serializable;

import cn.itcast.test.entity.Person;

public interface TestService {

    //输出
    public void say();

    //保存人员
    public void save(Person person);

    //根据id查询人员
    public Person findPerson(Serializable id);
}

实现类 TestServiceImpl

package cn.itcast.test.service.impl;

import java.io.Serializable;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import cn.itcast.test.dao.TestDao;
import cn.itcast.test.entity.Person;
import cn.itcast.test.service.TestService;

@Service("testService")
public class TestServiceImpl implements TestService {

    @Resource
    TestDao testDao;

    @Override
    public void say() {
        System.out.println("service saying hi.");
    }

    @Override
    public void save(Person person) {
        testDao.save(person);
        int i = 1/0;
    }

    @Override
    public Person findPerson(Serializable id) {
        save(new Person("test"));
        return testDao.findPerson(id);
    }

}

在applicationContext.xml中添加bean扫描配置信息;这边使用导入配置文件的方式配置。①首先在cn.itcast.test.conf中建立test-spring.xml,里面内容:

<!-- 扫描service -->
    <context:component-scan base-package="cn.itcast.test.service.impl"></context:component-scan>

②将test-spring.xml导入到applicationContext.xml中如下:

<import resource="classpath:cn/itcast/*/conf/*-spring.xml" />

编写TestAction类

package cn.itcast.test.action;

import javax.annotation.Resource;

import cn.itcast.test.service.TestService;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {

    @Resource
    TestService testService;

    public String execute(){
        testService.say();
        return SUCCESS;
    }

}

在test的conf文件夹下新建test-struts.xml中配置TestAction :

<struts>
    <package name="test" namespace="/" extends="struts-default">
        <action name="test_*" class="cn.itcast.test.action.TestAction" method="{1}">
            <result name="success">/WEB-INF/jsp/test/test.jsp</result>
        </action>
    </package>
</struts>

将test-struts.xml导入到struts.xml文件中。

<include file="cn/itcast/test/conf/test-struts.xml"/>

在webRoot目录下新建test/test.jsp

在浏览器中输入:http://localhost:8080/itcastTax/test.action 查看后
台是否能输入service中的打印信息。

5.2 整合hibernate 和 spring

在applicationContext.xml中配置如下原本在hibernate.cfg.xml中需要配置的信息,在spring中配置后hibernate.cfg.xml 可删除。

1、 配置c3p0数据库连接源:

导入外部的properties配置文件

<!-- 导入外部的properties配置文件 -->
    <context:property-placeholder location="classpath:db.properties" />

配置c3p0数据源

<!-- 配置c3p0数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
        <property name="driverClass" value="${driverClass}"></property>
        <property name="user" value="${user}"></property>
        <property name="password" value="${password}"></property>
        <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize" value="${initialPoolSize}"></property>
        <!--连接池中保留的最小连接数。Default: 3 -->
        <property name="minPoolSize" value="3"></property>
        <!--连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement" value="3"></property>
        <!--最大空闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime" value="1800"></property>
    </bean>

db.properties数据库配置文件


jdbcUrl=jdbc:mysql://localhost:3306/itcastTax?useUnicode=true&characterEncoding=utf8
driverClass=com.mysql.jdbc.Driver
user=root
password=root
initialPoolSize=10
maxPoolSize=30

3、 配置sessionFactory,并将dataSource指向c3p0创建的dataSource:

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="javax.persistence.validation.mode">none</prop>
            </props>
        </property>
        <property name="mappingLocations">
            <list>
                <value>classpath:cn/itcast/nsfw/*/entity/*.hbm.xml</value>
                <value>classpath:cn/itcast/test/entity/*.hbm.xml</value>
            </list>
        </property>
    </bean>

编写实体类Person和对应的映射文件Person.hbm.xml:

这里写图片描述

用JUnit测试hibernate和spring的整合,在测试用例中启动spring容器的时候将扫描Person类根据其创建数据库表,并在测试时将向表插入一条数据。

测试hibernate,添加一个人员

    @Test
    public void testHibernate() {
        SessionFactory sf = (SessionFactory)ctx.getBean("sessionFactory");

        Session session = sf.openSession();
        Transaction transaction = session.beginTransaction();
        //保存人员
        session.save(new Person("人员1"));
        transaction.commit();
        session.close();
    }

测试框架分层的整合(service 与 dao)
TestDao 中新增方法 save ,在TestService中通过调用testDao来保存人员信息。

public class TestDaoImpl extends HibernateDaoSupport implements TestDao {

    @Override
    public void save(Person person) {
        getHibernateTemplate().save(person);
    }

    @Override
    public Person findPerson(Serializable id) {
        return getHibernateTemplate().get(Person.class, id);
    }

}
@Service("testService")
public class TestServiceImpl implements TestService {

    @Resource
    TestDao testDao;

    @Override
    public void say() {
        System.out.println("service saying hi.");
    }

    @Override
    public void save(Person person) {
        testDao.save(person);
        //int i = 1/0;
    }

5.3 配置spring事务管理


<!—事务管理-->
    <bean id="txManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
<!—事务通知-->
<tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true" />
            <tx:method name="get*" read-only="true" />
            <tx:method name="load*" read-only="true" />
            <tx:method name="list*" read-only="true" />
            <tx:method name="search*" read-only="true" />
            <tx:method name="*" rollback-for="Throwable" />
        </tx:attributes>
    </tx:advice>

<!—配置需要进行事务控制的类 -->
    <aop:config>
        <aop:pointcut id="serviceOperation" expression="bean(*Service)" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
    </aop:config>

【注意:上面的pointcut expression 表示拦截以Service结尾的bean,或者可写成
execution(* cn.itcast..service.impl..(..))】
完善 TestService接口和TestServiceImpl;利用service中的操作来验证上面配置的事务管理是否生效。

测试方法
这里写图片描述

dao中

这里写图片描述

Service中

这里写图片描述

6、资源文件分类(src放源代码,config放配置文件,test放测试代码)

1、 将配置文件归类到新建config文件夹;
2、 源代码目录按照功能模块进行划分:cn.itcast.子系统.功能模块.*
3、 Jsp放置到WEB-INF目录下;
4、 其它:

这里写图片描述

7、日志工具配置(debug info warn error fatal)

在控制台会报出日志log4j没有配置好配置文件的信息。

这里写图片描述

Slf4j 接口jar(slf4j-log4j12-1.6.1.jar)
log4j的jar包(com.springsource.org.apache.log4j-1.2.15),配置log4j.properties文件。

这里写图片描述

测试:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值