基于J2EE架构的Java语言学习平台的设计与实现

来源:岁月联盟 作者:郭辉 陈松乔 时间:2010-08-30
  摘  要 本文提出了一种基于J2EE的Java语言学习平台的设计模型和实现方式。该系统基于J2EE平台,结合统一建模语言设计了客户端和服务端的关键功能模块;利用多线程技术及同步控制理论实现了更加准确的逻辑错误检测。结合面向对象的工程化设计思想和反射技术解决庞大的测试用例调度问题,提高了系统的扩展性和健壮性。系统实现的面向对象编程环境、逻辑功能检测等服务为Java语言学习者提供了更加完善的学习平台,弥补了现有的支撑平台无法进行功能检测的不足。    关键词 统一建模语言;面向对象;逻辑检错;Java语言学习;J2EE 

1 引言

    J2EE与传统的互联网应用程序模型相比有着不可比拟的优势[1],这种应用建模系统使用UML语言设计底层架构、数据格式以及数据传输之间的连接。开发者只需关心程序的业务逻辑,把软件开发的注意焦点从代码编写层次提高到了设计建模这一更高层次的抽象[2],提高了应用开发的效率和程序的可用性。    Java语言是机专业的必修课程,它功能强大,面向对象,跨平台,面向应用。只是初学者学习起来有一定难度[3]。尤其在远程中,教师无法面对面辅导学生,更加加大了学习者的难度。如何更好地掌握面向对象的概念,理清编程思路,提高编程经验,是一个Java学习软件设计要考虑的问题,是在设计Java语言平台的过程中要考虑的众多问题之一。     当前,基于J2EE的各类学习平台正在不断开发和研究中。[4]给出了一种基于网络的Java语言学习支撑平台,主要实现用户程序的编译运行,提供教师与学生的交互功能。文献[5]和[6]介绍了基于组件开发的虚拟实验室平台,可定制特定课程的虚拟实验。文献[7]和[8]分别提出了C/S模式下虚拟编程实验室和应用于计算机编程的交互式学习支撑平台。这些平台虽然针对特定课程实现了交互性和开放性,但在具体实施过程中,只提供了简单的编译运行环境,若遇到逻辑错误与棘手的编译错误,系统无法提供有效帮助,需通过教师端人为解决,缺乏程序功能性检测服务。    因此,本文提出了基于J2EE的Java语言学习支撑平台。它提供了面向对象的编程环境,完善的编译检错服务和功能强大的逻辑检错服务,能正确定位编译错误信息,能检测程序的功能完整性。本文采用面向对象的设计开发方法开发,使Java语言学习平台的系统性、灵活性、健壮性、实时性和可扩展性得到非常好的体现,降低了软件开发的难度,并且有助于培养和提高Java语言学习者分析问题和解决问题的实践动手能力。

2 系统架构与功能

    基于J2EE的Java语言学习平台的系统架构如图1所示。系统采用C/S模式开发,客户端(Clients)和服务端(Servers)通过互联网进行通信连接。基于J2EE的客户端程序主要提供Java语言学习的编程环境和实战练习服务。基于J2EE的服务器端程序主要提供用户管理服务、文件服务和逻辑检错服务,并包含四个数据库:用户数据库、用例数据库、完型填空数据库和试题数据库。数据库统一由基于J2EE的数据库操作程序进行规范管理。图1  基于J2EE的Java语言学习平台的系统架构    平台的功能模块如图2所示。客户端主要包括五个功能模块:用户登录、编译检错、逻辑检错、完型填空和面向对象编程辅助设计。服务器端主要包括三个功能模块:用户管理、数据库管理和逻辑检错服务。其中,面向对象编程辅助设计和逻辑检错是本系统最主要的两大功能。面向对象编程模块主要是向用户提供可视化类图编辑环境并能生成代码,同时也能根据用户写的代码相应地生成类图并展示类图的结构。着重突出了Java程序的面向对象特点,让用户直观了解Java语言的特色。逻辑检错模块主要对客户端提交的Java语言源文件进行安全检测和编译运行,利用重定向技术和数据库管理技术对程序进行逻辑检测,最后将检测分析的结果反馈给客户端。


图2  基于 J2EE 的Java语言学习平台的系统模块
    用户可以通过客户端学习Java语言的相关知识,在客户端提供的面向对象编程环境中编写程序,当用户编写了一个完整的程序后,通过代码自动转化为类图,并展示类图的结构。用户也可先设计类图然后通过类图自动生成代码框架,余下的代码由用户通过手动进行编写。当用户完成了代码的编辑工作之后就通过编译检错功能来进行编译检错,并将编译结果显示在程序界面下的帮助栏内。若遇到了解决不了的错误,通过系统提供的编译错误的帮助功能,得到编译错误提示信息,改正程序的语法错误,得到可运行的程序,然后通过互联网将源程序代码提交服务器端进行逻辑检测,判断其程序的功能是否达到所需的要求,根据反馈信息,对原有程序进行相应修正,达到编译与功能的双重正确性。

3 面向对象编程模块的设计与实现

    面向对象编程模块主要包含两个功能,第一是从通过程序获得类图:用户在编辑框里写出代码点击界面上的生成类图就可以在界面上生成类图。具体实现方案是:①模块先分析用户编写的Java源文件,调用Jdk里的javac编译声明,建立类程序的内部表示,包括类层次和“使用”关系。然后对源程序再进行词法分析,将结果与javac分析的结果比较和综合。得出相应的类的结构。②调用Javadoc从源代码的文档注释中获取用户的文档,把生成的类成员的信息保存在文档当中。③生成类图,用不同的箭头和连线表示类之间的关系。类图生成过程流程图如图3所示。图3  代码生成类图过程流程图    第二是类图生成代码:将类图画在主窗口的面板上,将类与类之间的关系用箭头联系。并生成类属性对话框,在对话框里填写相应的辅助信息就可以生成相应的代码框架。模块设计主要包括四个子功能:①编程界面的实现,包括主菜单设计、工具栏的设计和控制面板的设计。②类图实现。在面板上表示的类图通过重写Java语言里的JLABEL实现,并在JLABEL里直接定义了句柄功能。通过调整句柄的位置实现类图的放大和缩小。③类与类之间连线的实现和箭头的实现,来可视化地表示类与类之间的关系,并由事先定义好的Line Renderer接口,在设置箭头的范围、位置、大小。④代码生成。读取用户输入信息,并添加注释信息,输出到控制面板上。类图生成代码的流程图如图4所示。


图4 类图生成代码过程流程图
    通过对类图的设计与实现。我们得到了面向对象的编程模块统一视图。它遵循域模型相同的图解惯例。类图既显示操作名称也显示属性,表明了各部分之间的关系。它显示了系统分类器的静态结构;并为其它结构图提供了基本记号。

4 逻辑检错功能的设计与实现

    系统提供的逻辑检错功能主要是向初学者提供功能完整性检测服务。对有些初学者来说,他根据试题的要求编完了一个程序,并在客户端编译通过了编译器,这个时候需要判断是否完成了设计所要求的功能。我们在服务器端设计了庞大的测试用例库,学生从服务器端的试题库读取相应的试题进行练习,我们把不同的试题进行了分类,对于不同的题目我们调用不同的测试用例进行检测,针对不同的程序采用不同的分析方法。同时,在进行程序检测的过程中,也考虑了系统的安全性。提供了安全检测机制。系统根据面向对象程序设计方法和反射技术实现了复杂的测试用例的调度。逻辑检错的实现主要由文件管理、编译检测、安全检测、输入输出接管、用例检测和反馈信息六个服务功能组成。一个完整的程序文件从提交到服务器开始就执行相应的功能,当前功能段报错,说明源程序有问题,将不能进行下一层的功能检测服务。系统将把程序返回给客户端,保证系统的安全性和实时性。逻辑检错模块的序列如图5所示。

图5  逻辑检错功能模块的序列图    文件管理主要接收处理客户端传来的Java源程序文件。编译检测模块对传来的Java源程序文件进行编译运行,如果程序存在错误,则返回给客户端程序,提示用户先进行编译检错。如编译通过,则进入安全性检错。判断程序可能出现的死循环状态,如出现死循环状态,则服务器将会死机。本系统利用J2EE平台提供的Process组件特性,运行可执行文件。Process组件可获取当前运行进程的信息,包括线程集、加载模块(.dll 和 .exe 文件)和性能信息。根据进程的管理信息,判断进程是否结束。系统周期性检测运行进程一次,若已正常结束,则表示程序不存在死循环,自动进行下一步操作,若超过设定时间,进程仍未结束,则表明该程序是一个死循环或者恶意代码,系统自动调用Process组件的强制中断方法,结束进程,同时进行其它相关安全操作。    输入输出接管确保Java语言源程序代码的编译正确性和安全性的前提下进行输入输出重定向操作。系统读取源程序代码进行分析,接管原有的键盘输入输出及文件输入输出操作,比如,将键盘输出函数System.Out类替换为Java.io.FileInputStream类。键盘输出类System.Out转化为JAVA.io.FileOutputStream类。成功的将原有的程序输入输出转化为系统指定的输入输出,对后面的用例检测(CaseChecker)提供支持。    用例检测模块和数据库通过用例调度机制进行交互。主要判断程序的逻辑正确性。系统通过调用Jdk包,对程序的源程序进行编译运行,并通过重定向处理,替换为在服务器上运行的.Class文件。同时,通过测试用例调用数据库,生成相应的测试用例类,对程序进行测试。系统通过分析检测的结果,将结果返回给用户。    用例调度机制是逻辑检测功能得以实现的重要组成部分,系统采用面向对象开发方法,具有可重用性、灵活性和扩展性等优点。其用例图如图6所示。不同的程序用不同的测试用例和方法。如果为同一类题目单独编制测试用例和测试函数,不利于程序的升级和扩展。因此,程序根据面向对象模块化的思路,将每类题目组成一个用例测试类库,通过统一的调度模块调用相应的类信息来生成一个具体的事例对象。


图6 用例调度机制的用例图
    类实例的动态创建是此机制实现的关键。随着程序类型的增加,系统代码将会越来越复杂。系统为了保证软件工程的灵活性和扩展性,采用了工厂设计模式、条件外置和反射技术来实现。工厂设计模式为系统结构提供了非常灵活强大的动态扩展机制;在程序中通过用abstractTool类做整个系统工具类的模板。然后用tool类来做实体类。public class tool implements abstractTool…,使得程序的灵活性得到很好的体现。条件外置,即通过应用程序的配置文件来实现,保证了系统信息管理的统一性;而反射技术,可以使用反射动态地创建类型的实例,将类型绑定到现有对象,当程序关闭或用户要保存程序时,类图信息也动态的保存。当程序需要用到类图的信息时能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。程序用class.forName()来获取类名class c=Class.forName(classString);在程序中当检测一个程序的逻辑错误时,从相应的用例数据类库动态调用一个特定类型的定义,来实现实例对象。若要扩充不同的测试用例类,则不必改变系统的架构,只要往测试用例类库中添加相关的类型信息即可,保证了系统的健壮性和扩展性。

5 系统的运行实例

    基于J2EE的Java语言学习平台为Java语言的学习者提供了一个全真的编程环境,基于可视化的类图表示功能和强大的逻辑检错功能,以及丰富的齐全的学习资料。学习者通过这个平台,能够很好地进行编程实践,快速掌握编程技巧,养成良好的编程习惯和思想。    Java语言的学习者在登录以后,进入客户端界面,客户端界面则是面向对象编程的主界面。左边的树型目录是类图的创建、连接和编译。右边是面板,学习者在面板上可以拖动图标,并可以用连线表示类图的关系。学生通过生成类图,构建好类图之间的关系。然后双击相应的类图图标,下面的窗口一中自动得到相应的代码框架。如图7所示。如果想要程序实现更多的功能可以在类图框架里填写相应的代码。点击编译按钮可以编译执行。同时面板中也可以得到相应的类图图标。窗口二是错误提示窗口,显示编译错误和逻辑错误的提示信息。学生可以通过编译检错和逻辑检错功能来实现其所编程序的正确性和完整性。图7 系统运行后客户端界面    在实际应用情况下。学生对Java语言的面向对象的特性得到更加深入的了解。系统错误提示更加简洁明了,准确性也明显提高。逻辑检测功能的操作也同样简单,客户端通过提交程序模块将.java源程序提交到服务器端,服务器端经分析处理后,通过将检测结果反馈显示到客户端的功能检测栏。功能检测栏在Java的帮组文档区。

6 结论

    本文在对其它Java语言学习平台深入分析研究的基础上,结合了面向对象程序开发技术,并用UML语言中的用例图和序列图描述了特定功能模块。详细论述了基于J2EE的Java语言学习平台的系统架构和实现方案。该平台为Java语言的初学者提供了可视化的面向对象的编程环境,完善的编译检错服务和强大的逻辑检错功能。面向对象编程模块不但提供了可视化的类图表示功能,而且还提供了程序代码自动生成类图的功能。让用户更加深入的掌握面向对象编程的技术。系统提供的逻辑检错功能为用户检测程序的功能完整性和安全性,解决了Java语言学习者无法定位逻辑错误的困扰。平台采用面向对象的工程化结构思想设计,运行机制兼容性强,能够为远程中开发其它语言的学习支撑平台提供很好的模型。 参考[1] D. Alur, J. Crupi, and D. Malks. Core J2EEPatterns, Best Practices and Design Strategies.Sun Microsystem Press, second edition,[2] PM. Nikolaidou, N. Alexopoulou, A. Tsadimas, PA. Dais, PD. Anagnostopoulos Accommodating EIS UML 2.0 Profile using a standard UML modeling tool[J] ICSEA.2007.13[3] 印旻.Java语言与面向对象程序设计[M].北京:清华大学出版社,2000.[4] S.C.Ng, S.O.Choy, R.Kwan, andS.F.Chan. A Web-Based Environment to Improve Teaching and Learning of Computer Programming in Distance Education LNCS 3583 [C]//4th International Conference, ICWL 2005 Hong Kong, China,2005: 279-290.[5] Wang Jianxin, Chen Songqiao, Jia Weijia, Pei Huiming. The Design and Implementation of Virtual Laboratory Platform in Internet [C]//Proceedings of The First International Conference on Web-based Learning, 2002: 169-177.[6] L Benetazzo, M Bertocco,,F Ferraris, A Ferrero, C Offelli, M Parvis, V Piuri. A Web-Based Distributed Virtual Educational Laboratory[J]. IEEE Transaction On Instrumentation and Measurement (S0018-9456), 2000, 49(2): 349-356.[7] Jiannong Cao, Alvin Chan, Weidong Cao, Cassidy Yeung. Virtual Programming Lab for Online Distance Learning LNCS 2436 [C]//First International Conference, ICWL 2002 Hong Kong, China, 2002:59-61.[8] Sheung-On Choy, Sin-Chun Ng. An Interactive Learning Environment for Teaching and Learning of Computer Programming[A].Proc of 4th IEEE International Conference on Advanced Learning Technologies [C]. IEEE Press, 2004. 848-849.

图片内容