s2sh框架搭建(基于spring aop)
对于spring aop 是如何管理事务的,请看一下:http://bbs.csdn.net/topics/290021423
1.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" <!-- 新加入 -->
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!--新加入 datasource -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hjzgg_test?characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="hjzgg5211314" />
</bean> <bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
<!--新加入 将dataSource注入到sessionFactory中 -->
<property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=false
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
<!--hibernate.current_session_context_class=thread 不需要了-->
</value>
</property> <!--通过配置文件的方式获取数据源-->
<property name="mappingResources">
<list>
<!-- 以下用来列出所有的PO映射文件 -->
<value>person.cfg.xml</value>
</list>
</property>
</bean> <bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <bean id="personDao" class="com.xunchang.PersonDaoImpl">
<!-- 采用依赖注入传入SessionFactory的引用 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean> <bean id="service" class="com.hjzgg.service.XunChageService">
<property name="personDao" ref="personDao"/>
</bean> <bean id="login" class="com.xunchang.LoginAction">
<property name="service" ref="service"/>
</bean> <!-- 配置那些类的方法进行事务管理,需要aopalliance-1.0.jar和aspectjweaver.jar,当前com.neusoft.leehom.service包中的子包,
类中所有方法需要,还需要参考tx:advice的设置 -->
<!-- 需要引入tx的命名空间 -->
<!-- 这是事务通知操作,使用的事务管理器引用自 transactionManager -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 指定哪些方法需要加入事务,这里懒惰一下全部加入,可以使用通配符来只加入需要的方法 -->
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<tx:method name="query*" propagation="REQUIRED" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 需要引入aop的命名空间 -->
<aop:config>
<!-- 切入点指明了在执行Service的所有方法时产生事务拦截操作 -->
<aop:pointcut id="daoMethods" expression="execution(* com.hjzgg.service.*.*(..))" />
<!-- 定义了将采用何种拦截操作,这里引用到 txAdvice -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods" />
</aop:config>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
2. dao层代码
package com.xunchang; import java.util.List; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction; public class PersonDaoImpl implements PersonDao{ private SessionFactory sessionFactory; public Session getSession() {
return sessionFactory.getCurrentSession();
} public SessionFactory getSessionFactory() {
return sessionFactory;
} public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} @Override
public Person get(Integer id) {
return (Person) this.getSession().get(Person.class, id);
} @Override
public void save(Person ps) {
this.getSession().save(ps);
} @Override
public List<Person> findAllPerson() { /*
* 问题: home402 is not mapped [from home402];
* 最后发现了问题所在,hql查询时使用的from Xxx,Xxx不是实体类的名称,而是 EntityName (Hibernate注解)。
如: @Entity
@Table(name="QING_AO_CENTER_INFO")
public class QingAoCenterInfo {
......
}
此处, @Entity后并没有显示的指明EntityName,因此默认采用实体类的名称。 @Entity(name="QING_AO_CENTER_INFO")
@Table(name="QING_AO_CENTER_INFO")
public class QingAoCenterInfo {
......
}
可以发现,显示地指明了 EntityName,因此在使用hql查询的时候,要from QING_AO_CENTER_INFO,而不是from QingAoCenterInfo ; centerList = manager.find("from QING_AO_CENTER_INFO center where center.type = ? and center.centerName = ?", new Object[]{type,centerName});
*/
Session session = this.getSession();
// Transaction tran = session.beginTransaction();
session.save(new Person(null, "我是hjzgg", ));
List<Person> list = session.createQuery("from Person").list();
// tran.commit();
return list;
} }
3.service层部分代码:
package com.hjzgg.service; import java.util.List; import com.xunchang.Person;
import com.xunchang.PersonDao; public class XunChageService {
private PersonDao personDao; public Person get(Integer id){
return personDao.get(id);
} public void save(Person ps){
personDao.save(ps);
}
public List<Person> findAllPerson(){
return personDao.findAllPerson();
}
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
}
4.action部分代码:
package com.xunchang; import java.util.List; import com.hjzgg.service.XunChageService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport {
private XunChageService service; @Override
public String execute() throws Exception{
List<Person> list_person = service.findAllPerson();
ActionContext.getContext().getSession().put("person", list_person);
return "success";
} public XunChageService getService() {
return service;
} public void setService(XunChageService service) {
this.service = service;
} }
5.和数据库映射的pojo:
package com.xunchang; import java.io.Serializable;
/*
*待解决问题,为什么一定要实现 Serializeable
*/
public class Person implements Serializable{
private Integer personId;
private String person_name;
private Integer person_age; public Person(){
} public Person(Integer personId, String person_name, Integer person_age) {
super();
this.personId = personId;
this.person_name = person_name;
this.person_age = person_age;
} public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public String getPerson_name() {
return person_name;
}
public void setPerson_name(String person_name) {
this.person_name = person_name;
}
public Integer getPerson_age() {
return person_age;
}
public void setPerson_age(Integer person_age) {
this.person_age = person_age;
}
}
6.hibernate映射文件xml
<?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="com.xunchang">
<class name="Person" table="home402">
<!-- 定义持久化类的表示属性 -->
<id name="personId" column="personId" type="java.lang.Integer">
<!-- 定义主键生成策略 -->
<generator class="identity"/>
</id>
<property name="person_name" column="person_name" type="java.lang.String"/>
<property name="person_age" column="person_age" type="java.lang.Integer"/>
</class>
</hibernate-mapping>
7.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 namespace="/" name="struts2" extends="struts-default"> <!-- package中的标签必须按照如下顺序配置
result-types,interceptors,default-interceptor-ref,default-action-ref,default-class-ref,global-results,global-exception-mappings,action*(就是所有的action放到最后)
-->
<!-- 自定义拦截器 ,如果有拦截器,必须放在package标签内的第一位-->
<interceptors>
<!-- 在这里可以添加自己的拦截器
<interceptor name="myInterceptor" class="自定义pojo类"></interceptor>
-->
<interceptor-stack name="myInterceptorStack">
<!--
<interceptor-ref name="myInterceptor"></interceptor-ref>
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <global-results>
<result></result>
</global-results> <action name="login" class="login">
<result name="success">/servlet/MyServlet</result>
</action> </package>
</struts>
s2sh框架搭建(基于spring aop)的更多相关文章
- Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
- Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
- Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现
上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...
- 快速搭建基于Spring Boot + Spring Security 环境
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.Spring Security 权限管理框架介绍 简介: Spring Security 提供了基于 ...
- 基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
- SpringMVC框架搭建 基于注解
本文将以一个很简单的案例实现 Springmvc框架的基于注解搭建,一下全为个人总结 ,如有错请大家指教!!!!!!!!! 第一步:创建一个动态web工程(在创建时 记得选上自动生成 web.xml ...
- 基于Spring aop写的一个简单的耗时监控
前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...
- 基于Spring AOP实现的权限控制
1.AOP简介 AOP,面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术.系统是由许多不同的组件所组成的,每一个组件负责一块特定的功能.除了实现自身核心功能之外,这些组件还经常承担着额外的 ...
随机推荐
- 神经网络hopfield的学习
Hopfield神经网络使用说明. 该神经网络有两个特点: 1,输出值只有0,1 2,Hopfield没有输入(input) 这里解释一下第二个特点,什么叫没有输入?因为在使用Hopfield网络的时 ...
- iOS开发 swift3.0中文版
swift3.0中文版: http://pan.baidu.com/s/1nuHqrBb
- hdu 5718(Oracle)大数加法
曾经有一位国王,统治着一片未名之地.他膝下有三个女儿. 三个女儿中最年轻漂亮的当属Psyche.她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕. 神谕可以看作一个不含前导零的正整数n n ...
- 浅析C语言指针问题
首先明白c语言操作符的优先级及结合性就很容易理解了. 链接 1.关于char *s 及 char s[] char *s指向的是一个字符串对象的指针,可以理解为间接引用,比如 char *s = “1 ...
- NYOJ 536 开心的mdd(DP)
开心的mdd 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 himdd有一天闲着无聊,随手拿了一本书,随手翻到一页,上面描述了一个神奇的问题,貌似是一个和矩阵有关的 ...
- javascript检测ActiveX插件是否安装/启用
本文主要提供在IE浏览器下检测ActiveX插件安装/启用的状态. 在一些应用开发中,需要用到一些第三方提供的ActiveX插件,如Flash插件. 为了在未安装插件的浏览器显示友好的提示,需要用到主 ...
- objective-c(继承)
objective-c的继承给出基础例子及注意点: 定义并实现基类ClassA #import <Foundation/Foundation.h> @interface ClassA : ...
- 两种include方式及filter中的dispatcher解析
两种include方式 我自己写了一个original.jsp,另外有一个includedPage.jsp,我想在original.jsp中把includedPage.jsp引进来有两种方式: 1.& ...
- Asp.Net MVC中使用ACE模板之Jqgrid
第一次看到ACE模板,有种感动,有种相见恨晚的感觉,于是迅速来研究.它本身是基于bootstrap和jqueryui,但更nice,整合之后为后台开发节省了大量时间. 发现虽然不是完美,整体效果还是不 ...
- 用“MEAN”技术栈开发web应用(二)express搭建服务端框架
上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ...