复杂语境下Web动态页面分层重构方法研究∗

2017-12-18 06:21李深圳卓勤政
计算机与数字工程 2017年11期
关键词:细粒度约束条件页面

李深圳 严 悍 戴 楠 卓勤政

(南京理工大学计算机科学与工程学院 南京 210094)

复杂语境下Web动态页面分层重构方法研究∗

李深圳 严 悍 戴 楠 卓勤政

(南京理工大学计算机科学与工程学院 南京 210094)

针对复杂语境下Web语境敏感页面的页面冗余问题,论文分析了传统设计中页面设计及在动态控制方面的不足,基于COP提出一种动态的基于语境为中心的层槽页面(LSP,Layer-Slot Page)语法,给出LSP页面实现原理。通过自定义语境表现层标签实现动态页面中语境约束的细粒度描述,并驱动Drools规则引擎计算规则文件,激活LSP分层信息。最后通过实例验证该重构方案安全有效,具备语境变化的动态适应能力,支持细粒度的安全访问控制。

语境敏感;LSP;Web重构;访问控制

1 引言

在Web工作流系统中,随着软件的不断演化,页面动态性要求逐渐提高,使得业务逻辑判断大量扩散至Web页面中。在这种以页面元素为中心的传统设计方法中,密集而复杂的语境条件作用于多个页面元素中,使得表现层的语境描述低效而极易出错,同时语境信息散落在多个页面中,导致元素及其语境约束条件大量冗余。

为了解决这一问题,本文尝试基于已有的页面元素标签语法基础上,引入COP(Context-Oriented Programming)[1]中的分层变化,提取动态页面中的细粒度语境约束,通过Drools规则引擎[2]和自定义语境表现层标签,驱动规则引擎执行语境约束条件,实现一种基于定制标签的动态页面分层重构方案。

2 问题分析

目前的Web页面设计方案中,大多仍然采用面向以元素为中心的页面设计方式,对一个受控元素需将所有相关条件完整描述,并描述各种条件所对应的不同变化,这导致页面上相同或相似的约束条件散落在多个元素之上。

不同于普通业务代码,Web动态页面中的语境约束着业务无关的页面元素,导致语境约束和元素紧耦合在一起,而元素可能出现在页面不同的位置,文献[3]中称之为语境敏感。传统的JSP/Struts2与后台业务处理共同协作计算语境约束,虽然可以实现页面元素的动态控制,但是具有以下几个问题:

1)元素冗余。不同语境条件作用于同一页面元素甚至页面,将会导致页面元素在不同位置多次出现。

2)语境约束的计算冗余。由于页面设计以元素为中心,当同一语境作用于不同位置的元素时,语境约束的计算将会重复。对于递进式的语境约束,传统方式常常难以有效利用前序语境结果。

3)语境约束与业务逻辑耦合。当发生语境约束变更时,需要同时修改页面和服务器端代码文件并重启服务器才能使更改生效。

4)难以维持访问控制策略的一致性。在语境条件约束下,受控元素遵从细粒度的主动式访问控制[4]策略实现。多角色在同一页面的共存,显著提高了语境约束的复杂度,将难以确保不同角色在正确的权限范围内访问系统。

同时EVP原则[5]要求良性系统封装可变性,将语境条件分离并独立封装。因此本文在已有的页面元素标签语法基础上,引入COP编程风格,借助于自定义标签提取动态页面中的语境约束,进行独立封装并细粒度描述,驱动Drools执行引擎计算语境约束条件,实现一种基于定制语境标签的动态页面分层重构方案。

3 语境分析与层槽页面

3.1 面向语境编程

Context-Oriented Programming基于语境为中心,执行器根据语境动态地改变对象行为,实现语境化的模块结构,解决复杂语境下不断变化导致难以维护的问题。目前,最具代表性的COP语言(如:ContextL[6],ContextS[7],ContextJ[8]),普遍采用以层-槽结构描述行为变化的方式,在运行时根据语境条件激活相应的层,使层的变化作用于对象行为,最后执行该对象行为,具体的分为行为变化(Behavioral variations)、层(Layers)、激活(Activation)、语境(Context)、作用范围(Scope)五个特性[1]。 图1描述了COP语言的基本实现原理。

3.2 层槽页面(LSP)

基于COP编程模型,本文实现一种动态的基于语境的层槽页面(LSP,Layer-Slot Page),层槽页面结构由共有元素和层槽信息组成。引入层槽结构将传统的以元素为中心转变为以语境条件为中心,使具有相同语境约束条件的元素变化封装到同一层中,不同语境约束条件封装在不同层,运行时根据语境条件激活不同的层级变化。

