什么是框架

在的J2EE开发中,经常会提到“框架”这个词汇,例如Spring,Struts,Webx等等都称之为J2EE开发框架。那么,什么是框架呢?

框架的英文为Framework,带有骨骼,支架的含义。

在软件工程中,框架被定义为整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。

一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。

框架是实现了某应用领域通用功能的底层服务。使用这种框架的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发。框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类或组装对象来支持应用专用的行为。

通俗的说,框架是完成是某种应用的半成品,提供了一些常用的工具类和一些基础通用化的组件,可以供开发人员在此基础上,更便捷的完成各自特有的系统。

Spring是一个综合型框架,致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring可以作为应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,它可以与其他框架无缝地整合。

考虑到面向的领域,以及实现编码实现,我们可以将将框架至少分为三类。

第一类是基础类库,主要包含多数项目所需要的类库。(开发人员将其作为一个类库使用,可以简化一些常用的算法逻辑。)

第二类是基础框架,该框架应该整合或者实现J2EE开发所需要的常用功能。(此框架可以为各类WEB项目开发提供基础支持。)

第三类是平台框架,针对于某种特定领域,实现特定领域所需要的常用功能。(这个框架需要实现具体领域的业务的逻辑。并且应该支持各类扩展)

为什么需要整合呢?

使用spring ,主要是使用它的ioc(可以理解成管理bean的一个容器) ,aop(面向切面编程:持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等) ,jdbcTemplate(封装操作数据库,不用再自己建立关闭连接了,挺方便的。)

当然还有一部分是工作需要, spring的IOC可以降低对象的耦合度,方便用junit做自动化测试.

以上的部分只是自己摘抄的个人理解。

接下来开始真正进入代码的世界,我们来实现一个添加图书和查询图书信息的功能。使用Spring和Hibernate整合

创建实体类:

package cn.books.beans;

/**
* Created by accp on 2017/3/30.
*/
public class Book {
private Integer id;
private String name;
private String price; public Book() {
} public Book(String name, String price) {
this.name = name;
this.price = price;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
}
}

小配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.books.beans">
<class name="Book" table="Book">
<id name="id"><generator class="native"></generator></id>
<property name="name"/>
<property name="price"/>
</class>
</hibernate-mapping>

dao:

package cn.books.dao;

import cn.books.beans.Book;

/**
* Created by accp on 2017/3/30.
*/
public interface BookDao {
int add(Book book);
}

dao层的实现(implements):

package cn.books.dao.impl;

import cn.books.beans.Book;
import cn.books.dao.BookDao;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; /**
* Created by accp on 2017/3/30.
*/
public class BookDaoImpl implements BookDao { private SessionFactory sessionFactory;
@Transactional
public int add(Book book) {
Serializable count = sessionFactory.getCurrentSession().save(book);
return (Integer) count;
} public SessionFactory getSessionFactory() {
return sessionFactory;
} public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}

biz层(业务逻辑):

package cn.books.biz;

import cn.books.beans.Book;

/**
* Created by accp on 2017/3/30.
*/
public interface BookBiz {
int add(Book book);
}

biz的实现层:

package cn.books.biz.impl;

import cn.books.beans.Book;
import cn.books.biz.BookBiz;
import cn.books.dao.BookDao; /**
* Created by accp on 2017/3/30.
*/
public class BookBizImpl implements BookBiz{ private BookDao dao;
public int add(Book book) {
return dao.add(book);
} public BookDao getDao() {
return dao;
} public void setDao(BookDao dao) {
this.dao = dao;
}
}

这些类创建完成了,接下我们就改配置applicationContext.xml了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!--注入jdbc.properties-->
<context:property-placeholder location="classpath:jdbcmysql.properties"></context:property-placeholder>
<!--数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!--sessionFactory配置-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<!--方言-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<!--获取当前线程中的session-->
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop>
</props>
</property>
<!--关联小配置-->
<property name="mappingDirectoryLocations" value="classpath:cn/books/beans"></property>
</bean> <!--dao-->
<bean id="bookDao" class="cn.books.dao.impl.BookDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <!--biz-->
<bean id="bookBiz" class="cn.books.biz.impl.BookBizImpl">
<property name="dao" ref="bookDao"></property>
</bean> <!--事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven> </beans>

支持我们项目的一系列的jar包节点

  <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3</version>
