当前位置:文档之家› Delphi 通过MSHTML实现一个HTML解析类

Delphi 通过MSHTML实现一个HTML解析类

Delphi 通过MSHTML实现一个HTML解析类
Delphi 通过MSHTML实现一个HTML解析类

Delphi 通过MSHTML实现一个HTML解析类

Delphi 通过MSHTML实现一个HTML解析类分类:Delphi编程

2010-01-05 09:14

400人阅读

评论(7)

收藏

举报

最近经常会模拟网页提交返回网页源码,然后获得网页中相应的元素,于是需要常常解析Html中相应的各种元素,网络是个好东西,搜索一番,就找到了

好几个Delphi版本的HtmlParser的类库,试着使用了几个,发现解析起来都不完整,或多或少的回出现一些问题!于是想到了如果界面上有一个浏

览器,我们可以通过WebBrowser的Document接口对网页元素进行操作,很是方便!但是模拟网页提交,界面上是不一定要出现

WebBrowser的,肯定有办法,不通过WebBrowser就直接

解析HTML的,那便是我不要WebBrowser这个外壳,只要他里面的

Document文档接口对象就能实现对Html的解析了,查找了一番MSDN,然后Google一下,果然可行,构建方法如下://创建

IHTMLDocument2接口

CoCreateInstance(CLASS_HTMLDocument, nil, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, FHtmlDoc);

接口创建好了之后就能够对文

档元素进行解析了,很是爽快!

结合了我自己的特有操作,我对Combobox,Table,Frame等一些网页元素做了相应的封装,实现

了一个HTMLParser,大致代码如下:

这里只给出声明,代

码请在最后下载

代码

(*

****************************************************

*)(*

得闲工作

*)(*

网页元素操作

类库

*)(*

*)(*

DxHtmlElement Unit

*)(*

Copyright(c) 2008-2010 不得

*)(*

email:appleak46@https://www.doczj.com/doc/4f17906471.html, QQ:75492895 *)(*

****************************************************

*)unit

DxHtmlElement;interfaceuses

Windows,sysUtils,Clipbrd,MSHTML,ActiveX,OleCtrls,Grap hics,TypInfo;{

Get EleMent Type

}function

IsSelectElement(eleElement: IHTMLElement): Boolean;function

IsPwdElement(eleElement: IHTMLElement): Boolean;function

IsTextElement(element: IHTMLElement):

boolean;function

IsTableElement(element: IHTMLElement):

Boolean;function

IsElementCollection(element: IHTMLElement): Boolean;function

IsChkElement(element: IHTMLElement):

boolean;function

IsRadioBtnElement(element: IHTMLElement): boolean;function

IsMemoElement(element: IHTMLElement):

boolean;function

IsFormElement(element: IHTMLElement):

boolean;function

IsIMGElement(element: IHTMLElement):

boolean;function

IsInIMGElement(element: IHTMLElement):

boolean;function

IsLabelElement(element: IHTMLElement):

boolean;function

IsLinkElement(element: IHTMLElement):

boolean;function

IsListElement(element: IHTMLElement): boolean;function IsControlElement(element: IHTMLElement):

boolean;function

IsObjectElement(element: IHTMLElement):

boolean;function

IsFrameElement(element: IHTMLElement):

boolean;function

IsInPutBtnElement(element: IHTMLElement): boolean;function

IsInHiddenElement(element: IHTMLElement): boolean;function

IsSubmitElement(element: IHTMLElement): boolean;{ Get ImgElement Data

}function

GetPicIndex(doc: IHTMLDocument2; Src:

string

; Alt:

string

): Integer;function

GetPicElement(doc: IHTMLDocument2;imgName: string

;src:

string

;Alt:

string

): IHTMLImgElement;function

GetRegCodePic(doc: IHTMLDocument2;ImgName: string

; Src:

string

; Alt:

string

): TPicture;

overload

;function

GetRegCodePic(doc: IHTMLDocument2;Index: integer):

TPicture;

overload

;function

GetRegCodePic(doc: IHTMLDocument2;element: IHTMLIMGElement): TPicture;

overload

;type TObjectFromLResult

=

function

(LRESULT: lResult;

const

IID: TIID; WPARAM: wParam;

out

pObject): HRESULT;

stdcall

;

TEleMentType

