spring4+hibernate4+struts2整合

来源:互联网 发布:微信营销好还是淘宝好 编辑:程序博客网 时间:2024/05/06 14:13
  • 在pom文件中添加相关依赖(这里采取的是spring4.1.7和hibernate4.3.11),使用mysql数据库
 <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.11</version>      <scope>test</scope>    </dependency>    <!--servlet web相关依赖-->    <dependency>      <groupId>taglibs</groupId>      <artifactId>standard</artifactId>      <version>1.1.2</version>    </dependency>    <dependency>      <groupId>jstl</groupId>      <artifactId>jstl</artifactId>      <version>1.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-databind</artifactId>      <version>2.5.4</version>    </dependency>    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>javax.servlet-api</artifactId>      <version>3.1.0</version>    </dependency>    <!--Spring依赖-->    <!--spring核心-->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-core</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-beans</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <!--spring的DAO层依赖-->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-jdbc</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-tx</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <!--spring的WEB层依赖-->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-web</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-webmvc</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>    <!-- struts2 -->    <dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-core</artifactId>      <version>2.3.24.1</version>      <exclusions>        <exclusion>          <artifactId>javassist</artifactId>          <groupId>javassist</groupId>        </exclusion>      </exclusions>    </dependency>    <!-- struts2 spring 整合 -->    <dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-spring-plugin</artifactId>      <version>2.3.24.1</version>    </dependency>    <!-- test for struts2 -->    <dependency>      <groupId>org.apache.struts</groupId>      <artifactId>struts2-junit-plugin</artifactId>      <version>2.3.24.1</version>      <scope>test</scope>    </dependency>    <!-- Hibernate -->    <dependency>      <groupId>org.hibernate</groupId>      <artifactId>hibernate-entitymanager</artifactId>      <version>4.3.11.Final</version>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-orm</artifactId>      <version>4.1.7.RELEASE</version>    </dependency>  <!-- mysql -->    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>5.1.9</version>      <scope>runtime</scope>    </dependency>    <dependency>      <groupId>c3p0</groupId>      <artifactId>c3p0</artifactId>      <version>0.9.1.2</version>    </dependency>
  • 整合spring和hibernate先,配置文件如下
<?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"       xsi:schemaLocation="http://www.springframework.org/schema/beans                    http://www.springframework.org/schema/beans/spring-beans.xsd                    http://www.springframework.org/schema/context                    http://www.springframework.org/schema/context/spring-context.xsd">    <context:property-placeholder location="classpath:jdbc.properties"/>    <!-- 配置数据源 -->    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">        <property name="driverClass" value="${jdbc.driverClass}" />        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>        <property name="user" value="${jdbc.user}"/>        <property name="password" value="${jdbc.password}"/>    </bean>    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="false">        <property name="dataSource">            <ref bean="dataSource"/>        </property>        <property name="hibernateProperties">            <props>                <!-- 数据库方言 -->                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>                <!-- 设置自动创建|更新|验证数据库表结构 -->                <prop key="hbm2ddl.auto">update</prop>                <prop key="hibernate.show_sql">true</prop>                <prop key="hibernate.format_sql">true</prop>                <!--是否启用二级缓存 -->                <prop key="hibernate.cache.use_second_level_cache">false</prop>                <!-- 是否启用查询缓存 -->                <prop key="hibernate.cache.use_query_cache">false</prop>                <!-- 自动提交事务 -->                <prop key="hibernate.connection.autocommit">true</prop>            </props>        </property>        <!-- 自动扫描实体对象 -->        <property name="packagesToScan" value="com.zwq.entity" />    </bean>    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">        <property name="sessionFactory">            <ref bean="sessionFactory"/>        </property>    </bean>    <!-- 扫描有注解的包 -->    <context:component-scan base-package="com.zwq.dao" /></beans>

jdbc.property:

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf8jdbc.user=rootjdbc.password=123456
 @Autowired    private SessionFactory sessionFatory;    public List<Seckill> queryAll() {        String hql = "from Seckill";        Session session = null;        Query query = null;        try {           session =  sessionFatory.openSession();           query = session.createQuery(hql);            return query.list();        }finally {            if(session!=null){                session.close();            }        }    }    public Seckill queryById(long id) {       Session session = null;        try {            session = sessionFatory.openSession();            String hql = "from Seckill where seckillId="+id;            Query query = session.createQuery(hql);            List<Seckill> list = query.list();            if (list.size()>0){                return list.get(0);            }else {                return null;            }        }finally {            if(session!=null){                session.close();            }        }    }    public Seckill save(Seckill seckill) {        Session session = null;        try {            session = sessionFatory.openSession();            session.save(seckill);        }finally {            if(session!=null){                session.close();            }        }        return seckill;    }

这是两个查询语句和保存语句,这里有个坑,如果开启session的时候采用getCurrentSession() 方法会抛出一个 org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread异常,经查询发现是hibernate4不知此hibernate3的getCurrentSession() 方法,所以这里使用openSession()方法获取session。

更新删除代码如下

 @Autowired    private HibernateTemplate hibernateTemplate;    public void updateById(Seckill seckill) {            hibernateTemplate.update(seckill);    }    public void delete(Seckill seckill) {            hibernateTemplate.delete(seckill);    }