</dependency> <!--jta的jar包-->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency> <!--mysql数据库驱动-->
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34_1</version>
</dependency> <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0..Final</version>
</dependency> <!--以上是HIbernate的jar包配置--> <!--下面是Spring相关的jar包配置-->
<!--c3p0-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency> <!--AOP的相关jar-->
<dependency>
<groupId> org.aspectj</groupId >
<artifactId> aspectjweaver</artifactId >
<version> 1.8.</version >
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2..RELEASE</version>
</dependency> <!--Spring-ORM-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version> 4.2..RELEASE</version>
</dependency> </dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>

前期准备工作完成,最后进入测试阶段:

package cn.books.test;

import cn.books.beans.Book;
import cn.books.biz.BookBiz;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by accp on 2017/3/29.
*/
public class FirstTest {
@Test
public void findTwo(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextbase.xml");
BookBiz proxy=(BookBiz) ctx.getBean("bookBiz");
int count = proxy.add(new Book("天空之城", ""));
System.out.println(count);
} }

结果:

DEBUG SQL: -
insert
into
Book
(name, price)
values
(?, ?)
Hibernate:
insert
into
Book
(name, price)
values
(?, ?)
DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空之城}

7

数据库数据:

使用查询功能:

添加方法:List<Book> selectAll();--------------->dao

private SessionFactory sessionFacctory;

@Transcational

public List<Book> selectAll() {

List<Book>  list=sessionFactory.getCurrentSession().createCriteria(Book.class).list();

return list;

}

-------------------->dao.impl

List<Book> selectAll();--------------->biz

private BookDao dao;

public List<Book> selectAll(){

return dao.selectAll();

}

-------------------->biz.impl

applicationContext.xml配置文件不需要修改和添加,书写测试类即可。

  @Test
public void findOne(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContextbase.xml");
BookBiz proxy=(BookBiz) ctx.getBean("bookBiz");
List<Book> list = proxy.selectAll();
for (Book item : list) {
System.out.println("名称:"+item.getName()+"\t价格:"+item.getPrice());
}
}

控制台上的数据显示:

DEBUG SQL: -
select
this_.id as id1_0_0_,
this_.name as name2_0_0_,
this_.price as price3_0_0_
from
Book this_
Hibernate:
select
this_.id as id1_0_0_,
this_.name as name2_0_0_,
this_.price as price3_0_0_
from
Book this_
::, DEBUG EntityPrinter: - Listing entities:
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=你好吗?天空}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=图书第二次}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=图书}
::, DEBUG EntityPrinter: - cn.books.beans.Book{id=, price=, name=天空之城}
::, DEBUG HibernateTransactionManager: - Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#], EntityKey[cn.books.beans.Book#]],collectionKeys=[]];ActionQueue[insertions=ExecutableList{size=} updates=ExecutableList{size=} deletions=ExecutableList{size=} orphanRemovals=ExecutableList{size=} collectionCreations=ExecutableList{size=} collectionRemovals=ExecutableList{size=} collectionUpdates=ExecutableList{size=} collectionQueuedOps=ExecutableList{size=} unresolvedInsertDependencies=null])] after transaction
名称:图书    价格:
名称:图书第二次 价格:
名称:你好吗?天空 价格:
名称:天空 价格:
名称:天空 价格:
名称:天空 价格:
名称:天空之城 价格:

在整合Spring和Hibernate时候遇到的问题最多的就是:

Could not obtain transaction-synchronized Session for current thread

提示无法获取当前线程的事务同步session,略微奇怪,这和事务有什么关系..然后百度一下有人说改成用openSession方法就好了,那我又百度了一下这2个方法的区别:

(1)openSession每次打开都是新的Session,所以多次获取的Session实例是不同的,并且需要人为的调用close方法进行Session关闭。
(2)getCurrentSession是从当前上下文中获取Session并且会绑定到当前线程,第一次调用时会创建一个Session实例,如果该Session未关闭,后续多次获取的是同一个Session实例;事务提交或者回滚时会自动关闭Sesison,无需人工关闭。

现在我们所做的测试都是在控制台上打印输出的,还没涉及到在页面上显示数据,当我们在页面上获得数据时要在保证在同一个会话中完成,所以当我们使用openSession()方法时不会出现错误,但是当我们在当前线程内获取session时会出现上述的错误。。

解决办法:

在dao层的方法上面加上@Transcational注解,在applicationContext.xml中添加上:

<!--事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>

或者换一种别的配置方法:

Aop方法

<!--事务管理器-->
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="select*" isolation="DEFAULT" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="point" expression="execution(* *..biz.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="point"></aop:advisor>
</aop:config>

以上两种办法都可以解决上述的问题。。。。

整合初步______SH的更多相关文章

  1. 整合初步--------->SSH(注解版)

    上面的一篇博客已经介绍了 Spring和Hibernate之间的整合,没看过的童鞋可以去看看,这篇博客讲解Spring+Hibernate+Struts2注解版......... 个人觉得使用注解可能 ...

  2. SSH环境搭建,配置整合初步(一)

    1,新Webproject.并把编码设为utf-8(全部的都是uft8数据库也是,就不会乱码了)2.加入框架环境JunitStruts2Hibernate Spring3,整合SSHStruts2与S ...

  3. Ucenter整合Thinkphp 双向同步登录退出

    1.整合初步工作: 1,安装Ucenter,完成后添加应用,填写要对接的网站地址 2,api , uc_client目录放置对接项目的根目录 3,通信对接,新建Ucenter组,confi文件填写在u ...

  4. Redis进阶实践之七Redis和Lua初步整合使用(转载 7)

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  5. Redis进阶实践之七Redis和Lua初步整合使用

    一.引言        Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当 ...

  6. ssh整合思想初步 struts2与Spring的整合 struts2-spring-plugin-2.3.4.1.jar下载地址 自动加载Spring中的XML配置文件 Struts2下载地址

    首先需要JAR包 Spring整合Structs2的JAR包 struts2-spring-plugin-2.3.4.1.jar 下载地址 链接: https://pan.baidu.com/s/1o ...

  7. ssh整合思想初步 structs2 Spring Hibernate三大框架各自要点

    Web层用Structs2的action Service层用Spring的IoC和aop以及JdbcTemplate或者Transaction事务(创建对象及维护对象间的关系) Dao层用Hibern ...

  8. Spring Data初步--整合Hibernate

    Spring Data课程中的技术介绍 Hibernate: Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 pojo 与数据库表建立映射关系 ...

  9. liunx 安装ActiveMQ 及 spring boot 初步整合 activemq

    源码地址:  https://gitee.com/kevin9401/microservice.git 一.安装 ActiveMQ: 1. 下载 ActiveMQ wget  https://arch ...

随机推荐

  1. SpringMvc拦截器小测试

    前言 俗话说做项目是让人成长最快的方案,最近小编写项目的时候遇到了一个小问题.小编在项目中所负责的后台系统,但是后台系统是通过系统的页面是通过ifame联动的,那么这时候问题就来了,后台所做的所有操作 ...

  2. JAVA程序测试之Swing编程

    package swingtest; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt. ...

  3. 网易云直播SDK使用总结

    前言: 最近公司的项目中加入中直播这部分的功能,现在的直播平台真的很多很多,以前在朋友圈看到过这张图片,没办法一次性给大家看,就只能这样截成几张给大家看看.其实按照我自己的看法,现在的直播已经没办法做 ...

  4. HTTP状态码理解

    100-199 用于指定客户端应相应的某些动作. 200-299 用于表示请求成功. 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息. 400-499 用于指出客户端的错 ...

  5. 如何用js实现自适应,原来只是几行代码的事(╯‵□′)╯︵┻━┻

    在javascript写下如下几行:   (function (doc, win, undefined) {            var docEl = doc.documentElement,   ...

  6. linux下php调试工具xdebug安装配置

    xdebug简介 Xdebug是php的一款调试工具,是基于zend的一个扩展,可以用来跟踪,调试和分析PHP程序的运行状况.如变量,函数调试,性能监测,代码覆盖率等 xdebug安装 1.下载xde ...

  7. Animate自定义动画

    在jQuery中出了基本的动画之外,还有用户 可以自定义的函数,Animate() 用于创建自定义动画的函数. apI上指出: 这个函数的关键在于指定动画形式及结果样式属性对象.这个对象中每个属性都表 ...

  8. 微信小程序,超能装的实例教程

    序言 开始开发应用号之前,先看看官方公布的「小程序」教程吧!(以下内容来自微信官方公布的「小程序」开发指南) 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果.这个小程序 ...

  9. HttpWebRequest 模拟网站登录获取数据

    此文档仅仅是一个BaseCode,已做后续查阅 项目使用IBM Platform Symphony分布式平台,所有业务处理都在这个分布式平台上计算,需求是获取这些计算机机群的运行状态,和每一个服务的的 ...

  10. VS2010 MSDN的介绍

    5     cout << temp; 博客园第一篇文章的开始. VS2010 MSDN的文档介绍 https://msdn.microsoft.com/zh-cn/library/dd8 ...