=

(ELE_UNKNOW,ELE_TEXT,ELE_PWD,ELE_SELECT,EL

E_CHECKBOX,ELE_RADIOBTN,ELE_MEMO,ELE_FOR M,ELE_IMAGE,

ELE_LABEL,ELE_LINK,ELE_LIST,ELE_CONTROL,ELE_ OBJECT,ELE_FRAME,ELE_INPUTBTN,ELE_INIMAGE,E LE_INHIDDEN);function

GetElementType(element: IHTMLELEMENT): TEleMentType;function

GetElementTypeName(element: IHTMLELEMENT): string

;function

GetHtmlTableCell(aTable: IHTMLTable;aRow,aCol: Integer): IHTMLElement;function

GetHtmlTable(aDoc: IHTMLDocument2; aIndex: Integer): IHTMLTable;function GetWebBrowserHtmlTableCellText(Doc: IHTMLDocument2;

const

TableIndex, RowIndex, ColIndex: Integer;

var

ResValue:

string

): Boolean;function

GetHtmlTableRowHtml(aTable: IHTMLTable; aRow: Integer): IHTMLElement;function GetWebBrowserHtmlTableCellHtml(Doc: IHTMLDocument2;

const

TableIndex,RowIndex,ColIndex: Integer;

var

ResValue:

string

): Boolean;function

GeHtmlTableHtml(aTable: IHTMLTable; aRow: Integer): IHTMLElement;function GetWebBrowserHtmlTableHtml(Doc: IHTMLDocument2;

const

TableIndex,RowIndex: Integer;

var

ResValue:

string

): Boolean;type TDxWebFrameCollection

=

class

;

TDxWebElementCollection

=

class

;

TLoadState

=

(Doc_Loading,Doc_Completed,Doc_Invalidate); TDxWebFrame

=

private FFrame: IHTMLWINDOW2;

FElementCollections: TDxWebElementCollection;

FWebFrameCollections: TDxWebFrameCollection;

function

GetSrc:

string

;

function

GetElementCount: integer;

function

GetWebFrameCollections: TDxWebFrameCollection;

GetElementCollections: TDxWebElementCollection;

function

GetDocument: IHTMLDOCUMENT2;

function

GetReadState: TLoadState;

function

GetIsLoaded: boolean;

procedure

SetFrame(

const

Value: IHTMLWINDOW2);

GetName:

string

;

public Constructor Create(IFrame: IHTMLWINDOW2);

Destructor Destroy;

override

;

property

Frame: IHTMLWINDOW2

read

FFrame

write

SetFrame;

property

Src:

string

read

GetSrc;

property

Document: IHTMLDOCUMENT2 read

GetDocument;

property

Name:

string

read

GetName;

property

Frames: TDxWebFrameCollection

read

GetWebFrameCollections;

property

ElementCount: integer

read

GetElementCount;

property

ElementCollections: TDxWebElementCollection read

GetElementCollections;

property

ReadyState: TLoadState

read

GetReadState;

property

IsLoaded: boolean

read

GetIsLoaded;

end

; TDxWebFrameCollection

=

Class

private FFrameCollection: IHTMLFramesCollection2;

Frame: TDxWebFrame;

function

GetCount: integer;

function

GetFrameInterfaceByIndex(index: integer): IHTMLWINDOW2;

function

GetFrameInterfaceByName(Name:

string

): IHTMLWINDOW2;

function

GetFrameByIndex(index: integer): TDxWebFrame;

function

GetFrameByName(Name:

string

): TDxWebFrame;

procedure

SetFrameCollection(

const

Value: IHTMLFramesCollection2);

public Constructor Create(ACollection: IHTMLFramesCollection2);

Destructor Destroy;

override

;

property

FrameCollection: IHTMLFramesCollection2 read

FFrameCollection

write

SetFrameCollection;

property

Count: integer

read

GetCount;

property

FrameInterfaceByIndex[index: integer]: IHTMLWINDOW2 read

GetFrameInterfaceByIndex;

property

FrameInterfaceByName[Name:

string

]: IHTMLWINDOW2

read

GetFrameInterfaceByName;

property

FrameByIndex[index: integer]: TDxWebFrame

read

GetFrameByIndex;

property

FrameByName[Name:

string

]: TDxWebFrame

read