图1 语境分层激活示意图

1)层(Layer)用来表示特定语境条件下多个共有元素的行为变化,一旦激活其将被作用于共有元素,一个层中通常包含多个槽(Slot)。层在本文页面设计中的定义如下:

<c:level constraints=“constraint 1,constraint 2,…”>

<li>E,P1=V1,P2=V2,…</li>

……</c:level>

2)槽(Slot)表示一个或一类元素的一组变化。采用变长三元组<E,P,V>来描述一个槽结构,具体含义如下:

E:表示页面元素Element,即变化所作用的元素。共有元素中的某个元素的标识id或class(以class:开头表示指定标识为class属性),用于确定要发生变化的一个或一组元素。

P:表示属性Property,即元素E的某个属性名。例如,按钮有value属性和disabled等属性。

V:表示属性值Value,一个值,可以是单值或多值,表示增加或修改元素性质的结果。例如按钮的class属性值可以是“class1”,也可以是“class1 class2”。也可以为NULL,表示删除当前属性。

一个槽可描述一个元素的一个或多个属性的增加或修改,但应避免同一层下多个槽对同一元素的同一属性进行改变。例如同时需要在class为button1按钮上的value属性和disabled属性上变化,应表示如下:

<li>class:button1,

value=click me,disabled=disabled</li>

3)根据上述层槽原理,LSP页面分层实施组件部分采用客户端实现,对激活槽的行为变化进行解释并实施,算法原理如下:

ACTIVATION-ALGORITHM

1 for each layer:L

2 for each slot:<E,P1=V1,…,Pi=Vi,…>

3 for each variation:<E,Pi=Vi>

4 if Vi==NULL

5 E.Pi=NULL;

6 else

7 E.Pi=Vi;

8 end if

9 end for

10 end for

11 remove layer L description

12 end for

实施组件的作用过程在共有页面元素渲染完之后,以及所有页面资源加载完之前进行。变化实施组件采用 JavaScript[9]语言编程实现。

4 Web语境标签驱动分层框架

基于Drools规则引擎收集语境信息,实现语境约束在规则文件中的可配置化,依据细粒度的语境执行结果激活不同的层,其实现原理如图2。

图2 基于Drools驱动的页面分层示意图

4.1 规则计算

Drools是一个基于Java的业务逻辑计算引擎,通常将复杂的业务逻辑封装在后缀名为drl的规则文件中,规则文件是纯文本文件,支持运行时动态修改,Drools支持数据传递,实现语境敏感的逻辑计算,并且作为结果返回,该数据对象通常被称作Fact[10]。

本文规则引擎由定制标签context的标签处理方法驱动,并执行规则文件。规则文件在运行时可以按需动态执行,因此采用规则文件封装语境变化,可以支持语境的动态配置,而无需重启服务器。

规则文件中规则一般按优先级别顺序执行,但是前后规则之间仍然存在多种关系,包括:

1)递进:前序规则的执行条件是后序规则执行条件的必要条件;

2)制约:前序规则的执行结果影响后序规则的执行条件;

3)互斥:前序规则的执行条件与后序规则的执行条件互斥。

规则与动态页面中的语境约束条件具备同质性,往往一个语境约束行为可以描述为一个规则,而规则名称采用自然语言命名。为了支持语境约束的细粒度描述,并且保持与规则文件的一致性,本文约定在动态页面中采用一个词汇命名一个语境约束单元,并为之实现一个同名规则。于是语境约束的计算可以实现规则文件配置化处理,同时规则计算方式消除了冗余的语境约束条件。

4.2 定制标签及标签处理

本文采用两种自定义语境标签用于驱动规则引擎的执行,实现层槽信息的动态渲染,同时该框架实现包含定制标签、标签处理类、规则计算模块、Fact语境对象和结果缓存。Web语境标签驱动分层原理如图3所示。

图3 Web语境标签驱动分层框架

其中,语境计算标签context作为level标签的父标签,定义了ruleFiles属性用于指定待执行规则文件,多个规则文件之间以逗号分隔。context标签在后台标签处理方法中驱动执行引擎,并将执行结果保存在当前请求下的结果缓存中。level标签通过指定constraints属性,查询当前层的细粒度语境约束结果,并控制层槽信息的动态生成。细粒度语境约束的描述可以采用规则文件名形式,以“!”符号取反,“,”表示细粒度语境约束间的逻辑与关系。假设标签前缀为c,则上述定制标签的具体使用语法如下:

<c:context ruleFiles=“file1.drl,file2.drl,…”>

<c:level constraints=“rule1,rule2,…”>

