Spring4.0+Hibernate4.0+Struts2.3整合包括增删改查案例,解决整合中出现的异常
源码下载:http://download.csdn.net/detail/cmcc_1234/7034775
======================Application.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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 自动扫描所有注解该路径 -->
<context:component-scan base-package="com.s4s2h4.*" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://192.168.1.157;instanceName=eqmis;DatabaseName=db_easyui">
</property>
<property name="username" value="sa"></property>
<property name="password" value="1.0"></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<!--Spring 3.x 对 Hibernate 4.x 不提供 HibernateDaoSupport,所以在dao的实现层注入SessionFactory -->
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
<!--注意:Spring3.x不能为thread,否则报错:org.hibernate.HibernateException: save is not valid without active transaction ,
以上配置在 增加、删除、修改 操作时,都能正确执行,事务也正常执行!
当执行 查询 操作时,不需要事务的支持,问题来了,报错:org.hibernate.HibernateException: No Session found for current thread
意思是必须在transcation.isActive()条件下才能执行,
可以解决办法是:当方法不需要事务支持的时候,使用 Session session = sessionFactory.openSession()来获得Session对象,问题解决!
-->
<!-- <prop key="hibernate.current_session_context_class">thread</prop> -->
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/s4s2h4/services/entity/Down.hbm.xml</value>
<value>com/s4s2h4/services/entity/Menu.hbm.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 事物通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="sav*" propagation="REQUIRED" rollback-for="Exception"/> <!-- rollback-for回滚事物,果存在一个事务,则支持当前事务。如果没有事务则开启 -->
<tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="upd*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="qry*" propagation="NOT_SUPPORTED" read-only="true"/>
<tx:method name="*" propagation="NOT_SUPPORTED" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 事物切入 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="cut"
expression="execution(* com.s4s2h4.services.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="cut" />
</aop:config>
</beans>
======================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" version="2.5">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index</welcome-file>
</welcome-file-list>
<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>
<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>
</web-app>
============================dao=============================
package com.s4s2h4.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.s4s2h4.dao.BaseDao;
@Repository("BaseDao")
public class BaseDaoImpl<T> implements BaseDao<T> {
// Spring 3.x 对 Hibernate 4.x 不提供
// HibernateDaoSupport,所以在dao的实现层注入SessionFactory
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();// 增删改使用的session
}
public Session qryCurrentSesion() {
return sessionFactory.openSession();// 查询使用的session
}
@SuppressWarnings("unchecked")
public List<T> qryInfo(String hql) {
return this.qryCurrentSesion().createQuery(hql).list();
}
@SuppressWarnings("unchecked")
public List<T> qryInfo(String hql, Object[] param) {
Query qry = this.qryCurrentSesion().createQuery(hql);
setQueryParams(qry, param);
return qry.list();
}
public void Delete(T cls) {
// 把脱管实例的状态复制到新实例,否则有时异常:illegally attempted to associate a proxy with
// two open Sessions
Object obj = this.getCurrentSession().merge(cls);
this.getCurrentSession().delete(obj);
}
public void upd(T cls) {
this.getCurrentSession().update(cls);
}
public void add(T cls) {
this.getCurrentSession().saveOrUpdate(cls);
}
public void setQueryParams(Query qry, Object[] params) {
if (params != null) {
for (int i = 0; i < params.length; i++) {
qry.setParameter(i, params[i]);
}
}
}
}
===========================Services===========================
package com.s4s2h4.services.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.s4s2h4.dao.BaseDao;
import com.s4s2h4.services.TestServices;
import com.s4s2h4.services.entity.Down;
@Service("TestServices")
public class TestServicesImpl implements TestServices {
@SuppressWarnings("rawtypes")
@Autowired
private BaseDao baseDao;
@SuppressWarnings("unchecked")
public List<Down> qryKcsp() {
return baseDao.qryInfo("from Down");
}
@SuppressWarnings("unchecked")
public String del(String result) {
try {
Down down = (Down) baseDao.qryInfo("from Down where aguid=?",
new Object[] { result }).get(0);
baseDao.Delete(down);
return "success";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
@SuppressWarnings("unchecked")
public void add(Down down) {
Down d = new Down();
d.setAguid(UUID.randomUUID().toString());
d.setAname(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()));
baseDao.add(d);
}
@SuppressWarnings("unchecked")
public void upd(Down down) {
Down down2 = (Down) baseDao.qryInfo("from Down where aguid=?",
new Object[] { down.getAguid() });
down2.setAname(down.getAname());
baseDao.upd(down2);
}
}
===========================action=============================
package com.s4s2h4.action;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.springframework.beans.factory.annotation.Autowired;
import com.opensymphony.xwork2.ActionSupport;
import com.s4s2h4.services.TestServices;
import com.s4s2h4.services.entity.Down;
public class TestAction extends ActionSupport implements ServletRequestAware {
@Autowired
TestServices testServices;
List<Down> downs = new ArrayList<Down>();
private HttpServletRequest request;
String result = "";
public String qry() {
downs = testServices.qryKcsp();
return SUCCESS;
}
public String add() {
downs = testServices.qryKcsp();
testServices.add(null);
return SUCCESS;
}
public String del() {
result = testServices.del(result);// "{'id':1}";
return SUCCESS;
}
public List<Down> getDowns() {
return downs;
}
public void setDowns(List<Down> downs) {
this.downs = downs;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
}
=========================struts.xml========================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="test" extends="struts-default">
<action name="index" class="com.s4s2h4.action.TestAction" method="qry">
<result name="success">/index.jsp</result>
</action>
<action name="add" class="com.s4s2h4.action.TestAction" method="add">
<result name="success" type="redirect">/</result>
</action>
</package>
<!-- struts json-->
<package name="ajax" extends="json-default" >
<action name="del" class="com.s4s2h4.action.TestAction" method="del">
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>
</struts>
============================jsp===============
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%String path=request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery.1.4.2-min.js"></script>
<script type="text/javascript" src="index.js" charset="gbk"></script>
</head>
<body>
<a href="add">添加</a>
<s:iterator value="downs">
<li>
<s:property value="aname" />
<a href="javascript:delinfo('<s:property value="aguid" />')">删除</a>
</li>
</s:iterator>
</body>
</html>
=========================js=========================
function delinfo(aguid){
$.ajax({
type:"post",
url:"s4s2h4/del",
data:"result="+aguid,
success:function(msg){
if(msg=="success"){
window.location.href=window.location.href;
}else{
alert("删除失败:"+msg);
}
}
,error:function(){
alert("error");
}
});
}
Spring4.0+Hibernate4.0+Struts2.3整合包括增删改查案例,解决整合中出现的异常的更多相关文章
- MVC3.0+knockout.js+Ajax 实现简单的增删改查
MVC3.0+knockout.js+Ajax 实现简单的增删改查 自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+k ...
- springBoot(7)---整合Mybaties增删改查
整合Mybaties增删改查 1.填写pom.xml <!-- mybatis依赖jar包 --> <dependency> <groupId>org.mybati ...
- SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)
前言 说起整合自然离开ssm,我本身并不太喜欢ORM,尤其是MyBatis,把SQL语句写在xml里,尤其是大SQL,可读性不高,出错也不容易排查. 开发环境 idea2016.SpringMVC4. ...
- ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)
Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...
- SSHE框架整合(增删改查)
1.前期准备:jar包(c3p0.jdbc ,各个框架) web.xml文件:spring的 转码的,和Struts2的过滤器 <?xml version="1.0" e ...
- android使用xfire webservice框架远程对sqlserver操作(包括增删改查)的实例!!已在真机上试验通过
前两天,公司有一个利用android远程操作sqlserver的项目,对此我是毫无头绪的,但也挺感兴趣的,于是开始上网搜索方法,网上有挺多方法了,发现使用webservice的挺多的,不过我对这些技术 ...
- Mybatis增删改查,Demo整合
第一步:MyBatis的Jar包引入mybatis-3.2.7.jarmysql-connector-java-5.1.8.jar MyBatis的pom.xml依赖 <dependencies ...
- ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)
在springmvc+spring+mybatis里整合ztree实现增删改查,上一篇已经写了demo,以下就仅仅贴出各层实现功能的代码: Jsp页面实现功能的js代码例如以下: <script ...
- springboot整合mybatis增删改查(四):完善增删改查及整合swgger2
接下来就是完成增删改查的功能了,首先在config包下配置Druid数据连接池,在配置之前先把相关配置在application.preperties中完善 application.preperties ...
随机推荐
- wxWidgets简单的多线程
#include <wx/wx.h> #include <wx/thread.h> #include <wx/event.h> #include <wx/pr ...
- LA 3635 Pie 派 NWERC 2006
有 f + 1 个人来分 n 个圆形派,每个人得到的必须是一整块派,而不是几块拼在一起,并且面积要相同.求每个人最多能得到多大面积的派(不必是圆形). 这题很好做,使用二分法就OK. 首先在读取所有派 ...
- 【转】IOS中定时器NSTimer的开启与关闭
原文网址:http://blog.csdn.net/enuola/article/details/8099461 调用一次计时器方法: myTimer = [NSTimer scheduledTime ...
- 【转载】HBase基本概念和hbase shell常用命令用法
1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...
- OS X中如何获取当前运行程序的路径
OS X的执行程序一般分为两种.一种是控制台程序,一种是带有GUI的OS X应用程序. 控制台程序往往就一个文件构成executable,而GUI应用通常是一个包(即文件夹),里面除了executab ...
- [转]Linux文件和目录操作命令
转自:http://www.linuxdiyf.com/bbs/thread-416176-1-1.html 一.文件操作命令1.1 查看文件 Linux下查看文件的命令有很多,下面列出的几个是几乎所 ...
- textBox只能输入汉字
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if ((e.KeyChar > 0 && ...
- java 获取当前时间及年月日时分秒
java代码如下: package test; import java.text.SimpleDateFormat; import java.util.Calendar; import java.ut ...
- 实现3D摄像机缓冲系统的一些思考
最近需要模拟红侠乔伊的镜头运用.这东西初看简单,实际还是很需要功夫的.关键不是程序技术如何(就一个摄像机),而是分析其轨迹和追踪点规律.其实就是一个3D空间中的缓冲系统.你如何确定都有什么参数,这么多 ...
- 关于C++虚函数的一些东西
先上概念,C++的多态性:系统在运行时根据对象类型,来确定调用哪个重载的成员函数的能力. 多态性是通过虚函数实现的.成员函数之前加了virtual,即成为虚函数. 有虚成员函数的类,编译器在其每个对象 ...