APP下载

一种基于Servlet的控制层软件框架设计

2017-04-13史梦安

软件导刊 2017年3期
关键词:设计模式实例容器

史梦安,马 壮

(淮安信息职业技术学院 计算机与通信工程学院,江苏 淮安 223003)

一种基于Servlet的控制层软件框架设计

史梦安,马 壮

(淮安信息职业技术学院 计算机与通信工程学院,江苏 淮安 223003)

使用“IOC模式”以及“单例模式”等设计思想设计了一种以Servlet作为Http请求入口的非侵入式控制层软件框架,通过Java反射技术建立了“IOC容器”并对其运行效率进行了研究。该框架可以针对不同请求,动态实例化控制器对象,实现控制反转和请求分发,从而有效降低模块间耦合,提升系统的可扩展性及开发效率。

Servlet;控制层软件框架;Java反射技术;IOC;非侵入式

0 引言

Servlet是Java编程语言的Web服务器端编程技术,运行在 Java-enabled Web Server 中。Servlet基于请求/响应模式提供Web服务,可针对不同请求作出不同响应,常作为MVC模式中的Control模块[1]进行请求的分发。Spring MVC、Struts等企业级应用开发框架即以Servlet为核心,但Spring MVC、Struts等框架几乎封装了一般Web项目涉及的所有领域:控制器、过滤器,甚至标签库。小型应用的开发可能只需要框架的请求分发功能,但必须搭建一个完整框架,令含小型应用的开发流程过于臃肿。本文设计了一种“轻量级”、非侵入式的基于Servlet的控制层软件框架,以降低小型应用开发难度,提高开发效率。

1 基于Servlet的请求分发

Servlet中定义有doGet()和doPost()两个处理请求的方法,即每个Servlet可以接收两个不同的Http请求,并将请求转发至相应的业务逻辑中进行处理。在业务逻辑稍微复杂、需要服务端同时处理多种请求时,Servlet功能的局限性便凸显出来。Servlet处理多种请求有两种方式:①建立多个Servlet;②传递参数。建立多个Servlet会提高代码冗余度和耦合度,降低功能内聚。传参方式只需一个Servlet,通过获取请求中传入的方法参数来配合逻辑分支语句。理论上一个Servlet可处理多个不同请求,如图1所示。

通过传参方式所实现的Servlet响应多请求,会导致代码冗余度高,耦合度提升,不利于团队开发,且系统灵活性和可扩展性差[2]。为降低耦合、提升系统性能,本文设计了一种基于Servlet的控制层软件框架,可提升开发效率。

图1 传参实现Servlet响应多请求

2 基于Servlet的控制层软件框架设计

基于请求/响应的传统开发模式是由Consumer(在Web应用中一般指代处理用户请求的线程)管理控制层和业务层对象之间的依赖关系,每次接受请求时都需要Consumer进行实例化对象,导致系统的耦合度高,性能低,可扩展性较差。可以使用“控制反转设计模式(IOC)”[3]对原有的技术框架进行改进,使用RESTful风格设计HTTP请求的URL,将需要访问的业务对象名和操作名融入URL路径。

2.1 “IOC容器”设计

“IOC”(控制反转)即反转依赖对象的获得过程[4]。通过建立“IOC容器”,使获取依赖对象的方式由传统的Consumer主动实例化对象,转变为Consumer向“IOC容器”申请对象。由“IOC容器”实例化依赖对象,可有效降低系统耦合。

“IOC容器”使用反射技术进行具体实现,本文基于“工厂设计模式”、结合Java反射技术建立“Method对象工厂”[5]作为“IOC容器”的核心。Consumer提交所需对象的类名和方法名,向“IOC容器”申请依赖对象,“IOC容器”控制“Method对象工厂”使用类名和方法名动态生成对象,并调用方法以实现具体业务逻辑(见图2),完成控制反转。

图2 IOC容器实现

以Servlet作为容器入口,接收到客户端Http请求而不作数据处理,可直接将请求转发至“IOC容器”[6]。该“IOC容器”可以有效接管Servlet的请求分发工作,削减系统耦合,提升系统的可扩展性。但类名和方法名参数采用GET方式传递时,会暴露系统架构,降低系统安全性。

2.2 URL路径设计

为提升系统的安全性和易用性,客户端不使用URL GET方式提交数据。使用RESTful风格设计HTTP请求的URL路径如下:

http://host:port/path/类名/方法名/参数1/参数2/...

“IOC容器”对请求RESTful风格的URL进行解析,根据解析出的两个资源名对应本次请求需调用的类名和方法名。为隐藏真实类名、提升反射性能,“IOC容器”使用HashMap表映射控制器的Class类结构对象。根据自定义类名,“IOC容器”从HashMap中获取对应的Class对象,通过Method对象工厂,动态获取类的带参构造器并传入HttpRequest和HttpResponse参数实例化对象,然后由容器调用相应的方法。系统通过“IOC容器”掌握对象的调用权,实现系统的控制反转,工作流程如图3所示。