<li>E,P1=V1,…,Pi=Vi,…</li>

</c:level>

</c:context>

标签处理过程中,规则文件的执行往往需要传入一些当前请求下的语境信息,这些信息定义以<key,value>键值对形式封装在 ContextBean对象中,ContextBean对象作为Fact对象传入规则引擎的执行内存,并以RequestCache对象作为结果缓存,记录最终执行结果。

5 实例与分析

在线派工服务系统是一个在线医疗养老服务平台,目的是为线下医疗服务机构提供在线服务解决方案,是一个多角色多状态复杂Web系统,由客户、医疗机构管理员和医疗服务人员共同完成派工服务,系统中将一次派工服务的基本凭证定义为派工单。

5.1 应用

在线医疗派工服务系统,提供了对派工单的在线协同处理。该流程需要客户、医疗机构管理员以及医疗服务人员协作完成。一个派工单处理页面中尾部有一个处理按钮,针对派工单的不同阶段,分别对应不同的操作。具体的操作条件分别为

1)未派工。客户提交服务请求后,机构管理员可以看见未处理的服务请求信息,按钮状态应为“派工”。

2)已派工。机构管理员对一个订单执行派工操作后,服务人员将可以看见更新后的订单信息,按钮状态应为“接单”。

3)待确认。服务人员接受派工服务,当前订单即更新为待确认状态,等待客户处理,按钮状态应为“确认”。

一个标准派工单服务活动如图4所示。

图4 订单服务活动图

上述派工单服务流程,每一个订单的服务状态下都蕴含一个复杂语境约束,在现行页面方案中,多数仍采用多页面多元素方式处理,所以至少需要“派工”、“接单”、“确认”三个按钮协作完成本次流程。本文采用LSP客户端页面,针对上述流程仅需采用同一页面,设计一个共有按钮元素,然后在语境约束满足情况下,实施组件激活对该元素进行的渲染。共有按钮设计如下:

<input id=“confirmBtn ”type=“button”/>

动态LSP页面要求运行时激活层级变化,需要使用context标签和level标签,描述并驱动语境约束执行,本文将语境进行细粒度描述,并在规则文件中定义对应的规则。

<c:context ruleFiles=“authority.drl,orderFlow.drl”>

<c:level constraints=“admin,!dispatched”>

<li>confirmBtn,value=派工</li>

</c:level>

<c:level constraints=“servant,dispatched,!solved”>

<li>confirmBtn,value=接单</li>

</c:level>

<c:level constraints=“client,solved ,!confirmed ”>

<li>confirmBtn,value=确认</li>

</c:level>

</c:context>

其中两个规则文件authority.drl,orderFlow.drl分别对应角色访问控制规则和订单状态规则,其中角色访问控制规则用于判定客户角色对当前操作的有效性,定义了ADMIN,SERVANT,CLIENT三个规则。其中ADMIN规则如下:

rule“ADMIN”

when

$contextBean :ContextBean()

eval(roleValidation($contextBean))

then

ServletRequest request

=(ServletRequest)$contextBean.get(“request”);

RequestCache resultCache=(RequestCache)

request.getAttribute(“resultCache”);

resultCache.put(“admin”,Boolean.TRUE);

end

规则计算完成后,level标签处理方法便可以依据结果缓存中的admin属性判定“admin”约束是否成立。

订单状态规则中定义了dispatched,accepted,confirmed三个规则,对应请求单的状态判断。其中

dispatched规则描述如下:

rule“DISPATCHED”

when

$contextBean :ContextBean()

eval(getRequest($contextBean)

.getDispatchTime()!=null)

then

ServletRequest request

=(ServletRequest)$contextBean.get(“request”);

RequestCache resultCache=(RequestCache)

request.getAttribute(“resultCache”);

resultCache.put(“dispatched”,Boolean.TRUE);

end

依据这些规则计算,最终level标签处理可以动态控制层级信息,实现按钮状态与语境约束间的一致性,减少了按钮元素的冗余,同时采用独立的规则文件分离了语境约束,实现复杂语境下的语境约束和页面元素的低冗余重构。

5.2 分析与比较

本文基于COP编程思想,实现动态页面的一种分层重构方案。本方案适用于Web语境敏感页面,支持复杂语境约束的细粒度描述,支持动态配置。

与传统的Jsp/Struts2页面比较,本文所提方案具有以下特点:

1)封装变化与可扩展。重构后,将Web敏感页面中的以元素为中心转移到以语境约束为中心,封装语境条件的同时,消除由语境约束变化造成的页面元素冗余。

