array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Struts+Spring+Hibernate配置及应用 - 爱码网

Struts+Spring+Hibernate配置及应用

1前言

Struts,SpringHibernate是目前JAVA企业级开发最流行的开源框架,俗称为SSH框架。本文旨在介绍如何将三个框架整合起来,以满足企业级开发应用。

本框架采用的版本如下:

Struts: 1.2

Spring2.5.5

Hibernate3.3.1

2体系架构

2.1 SSH

Struts+Spring+Hibernate配置及应用

1 集成ssh框架系统架构图

从上图可见,我们的系统架构分成了四层:表示层、业务逻辑层、数据持久层、域模型层。

2.2包分析

在软件架构设计中,软件的层用包来描述,层之间的关系表现为包之间的关系。因此我们将系统划分为如下几个包:

Struts+Spring+Hibernate配置及应用

2 包结构图

上图中显示的包和层之间的对应关系如下:

接口包

实现包

表现层

cn.ittrain.myproject.action

业务逻辑层

cn.ittrain.myproject.service

cn.ittrain.myproject.service.impl

数据持久层

cn.ittrain.myprojject.dao

cn.ittrain.myprojject.dao.impl

域模型层

cn.ittrain.myproject.domain

对业务逻辑层和数据持久层,为什么要分别有接口包和实现包?我们先来弄清楚所谓的依赖关系。如果A层调用B层的功能,那么我们说A层依赖于B层。反过来如果B层也调用A层的功能,那么我们说B层依赖于A层。可以想象,如果AB层互相依赖的话,那么我们的程序将是强耦合的,即各个部分关联在一起,牵一发而动全身,显然是很糟糕的设计。因此在软件设计中,我们一般将层设计为单向依赖。A层依赖于B层,但B层不依赖于A层。由于层和包有对应关系,因此包和包之间也存在着类似的依赖关系。在图2中,包的依赖关系是通过虚线箭头来表示的,箭头所在包为被依赖包。

在业务逻辑层,我们定义了两个包:serviceservice.impl。从图中可以看出,action包依赖与service包,但不依赖于service.impl包,这在传统的架构中是不可能的。service包中是接口,service.impl包中是service包中接口的实现,action包不依赖于service.impl包,就意味着不会调用其中的类的方法,这显然是不可能的。而之所以可能是因为Spring的存在,service.impl包中的对象由Spring容器生成并注入到action包中的对象中,因此action包可以不依赖于service.impl包,而只是依赖于service接口包。如果我们修改service.impl包中的实现,action包不受影响。可见Spring依赖注入的思想极大地松散了我们的程序结构。

2.3对象分析

我们已经知道了包之间的依赖关系。但我们还要弄清楚包中的类和它所依赖的包中的类之间的关系。下图显示了包中的对象之间的关联关系以及多重性关系。

Struts+Spring+Hibernate配置及应用

3 系统对象关系图

一个Action对象(即Action包中产生的对象)依赖于一个Service对象(Service对象是由Spring注入的bean)。一个Service对象依赖于多个DAO对象(DAO对象是由Spring注入的bean)

一个ActionServiceDAO对象依赖于多个Domain对象。所以我们在做项目的时候应该将复杂的业务逻辑封装在Service中。下图是一个典型的对象调用的例子:

Struts+Spring+Hibernate配置及应用

4 系统对象协作图

上图中的数字表示对象调用顺序。图中一个Action对象调用一个Service对象,一个Servvice对象调用两个DAO对象:DAO1DAO2DAO1DAO2分别调用Domain对象。

3配置Spring

3.1MyEclipse配置Spring

1. 生成Web工程。

2. 选中工程,点击右键,弹出菜单,选择MyEclipse->Add Spring Capabilities

3. 根据向导选定Spring的版本。

4. 生成Spring的缺省配置文件applicationContext.xml,该文件缺省生成在src目录下,也可以修改成其它目录,如目录WEB-INF

