- 在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.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/seckill?useUnicode=true&characterEncoding=utf8
jdbc.user=root
jdbc.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刷新的方式,算是一种偷懒的方式了。