普通话水平测试测试员质量管理系统_第1页
普通话水平测试测试员质量管理系统_第2页
普通话水平测试测试员质量管理系统_第3页
普通话水平测试测试员质量管理系统_第4页
普通话水平测试测试员质量管理系统_第5页
已阅读5页,还剩39页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

word文档可自由复制编辑摘要推广普通话是新时期语言文字工作的首要任务,对提高全民族的科学文化素质有重要意义。国家普通话水平测试是我国为加快共同语普及进程、提高全社会普通话水平而设置的一种语言测试制度。传统的面对面的测试模式已经不能满足当前的普通话测试需要,引进现代信息技术,实现评测过程的自动化,网络化成为普通话培训测试的新的发展方向,既能够有效降低测试成本,提高工作效率,又能够加强对测试的管理,为管理和监控测试工作的质量提供了很好的支撑。测试员质量管理系统是基于普通话水平测试网络管理系统而构建的,实现对测试的测试质量进行管理和监控,提高测试员测试质量的定量依据,为各级培训测试中心对测试员的质量管理提供有效参考。同时建立样卷系统,加强对测试员业务能力的培训和考核,对于测试员队伍的建设有着非常重要的意义。本文介绍测试员质量管理系统的基本实现思路,功能,以及所用到的技术。分析了测试员质量管理系统基本原理。对测试员质量管理系统进行了模块化分析,重点介绍了测试员登陆,测试情况统计和样卷管理这几个模块。关键词测试员质量管理系统,测试员测试情况统计,样卷管理ABSTRACTThepromotionofPutonghualanguageisaprimarytaskinNewEraandhasgreatsignificanceofupgradingthenation'sscientificandculturalqualities.NationalPutonghuaShuipingCeshii(abbriv.AsPSC)isaLanguageTestingSystem,itcanspeeduptheprocessofpopularizingthecommonlanguageandraisethePutonghuastandardofthewholesociety.Thetraditionalface-to-facetestmodehasbeenunabletomeetthecurrentneedsofPutonghuatest.Introductionmoderninformationtechnology,implementautomationofevaluationprocessandnetworkisanewdirectionofdevelopmentoftesting,wecanreducethetestingcosteffectively,raiseworkefficiency

andstrengthenthemanagementofthetestinganditwillprovideabettersupportformanagementandmonitortest.Tester'squalitymanagementsystemisbasedontheChineseProficiencyTestNMSbuilt,itcanachievequalitymanagementandmonitoring,improvethequalityoftesterstesting,supplyeffectivereferenceforthealllevelsTrainingandTestingCenterqualityofmembersofmanagement.Atthesametimeitbuildavolumesystemwhichcanstrengthenthetester'scapacityoftrainingandassessment,andhasaveryimportantsignificanceforthetestteambuilding.Thispaperintroducesmethodandfunctionsofrealizationandtechnologyusedintestqualitymanagementsystem.Analysisthebasicprinciplesofqualitymanagementsystem.Analysisthetestqualitymanagementsystembymodule.Weemphaticallyintroducethelandingofthetesters,thestatisticsoftestsituationandvolumemanagement.KeywordsPSC,testersteststatistics,sampleexampapermanagement目录摘要 IABSTRACT II第1章引言 11.1背景 11.2研究内容 1第2章测试员质量管理系统技术框架 22.1总体技术概述 22.2系统工作环境 22.3系统使用技术 42.3.1Ajax技术 42.3.2CSV技术 52.3.3JavaBean技术 52.3.4框架(frame)技术 6第3章测试员质量管理系统设计 73.1数据库设计 73.1.1概念结构设计 73.1.2逻辑结构设计 73.2各功能模块概要 123.2.1登陆模块 123.2.2测试法规 123.2.3样卷管理 133.2.4测试员测试情况统计 14第4章登陆模块设计与实现 154.1登陆模块验证流程 154.2登陆模块详细设计 154.3本章小结 18第5章样卷管理模块设计与分析 195.1CSV解析 195.2样卷和样卷答案导入 235.3样卷和样卷答案查看与说明 275.4本章小结 29第6章测试员测试情况统计模块设计与实现 306.1测试员测试情况统计模块设计 306.2本章小结 38第7章结论 397.1总结 397.2展望未来 39致谢 40参考文献 41第1章引言1.1背景推广普通话是新时期语言文字工作的首要任务,对提高全民族的科学文化素质有重要意义[1]。语言文字是信息的主要载体,是协调社会生产和社会生活的交际工具[2]。推广普通话,普及教育,提高全民族的文化素质,是文化建设面临的紧迫任务[3]。国家普通话水平测试作为推普工作的一个重要手段,在共同语普过程中有及其重要的作用。普通话水平测试员在普通话水平测试中具有特殊的作用和地位,测试员的质量在一定程度上决定了推普的质量[4]。因此加强测试员队伍建设,建立有效的业务能力监控手段,合理地对测试员的工作进行考核是测试员队伍建设的基础工作之一,是提高普通话水平测试信度和效度的有效手段[5]。国家教育部颁布的《普通话水平测试管理规定》第十三条明确指出:“在同级语言文字工作办事机构指导下,各级测试机构定期考察测试员的业务能力和工作表现,并给予奖惩。”测试员考核工作是一项政策性,科学性很强的工作,现阶段加强对测试员队伍的考核,建立健全科学的普通话水平测试员综合考核指标体系,对深化测试员队伍管理,优化测试员队伍结构,起着十分重要的作用[6]。测试员质量管理系统是基于普通话水平测试网络管理系统而构建的,实现对测试的测试质量进行管理和监控,提高测试员测试质量的定量依据,为各级培训测试中心对测试员的质量管理提供有效参考[7]。基于现代信息技术建立的网络化测试管理模式为测试中心加强监控和管理、降低测试成本,提高工作效率,改善工作质量提供了很好的支撑[8]。1.2研究内容本软件研究的基本内容是:在普通话水平测试网络管理系统的基础上,设计并实现测试员测试质量管理系统,实现对测试员测试质量的实时的动态的管理,为测试中心实现量化考评测试员的工作提供有效的信息。主要解决以下几个问题:①.登陆测试员管理系统;②.测试员法规;③.样卷的导入与查看;④.测试员测试情况统计;⑤.系统帮助。第2章测试员质量管理系统技术框架2.1总体技术概述测试员质量管理系统主要是用JSP动态网页技术结合javabean来实现主要功能,其中登陆模块是用ajax的异步验证,样卷导入是利用csv解析导入到数据库中,其他是用了框架技术。2.2系统工作环境本系统以ApacheTomcat5.0作为web容器,MacromediaDreamweaver8作为开发工具,MicrosoftSQLServer2000作为后台数据库。Eclipse作为javabean文件的编写工具。Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat5支持最新的Servlet2.4和JSP2.0规范。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache独立的进程单独运行的。Dreamweaver是美国MACROMEDIA公司开发的集网页制作和管理网站于一身的所见即所得网页编辑器,它是第一套针对专业网页设计师特别发展的视觉化网页开发工具,利用它可以轻而易举地制作出跨越平台限制和跨越浏览器限制的充满动感的网页。

MacromediaDreamweaver8是建立Web站点和应用程序的专业工具。它将可视布局工具、应用程序开发功能和代码编辑支持组合在一起,其功能强大,使得各个层次的开发人员和设计人员都能够快速创建界面吸引人的基于标准的网站和应用程序。从对基于CSS的设计的领先支持到手工编码功能,Dreamweaver提供了专业人员在一个集成、高效的环境中所需的工具。开发人员可以使用Dreamweaver及所选择的服务器技术来创建功能强大的Internet应用程序,从而使用户能连接到数据库、Web服务和旧式系统。SQLServer是一个关系数据库管理系统。它最初是由MicrosoftSybase和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本。在WindowsNT推出后,Microsoft与Sybase在SQLServer的开发上就分道扬镳了,Microsoft将SQLServer移植到WindowsNT系统上,专注于开发推广SQLServer的WindowsNT版本。Sybase则较专注于SQLServer在UNIX操作系统上的应用。SQLServer2000是Microsoft公司推出的SQLServer数据库管理系统的最新版本,该版本继承了SQLServer7.0版本的优点,同时又比它增加了许多更先进的功能。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行MicrosoftWindows98的膝上型电脑到运行MicrosoftWindows2000的大型多处理器的服务器等多种平台使用。Eclipse是以个集成开发环境(IntegratedDevelopmentEnvironment)。其前身是IBM的VisualAgeforJava(VA4J),IBM投入了3千万美元。Eclipse是可扩展的体系结构,可以集成不同软件开发供应商开发的产品,将他们开发的工具和组件加入到Eclipse平台中。随Java应用的广泛,各大主要软件供应商都参与到Eclipse架构开发中,使得Eclipse插件数量与日增加。其中,IBM的WebSphereStudioWorkbench是突出的例子。Eclipse平台的免费,架构的成熟,行业协会Eclipse基金会的支持,使得很多的Java开发采用了Eclipse架构。如今,IBM通过起附属的研发机构ObjectTechnologiesInternational(OTI),继续引领Eclipse开发。插件(plug-in)是遵循一定规范的应用程序结构编写出来的程序,也成为扩展,不同于组件。Eclipse正是一个精心设计的、可扩展的核心结构。通过插件的形式,将根据自己需要选择的扩展开发工具集成到Eclipse平台核心。因此使得可以避免因过去不兼容工具带来的麻烦,降低开发出成本,大幅度提高工作效率。Eclipse本身作为一个开放源码的软件项目,它主要包含3个子项目:平台子项目,Java开发工具(JDT-java)子项目,插件开发环境(PDE-plug-in)子项目。其中,Java开发工具JDT为开发人员提供大量的集成工具集,主要为Java应用程序提供编程接口(API)。Eclipse软件开发工具箱(SDK)是主要有Eclipse本身的项目软件和其他一些开发源吗的第三方软件组成。次者,插件开发环境(JDT)则为插件开发和测试提供相应的环境,如:创建插件清单文件、定义扩展点等。2.3系统使用技术2.3.1Ajax技术AJAX全称为“AsynchronousJavaScriptandXML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。Ajax是最近非常流行的一种Web开发技术,由于其具有异步的数据请求和Web页面数据的无刷新改变等特征,被广泛用于对应用性能与用户体验要求都很高的Web2.0与富客户端的Web应用中。传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的webservice接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。Ajax应用程序的优势在于:通过异步模式,提升了用户体验;优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用;Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。Ajax的核心是JavaScript对象XmlHttpRequest。该对象在InternetExplorer5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。2.3.2CSV技术CSV文件,也叫逗号分隔值文件,英文名称COMMASEPARATEDVALUE。具体格式规则如下:①、开头是不留空,以行为单位;②、可含或不含列名,含列名则居文件第一行;③、一行数据不垮行,无空行;④、以半角符号,作分隔符,列为空也要表达其存在;⑤、列内容如存在,,则用“”包含起来;⑥、列内容如存在“”则用“”“”包含;⑦、文件读写时引号,逗号操作规则互逆。8内码格式不限,可为ASCII、Unicode或者其他。我们采用Unicode编码的CSV文件作为数据文件的基本格式,降低数据解析的复杂度。2.3.3JavaBean技术JSP网页最大的特点之一就是能够结合JavaBean技术来扩充网页中的程序。JavaBean是一中专门为软件开发人员设计的全新组件技术,它为软件开发人员提供了一种最佳的问题解决方案。使用JavaBean可以创建可重新使用的平台独立组件。然而,JavaBean的最大优点是其强大的健壮性[9]。JavaBean组件被称为Bean,它是遵循特定命名规则的Java对象。JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露称为属性。众所周知,属性名称符合这种模式,其他Java类可以通过自省机制发现和操作这些JavaBean属性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变[10]。2.3.4框架(frame)技术所谓框架便是网页画面分成几个框窗,同时取得多个URL。只要<FRAMESET><FRAME>即可,而所有框架标记要放在一个总起的html档,这个档案只记录了该框架如何划分,不会显示任何资料,所以不必放入<BODY>标记,浏览这框架必须读取这档案而不是其它框窗的档案。<FRAMESET>是用以划分框窗,每一框窗由一个<FRAME>标记所标示,<FRAME>必须在<FRAMESET>范围中使用。第3章测试员质量管理系统设计3.1数据库设计3.1.1概念结构设计将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计。概念结构独立于数据库逻辑结构,也独立于支持数据库的DBMS。它是现实世界与机器世界的中介。本系统是采用至顶向下的方法来设计的。3.1.2逻辑结构设计表center存放登陆信息包括用户名,密码,登陆中心,其结构如表3-1所示:表3-1center表列名数据类型长度允许空loginNamevarchar50是namevarchar50是passwardvarchar50是表t_centerMsg存放存放公告,测试规定和测试计划的标题,内容,发布时间和类型,其结构如表3-2所示:表3-2t_centerMsg表列名数据类型长度允许空titlenvarchar100是contentnvarchar4000是publishDatedatetime8是typenvarchar50是表judger存放测试员的id和姓名和登陆名等其他信息,其结构如表3-3所示:表3-3judger表列名数据类型长度允许空ID(主键)char10否namevarchar50是tidchar10是sfzvarchar50是agevarchar50是sexvarchar50是workPlacevarchar50是phonevarchar50是eMailvarchar50是judgerRankvarchar50是测试试卷表存放试卷号,一审测试员id,二审测试员id,复审测试员id,测试时间,提交测试时间,一审分数,二审分数,复审分数,其结构如表3-4所示:表3-4测试试卷表列名数据类型长度允许空examPaperID(主键)nvarchar50否judge1IDnvarchar50是GetTimedatetime8是SubmitTimedatetime8是judge1Resultfloat8是judge2IDnvarchar50是judge2Resultfloat8是arbitratorIDnvarchar50是arbitratorResultfloat8是表countTemple1用来存放试卷号,测试员id,测试时间,测试时间,测试成绩,最终成绩,其结构如表3-5所示:表3-5countTemple1表列名数据类型长度允许空exampaperID(主键)varchar50否namevarchar50是testTimevarchar50是TestRvarchar50是resultvarchar50是样卷表用来存放样卷号,字号,词号,文章一编号,文章二编号,命题说话一编号,命题说话二编号,最终分数,其结构如表3-6所示:表3-6样卷表列名数据类型长度允许空eId(主键)varchar50否awordIDvarchar50是wordIDvarchar50是article1IDvarchar50是article2IDvarchar50是speak1IDvarchar50是speak2IDvarchar50是sorcefloat8是样卷答案表用来存放样卷号,错字信息,错词信息,其结构如表3-7所示:表3-7样卷答案表列名数据类型长度允许空eID(主键)varchar50否errorAwordvarchar4000是errorWordvarchar4000是测试员表,测试试卷表,试卷表关系图3-1所示:图3-1关系图在这个关系图中表t_examPaperJudge中的examPaperID是表t_examPaper的外码,表t_judgeInfo中的ID是表t_examPaperJudge的外码。样卷表和样卷答案表的关系图如图3-2所示:图3-2关系图这个关系图中样卷答案表ePaperKey中的主键eID是样卷表ePaper中的外码。t_testTemple,t_testTemple2,part这个3个表之间的结构图如图3-3所示:图3-3关系图表part中的exampaperId是表t_testTemple和表t_testTemple2的外码。3.2各功能模块概要3.2.1登陆模块这个模块的主要功能就是登陆测试员质量管理系统,通过输入用户名和用户密码,选择所属中心即可登陆该系统。如图3-4所示:图3-4登陆3.2.2这个模块的主要功能是显示管理规定,测试计划安排,省中心公告。用框架frame来实现的。点击管理规定后显示如图3-5所示:图3-5规定点击省中心公告后显示省中心公告的标题和发布时间,如图3-6所示:图3-6省中心公告点击标题就能显示对应的内容。例如点击国家通用语言文字的使用就能弹出该文章。3.2.3样卷就是由专家编写的普通水平测试的试卷,经过了很多专家测试,因此样卷的答案具有非常高的正确性,可以作为测试员培训或水平考核的主要依据之一。这个模块的功能主要有样卷,样卷答案的导入和样卷,样卷答案的查看和样卷说明。可以通过点击样卷导入来导入样卷。其格式为.csv格式的,可以选择自行输入导入的路径。如图3-7所示:图3-7样卷导入3.2.4这个模块的功能主要是统计测试员的测试情况。主要是统计测试员测试的试卷正确率等信息,用户可以通过输入测试员的登录名来查询,也可点击测试员的登录名来查询。其查询结果包括测试试卷号,测试时间,测试提交时间,测试的正确率等信息。第4章登陆模块设计与实现4.1登陆模块验证流程该模块是用Ajax的异步验证来实现的。利用ajax采用将数据附在url后提交到服务程序的传值方式,在服务器端验证完毕返回结果,再由页面程序将结果现在在页面上。首先用户按照提示输入登陆信息,输入后提交。<inputwidth="60"type="submit"name="button"value="提交"onclick="checkUser()">当用户按下确定后运行script,该script是放在check.js中。当运行此script的时候就会把登陆信息传到loginjudge.jsp中。由loginjudge.jsp来接受并处理该信息。然后将处理后的信息返回给登陆界面显示4.2登陆模块详细设计表center是用来存放用户登陆信息如表4-1所示:表4-1center表列名数据类型长度允许空namenvarchar50是loginNamenvarchar50是passwardnvarchar50是在登陆页面中输入用户名和密码,如图4-1所示:图4-1登陆界面当点击提交后运行script,该script存放在check.js中。Check.jsvarxmlHttp;functioncreateXMLHttpRequest(){ if(window.ActiveXObject){ xmlHttp=newActiveXObject("Microsoft.XMLHTTP"); } elseif(window.XMLHttpRequest){ xmlHttp=newXMLHttpRequest(); }}functioncheckUser(){ createXMLHttpRequest(); varname=document.getElementById("name").value;//得到用户名 varpassword=document.getElementById("password").value;//得到密码 varcenter=document.getElementById("center").value;//得到中心信息 varurl="loginjudge.jsp?name="+name+"&password="+password+"¢er="+center; xmlHttp.open("GET",url,true); xmlHttp.onreadystatechange=showResult; xmlHttp.send(null);}functionshowResult(){ if(xmlHttp.readystate==4){ if(xmlHttp.status==200){//信息已经成功返回,开始处理信息 varresult=xmlHttp.responseText; //在界面显示返回结果 document.getElementById("checkResult").innerHTML="<b>"+result+"</b>"; } }然后将用户信息传到loginjudge.jsp中处理。接受信息用户Stringname=request.getParameter("name");request.getSession(true);session.setAttribute("name",name);Stringpassword=request.getParameter("password");Stringcenter=request.getParameter("center");处理信息Stringsql="select*fromt_centerwhereloginName='"+name+"'andpassward='"+password+"'";ResultSetrs=Bean.executeQuery(sql);if(rs.next()){ response.sendRedirect("loginright.jsp");}else{out.write("<fontcolor=red>用户名或密码错误</font>");}当输入的用户名或密码错误是提示错误正确是转到loginright.jsp中。loginright.jsp中<ahref="login.jsp?name=<%=name%>"target="_self">验证正确点此登陆</a>然后将该信息返回给登陆界面提示用户验证成功,可以进入系统。如图4-2所示:图4-2登陆正确界面4.3本章小结这章主要是介绍利用Ajax来实现用户登陆的功能,ajax与一般的表单提交不同,不需要刷新页面。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。这里有几个问题要讨论:第一个是用户登陆信息的提取用到如下语句。varname=document.getElementById("name").value;varpassword=document.getElementById("password").value;varcenter=document.getElementById("center").value;这里我尝试过这样写varname=document.getElementByName("name").value;但出现无法得到内容,必须要以Id才能得到value值。第二个问题就是调试js的方法,可以通过显示一个窗口的方法来一步步来调试。如window.alert(name);来显示name的值看看是否获取到了。第5章样卷管理模块设计与分析5.1CSV解析样卷和样卷的答案是采用Unicode编码的CSV文件作为数据文件的基本格式。因此需要对CSV进行解析。第2章中已经描述了CSV的格式是以逗号作为分隔符,因此可以进行如下的解析:UtilCla..javapublicclassUtilCla{publicstaticStringCSVEncode(Stringin){//csv编码Stringout="";if(in==null)returnout;out=in.replaceAll("&","&");out=out.replaceAll("\"",""");returnout;}publicstaticStringCSVDecode(Stringin){//csv解码Stringout="";if(in==null)returnout;out=in.replaceAll(""","\"");out=out.replaceAll("&","&");returnout;}}CSVCreater.javapackageinfo.csv;importjava.io.FileOutputStream;importjava.io.IOException;importinfo.csv.UtilCla;publicclassCSVCreater{//创建csvprivateFileOutputStreamfos=null;privateStringBuffersb=null;privatebooleanconvertFlag=false;publicstaticfinalStringDEL_CHAR=",";publicstaticfinalStringAV_CHAR="\"";publicCSVCreater(Stringarg)throwsIOException{//抛出异常处理fos=newFileOutputStream(arg,false);sb=newStringBuffer();}publicvoidsetData(Stringdata){//设置时间格式if(convertFlag)data=UtilCla.CSVEncode(data);sb.append(AV_CHAR);sb.append(data);sb.append(AV_CHAR);sb.append(DEL_CHAR);}publicvoidsetConvertFlag(booleanb){//设置标记convertFlag=b;}publicvoidwriteLine(){if(sb.charAt(sb.length()-1)==',')sb.delete(sb.length()-1,sb.length());sb.append("\r\n");}publicvoidwriteDataByLine(String[]args){for(inti=0;i<args.length;i++)setData(args[i]);writeLine();}publicvoidclose()throwsIOException{//关闭try{fos.write(sb.toString().getBytes());}catch(IOExceptione){throwe;}finally{fos.close();//关闭文件读取}}CSVAnalysis.javapackageinfo.csv;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importinfo.csv.UtilCla;publicclassCSVAnalysis{//csv方法解析privateInputStreamReaderfr=null;privatebooleanconvertFlag=false;privateArrayListdataContainer=newArrayList();//新建数组publicstaticfinalStringDEL_CHAR=",";publicstaticfinalStringAV_CHAR="\"";publicCSVAnalysis(Stringf)throwsIOException{//异常处理fr=newInputStreamReader(newFileInputStream(f));}publicvoidsetConvertFlag(booleanb){//设置标记convertFlag=b;}publicArrayListanalysis()throwsIOException{//异常处理BufferedReaderbr=newBufferedReader(fr);Stringrec=null;try{while((rec=br.readLine())!=null){ArrayListalLine=analysisLine(rec);dataContainer.add(alLine);}}catch(IOExceptione){throwe;}finally{br.close();}returndataContainer;}privateArrayListanalysisLine(StringstrLine){ArrayListal=newArrayList();//新建一个数组用于存放结果String[]dataArr=strLine.split(DEL_CHAR);for(inti=0;i<dataArr.length;i=i+1){if(convertFlag)al.add(UtilCla.CSVDecode(dataArr[i]));//添加到数组中elseal.add(dataArr[i]);//添加到数组中}returnal;}publicvoidclose()throwsIOException{//关闭fr.close();}}通过这个3个java就能解析csv文件,用于样卷和样卷答案的导入5.2样卷和样卷答案导入这个模块的主要功能是导入样卷和样卷答案。样卷存放在ePaper中,如表5-1所示,样卷答案存放在ePaperKey中,如表5-2所示:表5-1样卷表列名数据类型长度允许空eId(主键)varchar50否awordIDvarchar50是wordIDvarchar50是article1IDvarchar50是article2IDvarchar50是speak1IDvarchar50是speak2IDvarchar50是sorcefloat8是eId是样卷号,awordID为字号,wordID是词号,article1ID是第一篇文章的编号,article2ID是第2篇文章的编号,speak1ID是第一篇命题说话的编号,speak2ID是第二篇命题说话的编号,sorce是样卷的成绩。表5-2样卷答案表列名数据类型长度允许空eID(主键)varchar50否errorAwordvarchar4000是errorWordvarchar4000是eID是样卷号,errorAword是样卷的错字信息,errorWord是样卷的错词信息。由于错字和错词信息所占用的存储空间比较大,在设计样卷答案表时数据项errorAword和errorWord长度要设成4000,这样设的目的是为了能存放的下信息,如果是50的话就会导致插入数据失败,因此要改成4000.在这个csvInfo.jsp这个页面中提示用户输入样卷和样卷答案路径:<formname="form1"action="doCsvInfo.jsp">选择要导入的样卷路径(.csv):    <inputtype="file"name="examPaper"id="examPaper"><p>选择要导入的样卷答案路径(.csv):<inputtype="file"name="examPaperKey"id="examPaperKey"><p><inputtype="submit"name="submit"value="确定"></form>通过action=”doCsvInfo.jsp”来提交到doCsvInfo.jsp这个页面来处理。样卷和样卷答案的导入如图5-1所示:图5-1选择导入文件首先在doCsvInfo.jsp.jsp这个页面中首先获取样卷和样卷答案的路径:StringexamPaperPath=request.getParameter("examPaper");/*获取样卷路径*/StringexamPaperKeyPath=request.getParameter("examPaperKey");/*获取样卷答案路径*/然后通过这个路径对csv文件进行解析,这是对样卷csv文件的解析:******解析样卷csv文件******CSVAnalysiscsvAna=newCSVAnalysis(examPaperPath);//新建解析CSV文件路径csvAna.setConvertFlag(true);ArrayListal=csvAna.analysis();//新建一个可变长数组来存放解析结果String[][]a=newString[al.size()][9];//新建一个数组来存放解析结果for(inti=0;i<al.size();i++){//外循环控制行ArrayListal1=(ArrayList)al.get(i);for(intj=0;j<al1.size();j++){//内循环控制列//out.print(al1.get(j)+"|"); //String[][]a=newString[al.size()][al1.size()];a[i][j]=(String)al1.get(j);//把解析的数据存放到二维数组中 //out.print(a[i][j]+"|");} //out.print("==");}csvAna.close();//关闭解析然后导入到数据库中的表ePaper中:******将样卷导入到数据库中******for(inti=0;i<al.size();i++){StringeId=a[i][0];/*获取试卷编号*///out.print(eId);StringawordID=a[i][1];/*获取字号*/StringwordID=a[i][2];/*获取词号*/Stringarticle1ID=a[i][3];/*获取文章一编号*/Stringarticle2ID=a[i][4];/*获取文章二编号*/Stringspeak1ID=a[i][5];/*获取命题说话一编号*/Stringspeak2ID=a[i][6];/*获取命题说话二编号*/Stringsorce=a[i][7];/*获取最终分数*/Stringrank=a[i][8];Stringinsertsql="insertintoePaper(eId,awordID,wordID,article1ID,article2ID,speak1ID,speak2ID,sorce,rank)values('"+eId+"','"+awordID+"','"+wordID+"','"+article1ID+"','"+article2ID+"','"+speak1ID+"','"+speak2ID+"','"+sorce+"','"+rank+"')";/*将个数据项插入到表ePaper*/Bean.executeUpdate(insertsql);/*插入记录*/}以上是将样卷解析并导入到数据库中,样卷答案的解析与导入用相似的方法即可。******解析样卷答案csv文件******CSVAnalysiscsvAna2=newCSVAnalysis(examPaperKeyPath);//新建解析路径csvAna2.setConvertFlag(true);ArrayListal2=csvAna2.analysis();//新建一个可变长数组来存放解析结果String[][]b=newString[al2.size()][3];//新建一个数组来存放解析结果for(inti=0;i<al2.size();i++){//外循环控制行ArrayListal3=(ArrayList)al2.get(i);for(intj=0;j<al3.size();j++){//内循环控制列b[i][j]=(String)al3.get(j);//把解析的数据存放到二维数组中 //out.print(b[i][j]+"|");}}csvAna.close();//关闭解析******将样卷答案导入到数据库中******for(inti=0;i<al2.size();i++){StringeID=b[i][0];/*获取样卷编号*///out.print(eID);StringerrorAword=b[i][1];/*获取错字信息*///out.print(errorAword);StringerrorWord=b[i][2];/*获取错词信息*/Stringinsertsql2="insertintoePaperKey(eID,errorAword,errorWord)values('"+eID+"','"+errorAword+"','"+errorWord+"')";/*将记录插入到表中*/Bean.executeUpdate(insertsql2);/*插入记录*/}这样就完成了样卷和样卷答案的导入工作了。5.3样卷和样卷答案查看与说明这个模块的主要功能是查看导入的样卷和对应的答案。在csvView.jsp中查看样卷信息。<%Stringsql="select*fromePaper";/*查找所有试卷信息*/ResultSetrs=Bean.executeQuery(sql);while(rs.next()){StringeId=rs.getString(1);/*获取试卷编号*/ StringawordID=rs.getString(2);/*获取字号*/ StringwordID=rs.getString(3);/*获取词编号*/ Stringarticle1ID=rs.getString(4);/*获取文章一编号*/ Stringarticle2ID=rs.getString(5);/*获取文章二编号*/ Stringspeak1ID=rs.getString(6);/*获取命题说话一编号*/ Stringspeak2ID=rs.getString(7);/*获取命题说话二编号*/ Stringsorce=rs.getString(8);/*获取最终分数*/ floatnewsorce=Float.valueOf(sorce).floatValue();/*将分数转化为float型*/%><tr><td><ahref="csvEpaperKey.jsp?eId=<%=eId%>"target="_blank"><%=eId%></a></td><td><%=awordID%></td><td><%=wordID%></td><td><%=article1ID%></td><td><%=article2ID%></td><td><%=speak1ID%></td><td><%=speak2ID%></td><td><%=newsorce%></td></tr><%}根据试卷号来查看相应的样卷答案:<ahref="csvEpaperKey.jsp?eId=<%=eId%>"target="_blank"><%=eId%></a>eId作为参数传递到csvEpaperKey.jsp这个页面中。查看样卷显示如图5-2所示:图5-2查看样卷点击试卷编号就跳转到csvEpaperKey.jsp页面中。首先获取试卷号。StringeID=request.getParameter("eId");然后就能根据这个试卷号找到相应的试卷答案:Stringsql="select*fromePaperKeywhereeID='"+eID+"'";ResultSetrs=Bean.executeQuery(sql);while(rs.next()){StringerrorAword=rs.getString("errorAword");StringerrorWord=rs.getString("errorWord");%>试卷编号:<%=eID%><p>第一部分错的字:<%=errorAword%><p>第二部分错的词:<%=errorWord%><%}查看样卷答案显示如图5-3所示:图5-3样卷答案这些错字错词信息说明放在样卷说明中。KT是分词符号。字的错误:KF后的内容不用处理,KF前的规则:江1表示"江"缺陷,江2表示"江"错误。词的错误:KF后不必处理,电1磁1波KT加1塞儿KT小熊儿21KT表示第一词是电磁波其中"电1"电缺陷"磁1""磁"缺陷为2错误"小熊儿21"表示"熊儿2"是儿化读音当一个音处理后面的1表示这个儿化音缺陷如小熊儿22表示儿化音错误。5.4本章小结这章主要是把csv格式的文件导入到数据库中,利用对csv的解析然后把解析后的数据存放到指定的数组当中,最后再把数组中的数据导入到数据库中。这里也有2个问题需要讨论:第一个问题就是页面之间跳转后产生的接收数据的乱码问题,这种乱码的原因是应为没有在页面里指定使用的字符集编码,只要在页面开始地方用下面代码指定字符集编码即可。第二个问题就是利用框架做分栏的时候,要注意分栏的比例控制。第6章测试员测试情况统计模块设计与实现6.1测试员测试情况统计模块设计这个模块的主要功能是统计测试员的测试情况。表t_examPaperJudge是用来存放测试员的测试试卷的信息的。表t_judgeInfo和表judger是用来存放测试员的信息。表countTemple1,countTemple2是用来存放临时信息的。表6-1t_examPaperJudge表列名数据类型长度允许空examPaperID(主键)nvarchar50否judge1IDnvarchar50是GetTimedatetime8是SubmitTimedatetime8是judge1Resultfloat8是judge2IDnvarchar50是judge2Resultfloat8是arbitratorIDnvarchar50是arbitratorResultfloat8是表6-2judger表列名数据类型长度允许空ID(主键)char10否namevarchar50是tidchar10是sfzvarchar50是agevarchar50是sexvarchar50是workPlacevarchar50是phonevarchar50是eMailvarchar50是judgerRankvarchar50是表6-3part表列名数据类型长度允许空exampaperIdvarchar50否idvarchar50是getTimevarchar50是submitTimevarchar50是result1varchar50是finalResultvarchar50是Tcount.jsp就是用来显示全部的测试员测试情况,如图6-1所示:图6-1测试员测试情况实现方法为首先查询所有测试员的测试编号,然后以测试员编号作为循环条件来得到每个测试员的测试信息,再通过测试员编号来查找符合的数据存放到countTemple1表中,最后从countTemple1表中来计算每个测试员的测试情况。查询所有测试员编号:Stringsql="select*fromjudger";ResultSetrs=Bean.executeQuery(sql);循环查找符合测试员编号的测试信息:while(rs.next()){Stringbianhao=rs.getString("ID");//得到测试员编号StringjudgeName=rs.getString("name"); Stringid=rs.getString("tid"); StringjudgerRank=rs.getString("judgerRank");//<!--把judge1ID为id的数据插入到表countTemple1中--> Stringsql1="select*fromt_examPaperJudgewherejudge1ID='"+id+"'";ResultSetrs1=Bean.executeQuery(sql1);while(rs1.next()){ StringexamPaperId=rs1.getString(1);StringgetTime=rs1.getString(4); StringsubmitTime=rs1.getString(5); floatresult=rs1.getFloat(6); floatfinalResult=rs1.getFloat(16); if(finalResult==0){ finalResult=result; }//if结束 Stringinsertsql1="insertintocountTemple1(exampaperID,testTime,testR,result)values('"+examPaperId+"','"+getTime+"','"+result+"','"+finalResult+"')"; Bean.executeUpdate(insertsql1); }//while结束//<!--把judge2ID为id的数据插入到表countTemple1中--> Stringsql2="select*fromt_examPaperJudgewherejudge2ID='"+id+"'"; ResultSetrs2=Bean.executeQuery(sql2); while(rs2.next()){ StringexamPaperId=rs2.getString(1); StringgetTime=rs2.getString(9); StringsubmitTime=rs2.getString(10); floatresult=rs2.getFloat(11); floatfinalResult=rs2.getFloat(16); if(finalResult==0){ finalResult=result; }//if结束 Stringinsertsql2="insertintocountTemple1(exampaperID,testTime,testR,result)values('"+examPaperId+"','"+getTime+"','"+result+"','"+finalResult+"')"; Bean.executeUpdate(insertsql2); }//while结束 //<!--把arbitratorID为id的数据插入到表countTemple1中--> Stringsql3="select*fromt_examPaperJudgewherearbitratorID='"+id+"'";ResultSetrs3=Bean.executeQuery(sql3); while(rs3.next()){ StringexamPaperId=rs3.getString(1); StringgetTime=rs3.getString(14); StringsubmitTime=rs3.getString(15); floatresult=rs3.getFloat(16); Stringinsertsql3="insertintocountTemple1(exampaperID,testTime,testR,result)values('"+examPaperId+"','"+getTime+"',"+result+"','"+result+"')"; Bean.executeUpdate(insertsql3);}//while结束从countTemple1表中来计算每个测试员的测试情况:Stringsql_count="select*fromcountTemple1"; ResultSetrs_count=Bean.executeQuery(sql_count); inti=0; intcount=0; while(rs_count.next()){ StringtestR=rs_count.getString("testR"); Stringresult=rs_count.getString("result"); judgeScorejs=newjudgeScore(); Stringflag=js.judge(testR,result);//判断测试是否正确 count++;//计算总共的测试数目 if(flag.equals("正确")){ i++;//计算测试正确的数目 } } Stringdelsql="deletefromcountTemple1";//删除countTemple1表中的数据Bean.executeUpdate(delsql);//执行删除 floatzql=(float)i/(float)count;//计算测试正确率 Stringszql=""+zql;//把float变成字符串型 if(szql.length()>5)//判断是否字符串长度大于5 szql=szql.substring(0,5);//如果是就只取其面5个保留3位有效数用户可以通过点击测试员的姓名来获取该测试员的个人信息如图6-2所示:图6-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论