3.2更新Spring的库

MyEclipse中配置好Spring后,MyEclipse将把Spring的库拷贝到工程中。在MyEclipse提供的Spring库是按模块区分的,我们可以将最新的Spring 2.5.5的库整合后替代MyEclipse提供的库,下面的四个库文件基本上涵盖了所有Spring的功能。

spring-2.5.5.jar

aspectjrt-1.6.0.jar

aspectweaver-1.6.0.jar

spring-webmvc-struts-2.5.5.jar

3.3配置Spring容器监听器

web应用程序中,Spring容器不会自动生成,而必须由web服务器通过web监听器来生成。该监听器读取Spring配置文件,然后生成Spring容器。监听器的配置如下:

<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

因为监听器是通过WebApplicationContext去读取配置文件applicationContext.xml,因此配置文件应该存放在WEB-INF目录下。如果配置文件存放在其它目录,例如存放在src目录下,那么应该在web.xml文件中指定配置文件的存放路径。

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath*:applicationContext.xml</param-value>

</context-param>

3.4生成多个Spring配置文件

在实际应用中为了实现分层管理,我们可以将Spring的配置文件切分为多个(将applicationContext.xml复制然后改名即可)。例如我们生成了四个配置文件:

配置文件名

存放路径

作用

applicationContext-common.xml

WEB-INF

SessionFactoryTransaction

applicaitonContext-action.xml

WEB-INF

Struts action bean

applicationContext-service.xml

WEB-INF

Service bean

applicationContext-dao.xml

WEB-INF

DAO bean

将配置文件切分为四个的目的是为了使我们的程序更加清晰。

但是,生成上面的多个配置文件后,Spring不再能够识别它的配置文件,这是应该在web.xml中增加以下元素以告诉监听器查找并识别Spring的配置文件:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext-*.xml</param-value>

</context-param>

3.5修改.springBeans文件配置

.springBeans中增加以下配置:

<configs>

<config>WebRoot/WEB-INF/applicationContext-common.xml</config>

<config>WebRoot/WEB-INF/applicationContext-action.xml</config>

<config>WebRoot/WEB-INF/applicationContext-service.xml</config>

<config>WebRoot/WEB-INF/applicationContext-dao.xml</config>

</configs>

然后刷新工程。

4配置Struts

4.1为工程增加Struts框架

选中工程,点击右键,弹出菜单,选择MyEclipse->Add Struts Capabilities

4.2 Spring容器生成Action bean

Struts 1.2action对象是由Struts框架生成的,现在我们将action交由Spring容器来生成。

1. struts-config.xml文件中,增加以下元素:

<controller>

<set-property value="org.springframework.web.struts.DelegatingRequestProcessor"

property="processorClass"/>

</controller>

2. 通过struts 向导生成action后,在struts-config.xml文件中会自动添加以下元素:

<action-mappings >

<action path="/student" type="test.StudentAction" />

</action-mappings>

3. applicationContext-action.xml中配置相应的Action bean:

<bean name ="/student"

class="cn.ittrain.myproject.action.StudentAction"/>

每当生成一个action后,都必须在application-action.xml文件中增加一个bean的配置。

5配置Hibernate

5.1增加Hibernate框架

选中工程,点击右键,弹出菜单,选择MyEclipse->Add Hibernate Capabilities

l Define Hibernate and Spring configuration details界面,

选定用于配置session factory的配置文件,从列表框中选取application-common.xml

输入SessionFactory Id: sessionFactory

l Specify Hibernate database connection details界面选定Use JNDI DataSource

DataSource:jdbc/mysql

Username:root

Password:root

Dialect:MySQL

l Define SessionFactory properties界面,不要在Create SessionFactory Class前面打勾,即不要创建SessionFactory Class

6 Hibernate反向工程

1. 生成POJO

数据库中的表对应于POJO类,表中的列对应与类中的属性,表中的一条记录对应一个对象

相关文章: