ssh简化后之事务管理
为了能让大家更好的了解,所以今天跟大家分享整个项目。ps:ssh环境的搭建我就不一一讲解了,请大家参考 http://www.cnblogs.com/zczc1996/p/5842367.html。
这里以新闻发布系统为例,项目名称就叫news
下面我们开始第一步:建四个架包,如下:
这里的命名是比较规范的,也建议这样取名。
首先我们完成实体类类以及映射文件的编写,如下:
package news.entity; import java.util.Date; public class News { private Integer id;
private String title;
private String content;
private Date begintime;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getBegintime() {
return begintime;
}
public void setBegintime(Date begintime) {
this.begintime = begintime;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
} }
映射文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="news.entity">
<class name="News" table="news">
<id name="id">
<generator class="native"/>
</id>
<property name="title" type="string" length="50" />
<property name="content" type="string" length="500" />
<property name="begintime" type="java.util.Date" length="20" />
<property name="username" type="string" length="20" />
</class> </hibernate-mapping>
这里顺路把struts.xml和web.xml也放出来把。不懂的可以参考上面的链接~.~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.devMode" value="true" />
<package name="mypck001" extends="struts-default">
<action name="NewsAction_*" class="newsAction" method="{1}">
<result name="show">/WEB-INF/jsp/index.jsp</result>
<result name="OK" type="redirect">NewsAction_showAll?message=${message}&id=${id}</result>
</action>
</package>
</struts>
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>news1</display-name>
<welcome-file-list>
<welcome-file>index.html</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>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
再则我们先创建一个NewsAction,如下:
package news.action; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; import com.opensymphony.xwork2.ActionSupport; import news.entity.News;
import news.service.NewsService;
@Controller
@Scope("prototype")
public class NewsAction extends ActionSupport {
private Integer id;
private String message;
private List<News> listAllNews;
@Autowired
private NewsService ns; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public List<News> getListAllNews() {
return listAllNews;
}
public void setListAllNews(List<News> listAllNews) {
this.listAllNews = listAllNews;
}
public String showAll(){
listAllNews=ns.showAll();
return "show";
}
public String delSingleNews(){
message=ns.delSingleNews(id);
return message;
}
}
接着我们先创建一个NewsService接口,如下:
package news.service; import java.util.List; import news.entity.News; public interface NewsService {
public List<News> showAll();
public String delSingleNews(Integer id);
}
接着我们创建一个NewsService接口的实现类NewsServiceImpl,如下:
package news.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; import news.dao.Newsdao;
import news.entity.News;
@Service
@Scope("prototype")
public class NewsServiceImpl implements NewsService {
@Autowired
private Newsdao nd;
public List<News> showAll(){
List<News> listAllNews=nd.showAll();
return listAllNews;
}
public String delSingleNews(Integer id){
String deleteList=nd.delSingleNews(id);
return deleteList;
}
}
在NewsServiceImpl中我们需要注入NewsDao,所以我们创建一个NewsDao的接口,如下:
package news.dao; import java.util.List; import news.entity.News; public interface Newsdao {
public List<News> showAll();
public String delSingleNews(Integer id);
}
接着我们创建一个NewsDao的实现类NewsDaoImpl,如下:
package news.dao; import java.util.List; import javax.persistence.Query; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository; import news.entity.News;
@Repository
@Scope("prototype")
public class NewsDaoImpl implements Newsdao {
@Autowired
private SessionFactory sf; @Override
public List<News> showAll() {
Session session=sf.getCurrentSession();
Query query =session.createQuery("from News");
List<News> listAllNews=query.getResultList();
return listAllNews;
} @Override
public String delSingleNews(Integer id) {
Session session=sf.getCurrentSession();
Query query =session.createQuery("from News where id=:myid");
query.setParameter("myid", id);
List<News> deleteList=query.getResultList();
if(deleteList.size()==1){
News news=deleteList.get(0);
session.delete(news);
}
return "OK";
} }
这次的都是采用注解的方式来写的代码,所以配置文件那边少了很多代码,这不仅提升了运行速度,而且还可以减少出错。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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- 类似于财务部门一样,类就是钱,所有需要类的实例都由srping去管理 -->
<!-- <context:component-scan>:
有一个use-default-filters属性,该属性默认为true,
这就意味着会扫描指定包下的全部的标有注解的类,并注册成bean.
可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,
该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示
<context:component-scan base-package="news" use-default-filters="false">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
如果use-dafault-filters在上面并没有指定,默认就为true,
也就意味着你现在加<context:exclude-filter/>跟没加是一样的
所有你要记住,你若想要用到<context:component-scan>的子标签,
必须要把use-dafault-filters的值改为false
当然还有一个是与之相反的而已这里就不啰嗦了
上面这一对解释换成一句话就是:
Use-dafault-filters=”false”的情况下:<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描
<context:component-scan>的base-package属性作用:设置要被扫描的包 --> <!-- (本案例不用到,只是用了一个全盘扫描,以上内容只是为了让大家了解它) --> <context:component-scan base-package="news.."/>
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- <tx:annotation-driven transaction-manager="transactionManager"/> --> <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 每300秒检查所有连接池中的空闲连接 -->
<property name="idleConnectionTestPeriod" value="300"/>
<!-- 最大空闲时间,900秒内未使用则连接被丢弃。若为0则永不丢弃 -->
<property name="maxIdleTime" value="900"/>
<!-- 最大连接数 -->
<property name="maxPoolSize" value="2"/>
</bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- <property name="packagesToScan">
<list>
这里value值添实体类所在的包
<value>news.entity</value>
</list>
</property> -->
<property name="mappingResources">
<list>
<value>news/entity/News.hbm.xml</value>
</list>
</property>
</bean> <bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<!-- 创建事务管理器, 管理sessionFactory(因为所有的session都是从sessionFactory获取的) -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置通知, 哪些方法需要切入什么类型的事务 -->
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice> <!-- 配置切面表达式, 并且让 tx与切面表达式合二为一 -->
<aop:config>
<!-- 表达式, 定义哪个包的哪些类需要切入事务,但是此处并且没有制定类中哪些方法,需要切入什么样 事务 -->
<aop:pointcut expression="execution(* news.service.*.*(..))" id="pointcut" />
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config>
</beans>
为了方便跳转,我们来写一个默认的jsp,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
response.sendRedirect("NewsAction_showAll.action");
%>
接着我们写显示页面,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:if test="%{id!=null}">
删除信息:<s:property value="message"/><br>
删除标号:<s:property value="id"/><br><br>
</s:if>
<s:iterator value="listAllNews">
<s:property value="id"/>
<s:property value="title"/>
<s:a href="NewsAction_delSingleNews.action?id=%{id}">删除</s:a><br>
</s:iterator>
</body>
</html>
我们来运行下,结果如下:
实现功能了如下:
这个项目到这里就结束了,欢迎大家给予我意见,谢谢。~
ssh简化后之事务管理的更多相关文章
- Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)
简介 Spring.NET为事务管理提供了一个持久化抽象(consistent abstraction ),其优点如下: 为不同事务API,例如ADO.NET,Enterprise Services, ...
- mybatic与spring结合的事务管理
原文地址:http://czj4451.iteye.com/blog/2037759 mybatis与spring结合后,事务管理更加方便,这里介绍使用transactionnal的方式,有错的的地方 ...
- spring boot学习(6) SpringBoot 之事务管理
两个操作要么同时成功,要么同时失败: 事务的一致性: 以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来 ...
- spring boot快速入门 5: 事务管理
事务管理: 新增两名女生: 第一步:创建 GirlRespository package com.payease.service; import com.payease.entity.Girl; im ...
- 1-6SpringBoot之事务管理@Transactional
以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要 ...
- Transaction Managament(事务管理二、Spring事务)
Transaction Managament(事务管理二.Spring事务) Spring事务框架的优势 Spring事务框架将开放过程中事务管理相关的关注点进行了分离,对这些关注点进行了抽象分离 ...
- ssh搭建后的简化
关于ssh如何搭建还有不懂得朋友可以参考以下网址:http://www.cnblogs.com/LarryBlogger/p/5841446.html 在这里我就不重复再讲了! ssh搭建后的简化 简 ...
- 【Java EE 学习 54】【OA项目第一天】【SSH事务管理不能回滚问题解决】【struts2流程回顾】
一.SSH整合之后事务问题和总结 1.引入问题:DAO层测试 假设将User对象设置为懒加载模式,在dao层使用load方法. 注意,注释不要放开. 使用如下的代码块进行测试: 会报错:no sess ...
- 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用
一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection 2.获取statement 3.获取resultset 4 ...
随机推荐
- 最新版 chrome 33中,backgroundPosition 改了.
ctrl.css('backgroundPosition' 返回值不一样, 原来是:-75px 0px 现在是:left 75px top 0px // chrome 33 返回的是 left 0px ...
- js中bind、call、apply函数的用法
最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...
- xpath定位中starts-with、contains和text()的用法
starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...
- PDF虚拟打印机
1.安装福昕PDF阅读器,自己就会安装上PDF虚拟打印机 2.通过office2010之后版本中自带的另存为功能转换为pdf 3.pdf虚拟打印机工具:工具1:http://www.win2pdf.c ...
- jquery中on绑定事件
之前项目中动态创建的标签元素 在绑定事件的时候 都是无效 无论如何都不能触发 eg:在页面加载完成之后 再由脚本动态创建的<div>元素 在绑定事件的时候 例如click事件 ...
- linux的安装
在CentOS 7中提供了两种桌面"GNOME DESKTOP" 和 "KDE Plasa Workspaces",我们以安装"GNOME DESKT ...
- C++ 字符处理函数
C/C++里有一个头文件#include <ctype.h>,里面定义了很多字符函数,在实际开发中,用起来很方面. int isalpha(int ch) 若ch是字母('A'-'Z', ...
- WordPress一键部署网站
每个人心里都有一个建站梦,所以今天作为我第一篇文章,就给大家圆了这场梦. 今天我来详细的一步一步带领大家利用WordPress程序来建立自己的小站以及解决直接域名访问(本地安装wordpress请阅读 ...
- Android 自定义ToolBar详细使用
自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用 1.ToolBar布局 <?xml version="1.0" encodin ...
- JQuery UI dialog 弹窗实例及参数说明
按钮代码: <a id="suprise" style="margin-left: 0.5em;cursor:pointer;">点我会有惊喜< ...