图3 IOC容器工作流程

通过构建非侵入式的“IOC容器”,对Servlet转发的不同Http请求动态创建所需的对象和方法,解决了代码间的高耦合问题,有利于功能复用,提高了系统的可扩展性,便于团队开发。但Java反射技术所占用的大量计算机资源需进一步优化。

3 框架优化与改进

3.1 “对象缓存池”设计

当通过该框架实现系统控制层时,所有请求都由Method对象工厂通过Java反射技术分发至具体控制器[7],每个请求都会在Method对象工厂中通过newInstance()方法创建新对象,导致大量的计算机资源被Java反射机制占用。为提升系统性能、降低Java反射机制的资源消耗,可以设计一个“对象缓存池”缓存控制器对象,仅第一次调用该对象时会通过newInstance()方法实例化对象,之后调用都从“对象缓存池”中取用。

在使用“对象缓存池”时,每次Http请求对应不同的HttpRequest和HttpResponse,首次缓存对象时直接传入HttpRequest来实例化对象,会导致缓存池中Object对象的参数一成不变,导致程序陷入死循环。为解决这一问题,使用“单例设计模式”[8]封装Http请求,将Http对象作为参数代入构造器并实例化对象,此时Http作为形参传入的仅是对象的首地址,即可解决Request请求的更新问题。改进后的框架工作流程如图4所示。

图4 “对象缓存池”和Http单例对象

3.2 性能测试

实际测试硬件设备选用的CPU为:Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz,单核,内存2G。通过测试程序访问框架中的同一个控制器,测试结果取1 000次的平均值。

首次运行newInstance()创建对象时,缓存池为空,所以二者运行性能相近,此时对象存入缓存池时比直接使用newInstance()多出一个操作步骤,运行耗时略高(见图5,单位:ns)。

图5 首次运行NewInstance()耗时对比

在第一次创建对象后,若使用之前已创建过的对象,可直接从“缓存”中读取,使用newInstance()创建对象和使用“缓存池”缓存对象两种方式耗时相差一个数量级,使用缓存时效率平均提升了23.8倍(见图6,单位:ns)。

4 结语

本文首先基于“控制反转设计模式(IOC)”设计了“IOC容器”,使用Java反射技术建立Method对象工厂实现控制反转,并利用该容器设计了一个基于Servlet的控制层软件框架。之后利用“对象缓存池”以及“单例设计模式”对框架进行性能优化,使框架运行效率大幅提升,并降低资源占用。该框架具有较好的扩展性及稳定性,提高了模块的健壮性和功能内聚性,可为各类中小型应用项目的研发提供借鉴。

图6 非首次运行NewInstance()耗时对比

[1] 冯锡炜,侯彤璞,张飞侠.Servlet技术在Web应用中的实现[J].辽宁工学院学报,2005(1):13-16.

[2] 史梦安,王志勃.基于Android系统的TCP/IP客户端异步通信模块研究[J].软件导刊,2014(10):115-118.

[3] RICHARD EG,RALPH H,JOHNSON R,et al.Design paterns:elements of reusable object-oriented software[M].Beijing:China Machine Press,2013.

[4] 魏学松,张育平.IOC框架的研究与设计[J].计算机技术与发展,2006(3):213-216.

[5] 尹松强,傅鹂.Java反射机制探究[J].软件导刊,2008(11):85-87.

[6] 冯铁,李文锦,张家晨,等.面向Java语言的设计模式抽取方法的研究[J].计算机工程与应用,2005(25):23-38.

[7] 吴东庆,胡小健,杨逢建.反射机制下类工厂模式的实现与研究[J].计算机应用,2006(3):705-707.

[8] 陈翠娥.Java单例模式应用研究[J].长沙民政职业技术学院学报,2010(1):114-116.

(责任编辑:黄 健)

Design of a Kind of Controller Layer Software Framework Based on Servlet

This article use “IOC” and singleton pattern to design a kind of controller layer software framework based on servlet,and built an IOC container by Java reflection techniques and a research are made on it’s running efficiency.This framework can dynamically instantiate controller objects for different requests,and distributes the requests through implementation of IOC,it can effectively reduce the coupling of modules and improve system expansibility and development efficiency.

Servlet; Controller Layer Software Framework; Java Reflection Techniques; IOC; Non-intrusive

江苏省淮安市重点研发计划项目(HAN2015035-2)

史梦安(1985-),男,山东临沂人,硕士,淮安信息职业技术学院计算机与通信工程学院讲师、工程师,研究方向为软件工程、移动互联应用与物联网技术。

10.11907/rjdk.162851

TP319

A

1672-7800(2017)003-0083-03

猜你喜欢

设计模式实例容器
Different Containers不同的容器
“1+1”作业设计模式的实践探索
三维协同设计模式下的航天项目管理实践与展望
难以置信的事情
交通机电工程设计模式创新探讨
完形填空Ⅱ
完形填空Ⅰ
互动式设计模式研究