陈 科
(四川大学锦城学院 计算机与软件学院,四川 成都 611731)
据权威编程语言排行榜TIOBE[1]统计,目前JAVA仍然是世界上使用范围最广、使用人数最多、影响力最大的编程语言。各大高校计算机专业都开设了JAVA编程相关的课程,并分配了大量的实验学时,以培养和提高学生JAVA 编程能力。通过一学期(约64 学时)的理论加实践学习,大部分学生可以掌握JAVA 标准版(JAVA SE)的核心内容,包括JAVA 基础语法、面向对象基本概念和设计思想、JAVA 标准库调用方法等。常见的JAVA 课程实验教学方法包括微课教学、案例驱动教学、CDIO 模式教学等[2-4]。
JAVA SE 一般不能直接应用到项目研发和工程实践中。在JAVA SE 基础上、以轻量级MVC 模式为核心的JAVA 企业版(JAVA EE)[5-8]是主流的JAVA 平台开发架构,许多学校也开设了JAVA EE 的实验课程,并研究了一些实验教学方法[9-12],主要集中于案例教学和实验指导过程中的新方法探索。但JAVA EE 架构复杂、代码量大、能力要求高,大部分JAVA EE 实验由于学时限制,再加上学生大多没有企业项目开发经验,导致实验课程效果不佳,很难在短期内培养和提高学生的JAVA EE 实践能力,因此迫切需要进行实验教学改革。
本文通过技术创新,积极探索新型JAVA EE 开发和实验教学模式,将基于MVC 模式的轻量级JAVA EE架构进行组件化设计,并通过自动构建技术,快速完成JAVA EE 应用开发过程,避免了传统逐行代码的编程方式,既提高了实验课程效率,又提升了学生JAVA EE 的编程实践能力,取得了较好的实验教学效果。
基于“模型—视图—控制(MVC)”模式的轻量级JAVA EE 是目前主流的软件体系,JAVA EE 实验也基于MVC 层次架构开展。要实现全栈MVC 体系,必然需要编写前端界面(常常基于HTML 和JavaScript等技术)、后台控制逻辑和数据库模型,因此采用MVC实现一个完整的业务逻辑,包括常见的数据增、删、改、查操作,需要花费较长的时间和较大的精力,短短的实验课时很难高质量地完成全部操作过程,学生普遍感觉知识点多、编程复杂、上手困难,因此实践效果不佳。
为了改革JAVA EE 实验教学,我们提出了创新的MVC 组件概念,摒弃从底层开始直接编写代码的传统模式,将复杂业务逻辑组件化,再通过积木式的组件拼接和组合,形成组件库,从而构建出完整的业务系统,达到了更高效的实践效果。
JAVA EE 组件,简称组件,是符合MVC 规范的细粒度的业务模块,包含前端界面和后台业务逻辑。一个MVC 组件由组件名、组件描述和组件代码实现三部分构成。
按照规模划分,组件可分为小型组件,如删除、新增等功能按钮;以及大型组件,如查询列表、数据表单等组件。一些小型组件可组合成为大型组件。
组件的标识符称为组件名,各组件的名称必须唯一,且组件命名应当符合JAVA 标识符命名规范,如数据新增按钮组件可命名为:dataAddButton。
组件描述是对组件功能和属性的形式化定义,我们采用了XML 语言对组件进行描述,将每个组件映射为一个XML 标签(tag),既增加了可读性,又便于编写计算机程序解析。典型的组件定义如图1 所示。
图1 组件XML 定义
不同组件通过定义不同的属性,具有不同的功能和表现形式,同一组件的不同实例具有不同的属性值,也能表现出不同的界面和功能。 以 文 本 输 入 框(textbox)组件为例,XML 定义如图2 所示。组件的实现过程如图3 所示。
首先将组件XML 定义输入到XML 解析器中,一般可采用开源框架Dom4J 作为解析器[13-15],然后根据组件样式编写前端界面,再根据组件功能编写后台JAVA 逻辑代码。在编写过程中,需要读取XML 的组件属性作为参数,最终生成完整的组件逻辑,输出可用的JAVA EE 组件供使用。
图2 textbox 组件XML 定义
图3 JAVA EE 组件实现过程
一个完整的JAVA EE 组件至少包括前端HTML页面和后台JAVA 代码,结构如图4 所示。
图4 JAVA EE 组件结构示意图
前端页面主要包括标准HTML 标签(如按钮对应的标签为
后端控制逻辑采用JAVA 语言实现,包括三个核心方法:①loadComponentXML()。调用XML 解析器加载并解析组件XML 定义。②saveData()/loadData()。将数据保存到数据库或者从数据库中加载数据。③renderHtml()。根据组件XML 定义的属性控制页面在前端HTML 显示,如果需要,还可将loadData 方法读取的数据在页面中进行展现。
由于组件功能单一,规模较小,根据XML 描述,实现单个组件的业务功能并不复杂。教师可带领学生在实验课堂上完成组件的设计与编写。
单个组件无法独立工作,必须将多个组件进行组合形成组件库,才能实现完整的业务功能。
组件库是由若干组件按照指定结构共同组成的、可构建完整业务功能的组件集合。组件之间可以是包含或并列关系。
组件库仍然采用XML 语言定义组件与组件之间的关系。XML 描述语法如图5 所示。
图5 组件库XML 定义
一个组件库由若干组件构成,组件与组件之间可以是父子包含关系,如图5 中的组件1 和组件2,也可以是兄弟并列关系。每个组件的属性值放到相应XML 节点的属性列表中,属性名称由图1 中的tag 定义给出。
以较为复杂的数据查询组件库(dataQuery)为例,要实现的功能界面如图6 所示。
图6 用于数据查询的组件库dataQuery 的功能界面
该组件库包括搜索栏、工具栏和数据列表,共同构成完整的数据查询及数据操作相关业务功能,其XML 定义如图7 所示。
图7 dataQuery 组件库XML 定义
完成组件库XML 定义后,需要载入到自动构建引擎,由引擎完成组件解析,最终输出完整的业务功能,包括前端界面和后台业务逻辑。
组件库定义仅仅是XML 格式的文档,不能直接提供给用户使用,需要组件引擎(component engine)读取组件库结构,并加载相应组件的定义与实现,最终构建输出成为包含前端界面和后台控制逻辑的可用的业务系统。这个过程自动完成,对用户透明,因此称为自动构建引擎,这是一个非常关键的部件。
组件引擎本质上是一个控制器(controller),运行在JAVA EE 服务器内存中,可通过URL 访问,其工作原理与过程如图8 所示。
图8 组件构建引擎工作过程
用户通过URL 访问组件引擎,URL 中包含了需要调用的组件库参数,引擎根据参数调用相关组件的定义与实现,从而激活组件构建流程,最终输出完整的业务逻辑,组件引擎结构如图9 所示。
图9 构建引擎结构
引擎类 ComponentEngine 核心方法包括:①loadComponentLib()。读取组件库XML 文档,并加载指定的组件库到内存。②resolveComponent()。调用XML 解析库,解析组件库结构,得到组件之间的父子或兄弟关系。③renderComponent()。加载对应的组件定义和实现,并按照组件库结构进行组合,包括前端HTML 界面生成和后台控制逻辑调用,通过该过程完成组件库构建,最终得到完整的业务逻辑代码和运行结果。
值得注意的是,由于各组件已经实现了前端界面和后台逻辑的定义与实现,组件库的构建过程并不需要重复编写前后台业务代码,只需分析组件库结构并调用和加载对应的组件即可,实现过程并不复杂,可由教师带领学生在实验课堂上设计并编程完成。
为了将基于组件库技术的JAVA EE 实验教学与传统编程实验教学进行对比,我们选择两个各约30 人的小班分别采用这两种不同的教学方式,目标是让学生掌握JAVA EE 编程方法,并达到可独立开发完整业务系统的水平。
按照MVC 架构要求,传统JAVA EE 编程包括编写以下部分:
(1)视图层。包括HTML 页面、JavaScript 代码和CSS 样式等页面元素,主要职责是提供可视化的用户界面。
(2)控制层。后台控制逻辑,主要功能是调用服务接口获取数据结果,并输送到视图层展现。
(3)服务层。与界面无关的后台数据查询、加载和分析模块,一般包括接口和实现类,主要职责是为控制器提供服务接口。
(4)数据模型层。将数据库的表结构映射为JAVA对象,并提供数据查询和操作方法,为服务层提供数据操作来源。
为了让学生掌握JAVA EE 编程过程,教师结合一个示例业务系统,先用大约12 学时讲解各个层次的编程技术,再用大约4 学时整合MVC 各层,最终完成业务系统开发。
示例系统讲解完成后,布置了3~5 个新项目让学生进行自主开发实践。从实际教学过程看,由于涉及代码量大,80%以上的学生无法独立完成前2 个实践项目,从第3 个项目开始略有好转,大约70%以上可以独立完成后续项目开发。至此,总共需要大约50~60 学时。
基于组件库技术,实验过程有所变化,整个实验过程分为4 个阶段,特别是第1 阶段,并不需要编写业务系统,而是对组件进行设计和开发。实验过程如下:
(1)常用组件编写。共编写了大约20 个常用组件,包括前端页面和后台控制逻辑,并使用XML 语言进行描述。此过程大约需要28 学时。
(2)组件引擎设计与实现。组件引擎是非常重要的模块,但其逻辑代码并不复杂,教师带领学生大约用2 学时可以完成。
(3)组件库设计。根据业务系统功能设计组件库,并使用XML 描述,由于组件已编写完成,此阶段仅需要定义XML 文档,大约需要3 学时。
(4)系统构建与运行。组件库设计完成后,启动引擎,运行业务系统,并进行功能验证。此阶段大约需要2 学时。
从以上过程可以看出,花费时间最多的是组件编写,从教学效果看,由于每个组件本身也是符合JAVA EE 规范的MVC 模块,但功能更单一,学生更容易理解和掌握编程实现过程,对编程能力提升较传统方式更为显著。
从实际教学进度看,从组件编写到完成组件库设计大约需要30 学时,该阶段后,不同业务系统可直接构建生成,后续新项目不需要重复编写组件。因此,多数学生可以在短时间内构建新的业务系统,整体效率明显高于采用传统实验教学方法的班级。
为了直观地比较两种不同实验教学方式的效果,图10 显示了随着教学课时推进,可独立编写JAVA EE系统人数百分比的变化情况。
图10 实验教学效果对比
两个班级选择的实践项目完全相同。从图10 可以看出,大约前30 学时,传统班学生可独立编写项目模块人数比例更高,但随着组件库的完善,组件化班的构建速度明显提高,掌握独立开发能力的人数迅速增加,40 学时后稳超传统班级,组件化班级的实验教学效果和效率都高于传统班级。
JAVA EE 实验教学是许多计算机软件工程类院校相关专业必不可少的课程。为了提高教学效率,提升学生实践能力,本文提出了组件化架构,并应于教学实践。与传统JAVA EE 实验教学相比,具有明显优势,不仅学生的编程能力提升更显著,教学效率和课时利用率也更高,可作为一种新型的JAVA EE 实验教学方法进行推广。