这里很奇怪,session方法也有update和delete方法,但是,如果和保存一样调用的话,没反应。好像是和事务的开启,提交有关。如果我手动在程序里面手动开启事务的话,是可以更新和删除操作的。
Transaction transaction = session.beginTransaction();
session.update(seckill);
transaction.commit();

  • 单元测试dao层
    在测试类上加上注解@RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(“classpath:spring/spring-dao.xml”)
    映入配置文件和开启Junit4
    @Resource
    private SeckillDao dao;
    @Test
    public void queryAll() throws Exception {
    List seckills = dao.queryAll();
    for (Seckill seckill:seckills){
    System.out.println(seckill);
    }
    }
    在seckill里面重写tostring方法就能打印出具体信息了。
    其他几个方法类似
    今天先到这里,下次再整合struts2

  • 整合struts2
    web.xml配置

<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>/*</url-pattern>    </filter-mapping>    <filter-mapping>        <filter-name>struts2</filter-name>        <url-pattern>*.action</url-pattern>    </filter-mapping>    <!--spring -->    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath:spring/spring-*.xml</param-value>    </context-param>

之前使用struts2的dispatcher时采用org.apache.struts2.dispatcher.FilterDispatcher时,提示已经过时,经查证发现struts2 版本大于2.1.3的话推荐使用StrutsPrepareAndExecuteFilter

  • struts.xml配
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC            "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"            "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts>    <!-- 指定国际化编码所使用的字符集  -->    <constant name="struts.i18n.encoding" value="UTF-8"/>    <!-- 所有Action定义都可以在package下 -->    <package name="com.zwq.weg" extends="struts-default">        <action name="seckill" class="com.zwq.web.SeckillAction">            <result name="error">/error.jsp</result>            <result name="success">/list.jsp</result>        </action>        <action name="seckillA" class="com.zwq.web.SeckillAction" method="queryById">            <result name="success">/seckillList.jsp</result>        </action>    </package></struts>

编写action

public class SeckillAction extends ActionSupport{    //懒得去xml配置bean了,这里直接通过注解注入    @Autowired    private SeckillService seckillService;    @Override    public String execute() throws Exception {        List<Seckill> seckills = seckillService.queryAll();        ActionContext.getContext().getSession().put("seckills",seckills);        return SUCCESS;    }    private Integer seckillId;    public SeckillService getSeckillService() {        return seckillService;    }    public void setSeckillService(SeckillService seckillService) {        this.seckillService = seckillService;    }    public Integer getSeckillId() {        return seckillId;    }    public void setSeckillId(Integer seckillId) {        this.seckillId = seckillId;    }    public String queryById(){        List<Seckill> seckills = null;        if(seckillId!=null){            seckills = new ArrayList<Seckill>();            Seckill seckill = seckillService.queryById(seckillId);            seckills.add(seckill);        }else{            seckills = seckillService.queryAll();        }        ActionContext.getContext().getSession().put("seckills",seckills);        return SUCCESS;    }}
  • 编写前台页面代码,这里采用bootstrap框架

ajaxList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><html><head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>秒杀展示</title>    <!-- Bootstrap -->    <link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->    <!--[if lt IE 9]>    <script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>    <script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>    <![endif]--></head><body><div class="container">    <div class="panel panel-default">        <div class="panel-body">            <form class="form-horizontal" role="form" id="seckillForm" action="/seckill" method="get">                <div class="form-group">                    <label for="seckillId" class="col-sm-2 control-label">秒杀ID</label>                    <div class="col-sm-10">                        <input type="text" class="form-control" id="seckillId">                    </div>                </div>                <div class="form-group">                    <div class="col-sm-offset-2 col-sm-10">                        <button type="button" class="btn btn-default" id="query-seckill">查询</button>                    </div>                </div>            </form>        </div>    </div>    <div id="page-list"></div></div></body><!-- jQuery (necessary for Bootstrap's JavaScript plugins) --><script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script><!-- 最新的 Bootstrap 核心 JavaScript 文件 --><script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script><script type="text/javascript">    $(document).ready(function () {        $('#page-list').load("/seckillA");        $('#query-seckill').click(function () {            var str ="/seckillA?1=1";            if($('#seckillId').val()!=null){                str = str+"&seckillId="+$('#seckillId').val();            }            $('#page-list').load(str);        });    });</script></html>

seckillList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!-- 显示查询结果 --><div class="panel panel-default">    <div class="panel-heading">结果列表</div>    <div class="panel-body">        <table class="table table-bordered">            <thead>            <tr>                <th>秒杀编号</th>                <th>秒杀项目</th>                <th>数量</th>                <th>开始时间</th>                <th>结束时间</th>                <th>创建时间</th>            </tr>            </thead>            <tbody>            <c:forEach var="seckill" items="${seckills}">                <tr>                    <td>${seckill.seckillId}</td>                    <td>${seckill.name}</td>                    <td>${seckill.number}</td>                    <td>${seckill.startTime}</td>                    <td>${seckill.endTime}</td>                    <td>${seckill.createTime}</td>                </tr>            </c:forEach>            </tbody>        </table>    </div></div>

这样一个简单的spring4+hibernate4+struts2的查询功能就写完了,其他功能后续完善。
页面效果图
这里写图片描述

输入条件1000后
这里写图片描述
这里没有采用bootstrap自带的查询方法,采取的是显示列表这个panel刷新的方式,算是一种偷懒的方式了。

1 0