GetFrameByName;

end

;

TDxWebElementCollection

=

class

private FCollection: IHTMLElementCollection;

FChildCollection: TDxWebElementCollection;

基于组件的嵌入式软件开发方法

基于组件的嵌入式软件开发方法研究 郑久寿 夏德天 何小亚 (中国航空计算技术研究所 十室 陕西 西安 710068) 摘 要: 为提高嵌入式系统软件的通用性和重用性,缩短同类软件的开发周期,从嵌入式系统的特点出发,提出一种基于可重用组件的嵌入式软件开发方法。首先介绍组件的基本概念,然后着重阐述嵌入式系统组件划分方法及设计具体组件接口的一般原则。最后通过对比传统嵌入式系统和基于组件的嵌入式系统软件开发方法的异同,提炼出基于组件的嵌入式软件开发方法的特点。具体项目实践证明该方法的可行性,具有良好的应用前景。 关键词: 嵌入式系统;软件重用;组件;接口设计 中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2012)1120094-02 EJB,COM/DCOM,ActiveX,Web Services等形式存在的可运行 0 引言 二进制程序,也包括经过封装的源代码程序。从广义上来说,目前嵌入式电子产品发展日新月异,更新换代很快,软件 随着对软件重用理解的不断深入,软件组件概念的外延在不断代码量和复杂度随着功能的复杂性呈几何级的增加。在这种情 扩展,从组件实体到规格需求、系统架构、设计文档、测试用况下,传统的基于先前基础代码进行二次开发变的愈发困难。 例等各种具有重用价值的软件资源都是组件的组成部分。 倘若原来程序员离去,其他人员或新手修改源程序则变的愈加 2 嵌入式系统组件架构 困难和不可控。另外由于绝大多数程序内部结构之间相互耦 合,即使只对源代码的很小一部分进行修改,为了保证产品的根据IEEE的定义,嵌入式系统是“控制、监视或者辅助装质量,也应该对整个产品的源代码进行回归测试。在这种开发置、机器和设备运行的装置”,从中可以看出嵌入式系统是软模式下,程序的可重用性低,整个产品的软件开发和测试周期件和硬件的综合体。另外由于嵌入式系统涉及的领域很广,各长,软件成本高。因此寻求一种新的可重用可扩展的软件开发个不同领域的应用往往差别很大。因此不同领域应该针对本领 方法是解决这些问题的根本途径。域特定应针对这些问题,本文从嵌入式软件开发的特点和需求出 发,提出了一种新的基于可重用组件的软件开发方法,并在实 践中取得了较好的效果。 1 组件概述 软件组件(Component)的概念共生于软件重用。早在 1968年,在北大西洋公约组织(NATO)会议上就提出了软件重 用的概念,后来还为此制定了一整套软件重用的指导性标准, 其中包含了利用标准组件实现软件重用的基本思路。也是在这 次会议上,Mcllroy提出了软件组件、组件工厂等概念[1]。 基于组件的软件重用是产品重用的主要形式,软件组件技 术是当前重用研究的焦点。组件技术的基本思想在于,创建和 利用可重用的软件组件来解决应用软件的开发问题。与面向对 象编程语言不同,组件技术是一种更高层次的对象技术。它独 立于语言,只面向应用程序,只规定组件的外在表现,而不关 心其实现方法。 目前关于组件还没有一个统一的定义,以下是关于组件的 一些有代表性的观点[2]: 1)组件是一个独立的可传递的操作的集合; 2)组件是由对象类组合起来的物理意义上的包; 3)组件是软件开发过程中一个可替换的软件单元,它封 装了设计决策,并作为一个大单元的一部分和其他组件组合起 来; 4)组件是具有特定功能,能够跨越进程的边界实现网 络、语言、应用程序、开发工具和操作系统的“即插即用”的 独立对象; 5)组件是指应用系统中可以明确辨识的构成成分。而可 重用组件是指具有相对独立的功能和可重用价值的组件。 关于组件的定义可以从狭义和广义两方面来理解。从狭义 上来说,软件组件是指软件系统中具有相对独立功能、可以明 确辨识、接口由契约指定、和语境有明显依赖关系、可独立部 署、且多由第三方提供的可组装的软件实体。它既包括以用来开发组件,应用组件构建自己的应用系统。开发 出来的组件可以在本领域的不同型号产品间广泛重用。本文选取温度控制器作为应用对象来进行说明基于组件的嵌入式软件开发方法。所谓的温度控制器简单来说就是在暖通系统中通过控制压缩机的开关来达到精确控制温度的装置。具体来说,温度控制器定期测量环境温度,通过其温度算法将环境温度和该时间段的设定温度进行对比决定何时应开启或关闭压缩机使环境温度能迅速而平缓的达到设定温度而又不会产生温度的过冲,始终给用户舒适的感受。用户在任何时候也可对实时时钟和各个不同的时间段的温度设置点进行编辑或设定,并使其应用到温度算法中。另外点式或段式显示屏可以给用户显示环境温度、设定温度、时钟信息、电源状态等信息。 组件是软件系统中具有相对独立功能的软件实体,合理的划分组件,有利于组件的复用和实现,以及系统的配置管理。组件粒度越大,其复用程度就越高,但实现和理解组件就相对困难,重用难度加大;粒度越小,组件越易于复用,但管理组件等代价将增大,甚至大于复用带来的好处。划分组件时应从功能模块的完整性、高内聚和低耦合性等方面出发。依据重用原则、闭包原则、单人组件原则、消息传递原则[3],将通用温控器组件划分如图1所示(虚线框内为可重用组件)。 图1 组件架构 3 嵌入式组件接口设计 组件划分后需要进行接口设计,它是组件设计的重要部分。一个组件接口是一组逻辑上相互关联的操作,这些操作定 义了某类公共行为。接口是一组操作的规范,而非任何特定的