2)语境约束松耦合。语境约束条件不断变化,并且相互之间存在紧耦合的依赖关系,本文将语境约束细粒度描述,并采用规则式组织,使得各LSP层间的语境约束松耦和,编写LSP层时,仅依赖于当前层所受语境约束。

3)访问控制策略分离。采用Drools规则文件组织语境约束条件,易于实现访问控制级别的语境约束共享,如建立一个authority.drl,其中定义了各类角色规则。当实施元素级别的细粒度访问控制时,仅需配置authority.drl文件中的相应角色的规则信息。易于维持访问控制策略的一致性,确保系统安全性。

6 结语

针对复杂的语境敏感的Web页面,本文基于COP中的分层变化编程思想,提取动态页面中的细粒度语境约束,通过Drools规则引擎和自定义语境表现层标签,驱动规则引擎执行语境约束条件,实现一种基于定制语境标签的动态页面分层重构方案。该方案将散布在页面中的语境约束条件转移到规则文件中描述,支持语境变化的动态可配置,支持细粒度控制元素变化,同时在页面中以语境约束为中心,激活LSP层槽变化,消除页面元素及语境约束冗余。

本文方法适用于复杂Web语境敏感的页面,包括:1)语境约束条件密集繁复;2)语境约束与业务逻辑代码耦合;3)需要大量元素级别的访问控制。

[1]Hirschfeld R,Costanza P,Nierstrasz O.Context-oriented Programming[J].Journal of Object Technology,2015,7(3):125-151.

[2]Proctor M,Neale M,Lin P,et al.Drools documentation[EB/OL].http://www.drools.org/learn/documentation.html,2015-12-10.

[3]Gregory D.Towards a better understanding of context and context-awareness[J].Handheld and ubiquitous Computing.Berlin:Springer,2000:304-307.

[4]蒋明辉.基于动态语境实现主动式Web访问控制[D].南京:南京理工大学,2012:17-23.JIANG Minghui.The Implementation of Active Access Control based on Dynamic Context[D].Nanjing:Nanjing University of Science&Technology,2012:17-23.

[5]Meyer B.Object-oriented software construction[M].London:Prentice Hall,1988:53-64.

[6]Costanza P,Hirschfeldb R.Reflective layer activation in ContextL[J].Springer Verlag,2007:1280-1285.

[7]Hirschfeld R.Aspects-aspect-oriented programming with squeak[M].Objects,Components,Architectures,Services,and Applications for a Networked World.Springer Berlin Heidelberg,2003:216-232.

[8]Appeltauer M,Hirschfeld R,Haupt M,et al.ContextJ:Context-oriented programming with Java[J].Information and Media Technologies,2011,6(2):399-419.

[9]Keith J,Sambells J.DOM Scripting:Web Design with JavaScript and the Document Object Model[M].Apress,2010:7-44.

[10]Browne P.Drools JBoss rules 5.X developer's guide[M].Packt Publishing,2013:79-97.

Research on Refactoring Method of Web Dynamic Page Based on Complex Context

LI Shenzhen YAN Han DAI Nan ZHUO qinzheng
(School of Computer Science&Engineering,Nanjing University of Science&Technology,Nanjing 210094)

Considering complex context,for the problem of page redundancy in Web context-aware page,the traditional method of page design and the deficiency in dynamic control is analysed in this paper,and the COP as a reference to propose a dynamic Layer-Slot page syntax which is centered on context is taken,while given the working principle.Through the definition of the presentation layer label correlated with context,the context constraint fine-grained access control in dynamic page is achieved,then it drives the Drools engine to compute rule files and activate the LSP layer information.Finally,the security and efficiency of the refactoring method is validated,which has the ability to adapt with the changeable context and provides the fine-grained security access control.

context-aware,LSP,Web refactoring,access control

TP311

10.3969/j.issn.1672-9722.2017.11.029

Class Number TP311

2017年5月9日,

2017年6月11日

李深圳,男,硕士,研究方向:软件工程与应用。严悍,男,博士,副教授,研究方向:信息安全与软件工程。

戴楠,男,硕士,研究方向:软件工程与应用。卓勤政,男,硕士,研究方向:软件工程与应用。

猜你喜欢
细粒度约束条件页面
地下汽车检测站建设的约束条件分析
刷新生活的页面
答案
让Word同时拥有横向页和纵向页
基于SVM多分类的超分辨图像细粒度分类方法
基于型号装备?角色的IETM访问控制研究
基于web粒度可配的编辑锁设计
用“约束条件法”和“公式法”求二阶线性微分方程的特解
基于文本挖掘的微博文本情绪分析技术研究