struts2 hibernate spring
Download
Skip this Video
Download Presentation
Struts2+Hibernate+Spring

Loading in 2 Seconds...

play fullscreen
1 / 45

Struts2+Hibernate+Spring - PowerPoint PPT Presentation


  • 235 Views
  • Uploaded on

Struts2+Hibernate+Spring. Spring+Hibernate. +. Spring+Struts2. =. Struts2+Hibernate+Spring. 组合开发架构细节. Action: 处理 Web 请求,提供了基本的 view , uptate , delete 等实现,由 Spring 管理注入 Manager: 隔离事务,包括主要的业务逻辑,也提供了 CRUD 及分页的接口。其他资源调度也在这一层提供接口,如 email DAO: 存取数据的接口, Hibernate 实现。包含了基本的 CRUD 以及分页功能

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Struts2+Hibernate+Spring' - jam


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
struts2 hibernate spring
Struts2+Hibernate+Spring

Spring+Hibernate

+

Spring+Struts2

=

Struts2+Hibernate+Spring

slide2
组合开发架构细节
  • Action:处理Web请求,提供了基本的view,uptate,delete等实现,由Spring管理注入
  • Manager:隔离事务,包括主要的业务逻辑,也提供了CRUD及分页的接口。其他资源调度也在这一层提供接口,如email
  • DAO:存取数据的接口,Hibernate实现。包含了基本的CRUD以及分页功能
  • 领域对象:POJO,由Hibernate映射
slide3
工程搭建过程
  • 1:新建工程
  • 2:用Myeclipse为工程添加Hibernate包库:
slide12
此时:工程结构为:

我们只需要applicationContext.xml,所以删掉hibernate.cfg.xml

然后我们要到工程包库中删掉一个冲突的JAR包:asm-2.2.3.jar

方法可如下:

slide13
点击展开工程目录的:

>>>

找到并选中后右键:

然后它转移到:

然后右键删除:

完成!

slide14
可将其保留在

这样在web.xml中引用的配置应为

contextConfigLocation

classpath*:/applicationContext*.xml

org.springframework.web.context.ContextLoaderListener

也可放在放在/WEB-INF/下

那么上面红色高亮部分就应改为:/WEB-INF/applicationContext*.xml

  • 对于applicationContext.xml配置文件路径的处理

*通配符的作用为使用多配置文件!

slide15

value="com.mysql.jdbc.Driver">

value=“jdbc:mysql://localhost:3306/数据源名?useUnicode=true&characterEncoding=utf-8">

  • 在applicationContext.xml中进行基本配置

一般使用commons.dbcp连接池:所以需要导入它所需要的commons-dbcp.jar和

commons-pool.jar(它们的版本一般无所谓)

slide16

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

…(此处为Hibernate生成的映射xml文件)

org.hibernate.dialect.MySQLDialect

true

slide17

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

slide19
双击打开数据库连接:

然后找到数据库,并选中要映射的表:

右键:

slide22
Hibernate中,标签下的可选子元素是一个Java类的名字,用来为该持久化类的实例生成惟一标示,所有的生成器都实现net.sf.hibernate.id.IdentifierGenerator接口这是一个非常简单的接口,某些应用程序可以选择提供它们自己的特定实现当然,Hibernate提供了很多内置的实现下面是一些内置主键生成器(Key Generator)的意义 

1)    assigned主键由外部程序负责生成,无需Hibernate参与。

   让应用程序在save()之前为对象分配一个标示符。这是 元素没有指定时的默认生成策略。

2)      hilo通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

        使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

3) seqhilo与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

        使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。

slide23
4) increment主键按数值顺序递增此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常因此,如果同一数据库有多个实例访问,此方式必须避免使用。用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。

5) identity采用数据库提供的主键生成机制如DB2 SQL Server MySQL中的主键生成机制。

          对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。

6) sequence采用数据库提供的sequence 机制生成主键如Oralce 中的Sequence。在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。

slide24
7) native由Hibernate根据底层数据库自行判断采用identity hilo sequence其中一种作为主键生成方式8) uuid.hex用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
  •          由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键例如:5abefd3890cat33llsica3ee43bk222
  •       9) uuid.string与uuid.hex 类似,只是生成的主键未进行编码(长度16)在某些数据库中可能出现问题(如PostgreSQL)
  • 10)guid
    • 在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。
  • 11)select
    • 通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
  • 12)foreign
    • 使用另外一个相关联的对象的标识符。通常和联合起来使用。
slide25
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性另外由于常用的数据库,如OracleDB2SQLServerMySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁

数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制

slide27
先新建一个包用于存放DAO文件:

通过接口来实现! 先创建接口,给接口增加方法:(如CRUD)

  • 编写DAO:

package com.DAO;

import java.util.List;

import com.model.Movie;

public interface MovieDAOi

{

public void add(Movie m);

public List showmovies();

public void delete(Long id);

public void update(Movie m);

public Movie getMovie(Long id);

}

slide28
先新建一个包用于存放DAO文件:

实现DAO接口并继承Spring对Hibernate的帮助类:

  • 编写DAO的实现类:

package com.DAO.Hibernate;

import java.util.List;

importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.DAO.MovieDAOi;

import com.model.Movie;

publicclass MovieDAO extendsHibernateDaoSupportimplementsMovieDAOi

这个帮助类提供一个方便的方法:

getHibernateTemplate(); 很容易就能得到HibernateTemplate的一个实例.它也有getSession()和closeSessionIfNecessary()方法,以便于你应为某些原因而不使用HibernateTempate的情况下执行Hibernate操作。

slide29
publicclass MovieDAO extends HibernateDaoSupport implements MovieDAOi

{

publicvoid add(Movie m)

{

getHibernateTemplate().save(m);

}

public List showmovies()

{

return getHibernateTemplate().find("from movie");

}

publicvoid update(Movie m)

{

getHibernateTemplate().update(m);

}

publicvoid delete(Long id)

{

getHibernateTemplate().delete(getHibernateTemplate().get(Movie.class, id));

}

public Movie getMovie(Long id)

{

Movie m=(Movie)getHibernateTemplate().get(Movie.class, id);

return m;

}

}

slide30
编写service层(Manager)

也通过接口实现:先创建接口,给接口增加方法

package com.service;

import java.util.List;

import com.model.Movie;

publicinterface MovieManager

{

publicvoid addMovie(Movie m);

public List showMovies();

publicvoid deleteMovie(Long id);

publicvoid updateMovie(Movie m);

public Movie getMovieMovie(Long id);

}

slide31
实现service接口,并声明所要用到的DAO接口,创建它的set方法供spring将DAO

的实现类注入进来

  • 编写service的实现类:

publicclass MovieManagerImpl implements MovieManager

{

private MovieDAOi movieDao; (DAO的接口类)

……

publicvoid setMovieDao(MovieDAOi movieDao)

{

this.movieDao = movieDao;

}

}

slide32

bean中声明的

所注入的ben

  • 配置applicationContext.xml:通过Spring来管理各层
slide33

然后修改applicationContext.xml中sessionFactory的Hibernate映射文件配置

com/model/Movie.hbm.xml

com/model/MovieKind.hbm.xml

到此已完成Spring和Hibernate的整合

spring struts2
Spring+Struts2
  • 手动导入Struts2类库

如果不需要跟第三方框架集成,把不带-plugin结尾的jar文件都添加入类路径即可。如果需要跟第三方框架集成,这时候还需要加入对应的-plugin jar文件。例如跟spring集成,需要加入struts2-spring-plugin-2.x.x.jar

然后在web.xml文件中配置Struts2和Spring。

并在src/下加入struts.properties和struts.xml这两个配置文件

slide35

contextConfigLocation

classpath*:/applicationContext*.xml

org.springframework.web.context.ContextLoaderListener

lazyLoadingFilter

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

lazyLoadingFilter

*.action

slide36

struts-cleanup

org.apache.struts2.dispatcher.ActionContextCleanUp

struts-cleanup

/*

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts

org.apache.struts2.dispatcher.FilterDispatcher

struts

/*

slide37
编写Action类:

继承com.opensymphony.xwork2.ActionSupport的ActionSupport类

声明以下变量

private MovieKindManager moviekindManager;//service的接口类set方法供Spring注入

private List mklist; //用于返回到视图的List

private MovieKind mk; //传递参数的实体类(由Hibernate生成了)

private Long kind_id; //用于具体取值的ID

与视图进行交互的数据要创建get、set方法来供Struts2进行操作

slide38
package com.action;

import java.util.List;

import com.model.MovieKind;

import com.opensymphony.xwork2.ActionSupport;

import com.service.MovieKindManager;

publicclass MovieKindAction extends ActionSupport

{

private MovieKindManager moviekindManager;

private List mklist;

private MovieKind mk;

private Long kind_id;

public String add(){

moviekindManager.addMovieKind(mk);

returnSUCCESS;

}

public String update(){

returnSUCCESS;

}

public String delete(){

moviekindManager.deleteMovieKind(kind_id);

returnSUCCESS;

}

public String init(){

this.mk=moviekindManager.getMovieKind(kind_id);

returnSUCCESS;

}

public String showmk(){

this.mklist=moviekindManager.showMovieKind();

returnSUCCESS;

}

}

slide39

listmk.action

listmk.jsp

注意:Action的class=“addmkBean”不是具体的类,只是一个名字,通过Spring

来对action进行对象的注入!通过名字与class=“addmkBean”来匹配!

method=“add“ 表示该配置处理的方法为add()

listmk.jsp 为返回的视图

  • 在struts.xml中配置Action
slide40

(bean id=“addmkBean“ 与struts.xml中配置的action的class=”addmkBean”来完成匹配

  • 配置applicationContext.xml:对action进行注入
slide41
编写视图层

addmk.jsp

请输入电影类别信息:

action=“addmk与struts.xml中配置的action匹配进行action处理(通过web.xml中的struts2的过滤器来寻找action)

name=“mk.name说明:mk为action类中声明的private MovieKind mk 实体类变量.name为MovieKind mk中实体类的属性,只要名字匹配了,Struts2自动的进行传值(通过默认拦截器)

slide42
listmk.jsp


value=“mklist为action返回的List变量mklist同样只要名字一样就可以匹配使用value=”name为遍历mklist中实体的具体属性

slide43
使用tx来配置事务时应先在xml文件头加上如下红色部分

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

">

  • 在applicationContext.xml中配置事务管理(aop法)
slide44
然后进行配置:

expression="execution(* com.service.*.*(..))"/>

slide45
(* com.service.*.*(..))中几个通配符的含义: 第一个 * 通配 任意返回值类型(注意后面要跟一个空格!) 第二个 * 通配 包com.service下的任意class 第三个 * 通配 包com.service下的任意class的任意方法 第四个 .. 通配 方法可以有0个或多个参数 综上:包com.service下的任意class的具有任意返回值类型、任意数目参数和任意名称的方法

到此,已完成Struts2+Hibernate+Spring的基本搭建

最后部署、测试、排错!

ad