各种系统框架图简介

各种系统框架图简介 以下文字和架构图均在本人相关系统设计和架构方案中有所应用。 原文出处:https://www.doczj.com/doc/4f17906471.html,/6517/viewspace-609654 1.Spring 架构图 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。这样的对象可以在不同J2EE 环境(Web或EJB )、独立应用程序、测试环境之间重用。 组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC )模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

?Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI 、EJB 、电子邮件、国际化、校验和调度功能。 ?Spring AOP :通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring 的应用程序 中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。 ?Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构 简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打 开和关闭连接)。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常 层次结构。 ?Spring ORM :Spring 框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO 、Hibernate 和iBatis SQL Map 。所有这些都遵从Spring 的通用事务和DAO 异常层次结构。 2.ibatis 架构图 ibatis 是一个基于Java的持久层框架。 iBATIS 提供的持久层框架包括SQL Maps 和Data Access Objects ( DAO ),同时还提供一个利用这个框架开发的 JPetStore 实例。

Java组件开发的一个概念框架

Java组件开发的一个概念框架 我先介绍几个在构建和设计解决方案来适应商业活动中的持续变化时需要注意的商业场景: ·公司需要将其文件仓库从文档文件转成网络文件。·公司需要更换其安全提供商。 ·因为经济情况的巨大的改变,保险公司必须扩展其保险流程政策到更大范围。一样东西是很确定的,需求更改就像商业和技术一样快速改变。但是对于所有改变,无论其大小,我们都需要抛弃原来整个系统重新开始么?这是不必要的—架构和设计解决方案时加入少许考虑,好的策略以及最优方法可以适应现有的体系结构的变更而不需要太多争辩。在面向对象编程以及分布式对象技术中,组件是类和接口的集合,通过可重用的外部API来满足需求(功能性的以及非功能性的)。组件应该可以在分布式网络环境运行来形成网络程序。基于组件的设计和开发对于遵循面向对象分析与设计(OOAD)的方法学的专家并不是新的话题。本文的目的是根据java的最优方法和最初开始一步一步地达到通用的概念模型来开发java组件。本文面向的读者需要具有Java,UML以及Java/J2EE设计模式的知识。这篇文章主要描述的范围是:·组件的基本性质。 ·如何利用Java设计最优方法(设计模式)来实现这些

Java组件设计的基本性质,并且形成一个概念上的基本组件开发框架, 这个框架将来可以方便地用于任何组件开发中的。组件的基本性质 ·为了让其他组件可以与之相互作用,组件必须有服务接口(API)。 ·组件必须有合适的生命周期机制(start, stop, initialize 等等) ·组件必须可以配置。 ·组件只有一个实例在企业程序中运行。 ·配置的改变应该是动态的(在运行中)。 ·组件必须有合适的第三方软件融入的机制。 ·组件必须有合适的处理错误机制如何实现基本的组件性质 组件必须有服务接口(API)无论我们是在一个类还是几个类中写100行到1000行的代码,最终劳动成果(类或者类的结合)提供一些基本的高级的服务。返回去想想,我们甚至可以在实现他们之前定义那些我们想要达到的基本的高级的服务。让我们举个来自保险界的例子,保险商在他每天做了以下的工作: ·检查保险申请。 ·收集并评估背景信息。 ·根据公司现有的规则计算保险金

微服务框架的设计与实现

微服务框架的设计与实现① 张晶1, 黄小锋2, 李春阳3 1(北京中电普华信息技术有限公司, 北京100192) 2(中国电建集团国际工程有限公司, 北京100048) 3(国网信息通信产业集团有限公司, 北京100031) 摘 要: 相对于传统单块架构, 微服务框架具有技术选型灵活, 独立部署, 按需独立扩展等优点, 更适合当前互联网时代需求. 但微服务架构的使用引入了新的问题, 如服务注册发现、服务容错等. 对微服务框架引入的问题进行分析, 并给出了微服务框架的一种实现方案, 在框架层面解决服务注册发现、服务容错等共性问题, 使业务系统开发人员专注于业务逻辑实现, 简化系统开发的难度, 提高开发效率. 关键词: 微服务框架; 服务注册; 服务发现; 服务容错 Design and Implementation of Microservice Architecture ZHANG Jing1, HUANG Xiao-Feng2, LI Chun-Yang3 1(Beijing China Power Information Technology Co. Ltd., Beijing 100192, China) 2(PowerChina International Group Limited, Beijing 100048, China) 3(State Grid Information & Telecommunication Industry Group Co. Ltd., Beijing 100031, China) Abstract: Compared with traditional single block architecture, microservice architecture has many advantages, such as flexible technology selection, independent deployment, and independent scalability more suitability for the current needs of the internet age, etc. But microservice architecture also introduces new problems such as service registration, service discovery, service fault tolerance. On the basis of the analysis for problems mentioned above, this paper proposes one implementation of microservice framework, which can solve service registration, service discovery, service fault tolerance and other common problems. Based on this, developers only need to focus on the development of business functions, so that it can simplify the difficulty of system development and improve development effectiveness. Key words: microservice architecture; service registration; service discover; fault tolerance 传统信息化系统的典型架构是单块架构(Monolithic Architecture), 即将应用程序的所有功能都打包成一个应用, 每个应用是最小的交付和部署单元, 应用部署后运行在同一进程中. 单块架构应用具有IDE友好、易于测试和部署等优势, 但是, 随着互联网的迅速发展, 单块架构临着越来越多的挑战, 主要表现在维护成本高、持续交付周期长、可伸缩性差等方面[1]. 微服务架构(Microservices)的出现以及在国内外的成功应用, 成为系统架构的一种新选择. 很多大型宝等都已经从传统单块架构迁移到微服务架构[2]. 微服务架构提倡将单块架构的应用划分成一组小的服务, 互联网公司如Twitter、Netflix、Amazon 、eBay、淘服务之间互相协调、互相配合, 为用户提供最终价值. 1 微服务架构 微服务架构是一种架构模式, 采用一组服务的方式来构建一个应用, 服务独立部署在不同的进程中, 不同服务通过一些轻量级交互机制来通信, 例如RPC、HTTP等, 服务可独立扩展伸缩, 每个服务定义了明确的边界, 不同的服务甚至可以采用不同的编程语言来实现, 由独立的团队来维护[3]. 相对于传统的单体应用架构, 微服务架构具有单个服务易于开发、理解和维护; 复杂度可控; 技术选 ①收稿时间:2016-09-18;收到修改稿时间:2016-11-03 [doi: 10.15888/https://www.doczj.com/doc/4f17906471.html,ki.csa.005796]

分布式服务框架Dubbo及相关组件集成

1.D ubbo介绍 1.1.简介 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。 Dubbo最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。 上图中,蓝色方块表示与业务有交互,绿色方块表示只对Dubbo内部交互。上述图所描述的调用流程如下: 1)服务提供方发布服务到服务注册中心; 2)服务消费方从服务注册中心订阅服务; 3)服务消费方调用已经注册的可用服务; 1.2.核心功能 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 1.3.Dubbo能做什么? 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API 侵入。 软负载均衡及容错机制:可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

系统架构设计框架简介

基于组件的架构 应用可以按组件划分,不用组件实现不同功能和逻辑,组件之间的接口规范有很好的定义。某些组件可以重用。 如果 有若干现成组件,比如以前系统的ActiveX组件或者.net的组件 应用程序足够简单而不需要分层的架构,通过调用这些组件就可完成大部分工作 不同语言开发的组件需要结合在一起,如https://www.doczj.com/doc/4f17906471.html,需要调用VB写的COM+的组件 应用程序需要支持插件技术,可以动态切换组件,例如用.net反射技术实现的插件技术 那么我们可以选择基于组件的架构。 分层Layered的架构 应用被划分成了堆叠在一起的若干层,每一层完成特定的服务和功能,与其上下层接口,各层之间是调用被调用的关系。在最上面的层只有调用下面的一层,在中间的层则兼有调用和被调用。在最下面的层则是仅供上面的层调用。通常划分成UI层,商务逻辑层,数据层等,并且通常多个层都部署在同一台服务器上。

如果 应用程序比较复杂,不同的功能需要不同的层来各司其职,如数据访问,商务逻辑,表现等。有比较复杂的商务逻辑和流程。 那么我们可以选择分层的架构。 Model,View,Controller(MVC)架构 用户交互的处理与UI显示分离 用户交互的处理和UI显示与数据分离

如果 要获得分离的UI视图和处理逻辑 要UI视图和处理逻辑与数据存储分离 3Tier/N Tier的架构 Tier可以译成排。以与Layer(层)有所区别。将应用程序划分成一系列的服务,包括UI, Business(商业逻辑),数据等服务。各Tier可部署在不同的服务器上。类似于分层(layer)的架构。通常分层(layer)不跨机器的边界,也即所有层(layer)都部署在一台服务器上。Tier 是要跨机器的边界。各Tier之间用预定义的通信协议来通信,如WCF,Web service,或者TCP/IP等。分层(layer)的各层(layer)之间的通信都是通过该编程语言的引用和调用来实现的。所以是有区别的。

各技术框架架构图

各种系统架构图及其简介 1.Spring 架构图 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring 框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。这样的对象可以在不同J2EE 环境(Web或EJB )、独立应用程序、测试环境之间重用。 组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: ?核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转(IOC )模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ?Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI 、EJB 、电子邮件、国际化、校验和调度功能。 ?Spring AOP :通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring 的应用程序中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。 ?Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。 ?Spring ORM :Spring 框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO 、Hibernate 和iBatis SQL Map 。所有这些都遵从Spring 的通用事务和DAO 异常层次结构。

(完整版)架构、框架、模式、构件、组件、中间件之间区别

1.什么是架构? 架构、框架、模式是一种从大到小的关系,也是一种组合关系。 架构一般针对一个行业或一类应用,是技术和应用完美的结合。 框架因为比较小,很多表现为中间件,框架一般是从技术角度解决同类问题,例如J 道数据增删改查框架就解决了所有数据库系统中大量数据增删改查的功能开发,框架是从技术的横切面去解决实际应用问题。 模式则更小了,越小越灵活,可重用的范围更广。 一个框架可能使用了多个模式,而一个架构有可能应用了多个框架,这样一个大型系统的设计基本从主骨干到骨架基本能够被设计者考虑设计到,也可以想见,一个系统被细化成了很多工作量,例如一个部分细化到工厂模式,那么就可以要求程序员实现工厂模式的代码即可。 由此,控制了大型软件质量,也提高开发效率,同时使得项目变得易于管理和协同,由此可见,一个大型项目的架构设计非常重要。 2.什么是框架? 框架即framework,是某种应用的半成品,一组组件,供你选用完成你自己的系统。 简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 3.什么是模式? 模式即pattern,就是解决某一类问题的方法论,解决某类问题的方法总结归纳到理论高度,那就是模式。 Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。 当一个领域逐渐成熟的时候,自然会出现很多模式。 4.什么是构件? 构件(component)是可复用的软件组成成份,可被用来构造其他软件。 它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等。 构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件,这不仅大大提高了软件开发者的开发效率,也大大提高了软件的质量。 5.什么是组建? 组件就是对象。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。组件是对数据和方法的简单封装。 C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象。 组件可以有自己的属性和方法,属性是组件数据的简单访问者,方法则是组件的一些简单而可见的功能。 组件是C++ Builder环境中最令人激动的部分。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。 VCL和CLX组件是C++ Builder系统的核心。

常见的十三种系统框架

最常用的系统框架都有哪些? OpenXava OpenXava是一个让使用XML与Java来开发J2EE商业应用程序变得简单的框架。它目前支持IBM WebSphere应用服务器,但在开发过程中可以使用 JBoss.OpenXava1.1版本支持以下特点: ◆支持WebSphere 5.0, 5.1和6.0, JBoss 3.2.x和4.0.x包括native EJB CMP2 EntityBeans ◆它已经被用在许多商业项目上 ◆易用,使用它可以获得高的开发效率 ◆灵活:可以在任意位置插入自己的功能。 ◆基于商业化组件的概念 ◆完全地MVC ◆使用有着成熟商业应用程序丰富特性的Web用户接口 ◆可生成整个J2EE应用程序 ◆它应用到的开源项目有:Ant, JUnit,JasperReports,TL,XDocLet,Hibernate 等 karma karma是一个轻量级并且易于使用的J2EE应用程序框架。当前它包含“COMMON”与“JCR”这两个组件。“COMMON”组件是整个框架的核心并且基于mvc模式。这个组件易于测试(提供mock对象供测试),很少的XML描述,易于学习因为它使用简单的POJO动作(actions),拦截器(interceptors)和过滤器(filters) 还提供对AJAX的支持。 “JCR”组件是一个持久层框架但它没有XML映射文件并能与其它web框架相结合如:Spring MVC框架。 Keel Framework Keel Framework是一个把专注于应用程序开发某方面(如:用户接口,数据库,消息,安全等等)的开源或商业的框架以插件的方式整合在一起的元框架。Keel围绕三种核心模式进行构建: 1.COP模式(Component Oriented Programming:面向组件编程)这就为应用程序提供了一个灵活的插件(plugging/unplugging)框架。 2.SOC模式(Separation of Concerns:关注分离)这允许用户执行/控制/修改任何组件的功能而不会影响到其它组件。 3.IOC模式(Inversion of Control:反转控制)。

架构,框架,模式,构件,组件,中间件之间区别

1.什么是架构? 架构、框架、模式是一种从大到小的关系,也是一种组合关系。 架构一般针对一个行业或一类应用,是技术和应用完美的结合。 框架因为比较小,很多表现为中间件,框架一般是从技术角度解决同类问题,例如J道数据增删改查框架就解决了所有数据库系统中大量数据增删改查的功能开发,框架是从技术的横切面去解决实际应用问题。 模式则更小了,越小越灵活,可重用的范围更广。 一个框架可能使用了多个模式,而一个架构有可能应用了多个框架,这样一个大型系统的设计基本从主骨干到骨架基本能够被设计者考虑设计到,也可以想见,一个系统被细化成了很多工作量,例如一个部分细化到工厂模式,那么就可以要求程序员实现工厂模式的代码即可。 由此,控制了大型软件质量,也提高开发效率,同时使得项目变得易于管理和协同,由此可见,一个大型项目的架构设计非常重要。 什么是框架? ?? 框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 什么是模式? 模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。 ? Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 ? 模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。 ? 什么是构件? 构件(component)是可复用的软件组成成份,可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等。构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件,这不仅大大提高了软件开发者的开发效率,也大大提高了软件的质量。

各种系统架构图及其简介

各种系统架构图及其简介 1.Spring架构图 Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。 组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: ?核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ?Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 ?Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提

供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将 声明性事务管理集成到应用程序中。 ?Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化 了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。 ?Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。 2.ibatis架构图 ibatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。 IBATIS:最大的优点是可以有效的控制sql发送的数目,提高数据层的执行效率!它需要程序员自己去写sql语句,不象hibernate那样是完全面向对象的,自动化的,ibatis是半自动化的,通过表和对象的映射以及手工书写的sql语句,能够实现比hibernate等更高的查询效率。

相关主题
文本预览
相关文档 最新文档