分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019 2020 2021

资源列表

  • 基于Java实现的PL/0文法分析器-词法分析、语法分析、语义分析

    一 需求分析本工程实现了对PL/0源代码的词法分析,语法分析,语义分析及生成Pcode代码,还对Pcode的代码进行了解释,使其能在Java虚拟机上运行。
    功能要求如下:

    输入:符合PL/0文法的源程序
    输出:P-Code
    错误信息。
    P-Code指令集。
    语法分析部分要求统一使用递归下降子程序法实现。

    PL/0文法的EBNF所示:

    <程序> ::=<分程序>.
    <分程序> ::=[<常量说明部分>][变量说明部分>][<过程说明部分>]<语句>
    <常量说明部分>::= const<常量定义>{,<常量定义>};
    <常量定义> ::=<标识符>=<无符号整数>
    <无符号整数>::= <数字>{<数字>}
    <标识符> ::=<字母>{<字母>|<数字>}
    <变量说明部分>::=var<标识符>{,<标识符>};
    <过程说明部分>::= <过程首部><分程序>;{<过程说明部分>}
    <过程首部> ::=procedure<标识符>;
    <语句> ::=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<重复语句>|<空>
    <赋值语句> ::=<标识符>:=<表达式>
    <表达式> ::=[+|-]<项>{<加法运算符><项>}
    <项> ::=<因子>{<乘法运算符><因子>}
    <因子> ::=<标识符>|<无符号整数>|’(‘<表达式>’)‘
    <加法运算符>::= +|-
    <乘法运算符>::= *|/
    <条件> ::=<表达式><关系运算符><表达式>|odd<表达式>
    <关系运算符>::= =|<>|<|<=|>|>=
    <条件语句> ::=if<条件>then<语句>[else<语句>]
    <当型循环语句>::= while<条件>do<语句>
    <过程调用语句>::= call<标识符>
    <复合语句> ::=begin<语句>{;<语句>}end
    <重复语句> ::=repeat<语句>{;<语句>}until<条件>
    <读语句> ::=read’(‘<标识符>{,<标识符>}’)‘
    <写语句> ::=write’(‘<标识符>{,<标识符>}’)‘
    <字母> ::=a|b|…|X|Y|Z
    <数字> ::=0|1|2|…|8|9.

    二 程序设计一个经典的编译程序一般包括7个部分:词法分析,语法分析,语义分析及代码生成,代码优化(可省略),代码执行,符号表管理,出错管理。这7个部分之间的关联关系如下图所示:

    三 程序实现3.1 编译过程本项目将整个编译过程分为了3个部分:

    词法分析将Pl/0源代码分为一个个token
    语法分析和语义分析同时进行,生成Pcode(包括符号表管理和出错管理)
    对Pcode进行解释执行,使其在java虚拟机上能够运行

    整个编译过程可以如下图所示:

    3.2 词法分析PL/0编译系统中所有的字符,字符串的类型为,如下表格:



    保留字

    begin, end, if,then, else, const, procedure, var,do,while, call,read, write, repeat, until




    算数运算符

    + ,—,*,/


    比较运算符

    <> , < ,<= , >, >= ,=


    赋值符

    := , =


    标识符

    变量名,过程名,常数名


    常数

    10,25等整数


    界符

    ‘,’,‘.’,‘;’,‘(’,‘)’


    其他符号

    :,EOF



    每个token的结构定义如下:
    public class Token { private SymType st; //token的类别 private int line; //token所在行,错误处理使用 private String value; //token的值,只有标识符和常量有值}
    LexAnalysis.java是本项目的词法分析类。其中,doAnalysis()函数对源代码进行了一遍遍历,将源代码中分析成为了一个token数组。下面重点介绍每一个Token的分析程序analysis()。
    状态转换图如下:

    具体代码实现如下:
    private Token analysis() { strToken = ""; getChar(); while ((ch == ' ' || ch == '\n' || ch == '\t' || ch == '\0') && searchPtr < buffer.length) { if (ch == '\n') { line++; } getChar(); } if (ch == '$' && searchPtr >= buffer.length) { //到达文件末尾 return new Token(SymType.EOF, line, "-1"); } if (isLetter()) { //首位为字母,可能为保留字或者变量名 while (isLetter() || isDigit()) { strToken += ch; getChar(); } retract(); for (int i = 0; i < keyWords.length; i++) { if (strToken.equals(keyWords[i])) { //说明是保留字 return new Token(SymType.values()[i], line, "-"); } } //不是保留字,则为标识符,需要保存值 return new Token(SymType.SYM, line, strToken); } else if (isDigit()) { //首位为数字,即为整数 while (isDigit()) { strToken += ch; getChar(); } retract(); return new Token(SymType.CONST, line, strToken); } else if (ch == '=') { //等号 return new Token(SymType.EQU, line, "-"); } else if (ch == '+') { //加号 return new Token(SymType.ADD, line, "-"); } else if (ch == '-') { //减号 return new Token(SymType.SUB, line, "-"); } else if (ch == '*') { //乘号 return new Token(SymType.MUL, line, "-"); } else if (ch == '/') { //除号 return new Token(SymType.DIV, line, "-"); } else if (ch == '<') { //小于或不等于或小于等于 getChar(); if (ch == '=') { return new Token(SymType.LESE, line, "-"); } else if (ch == '>') { return new Token(SymType.NEQE, line, "-"); } else { retract(); return new Token(SymType.LES, line, "-"); } } else if (ch == '>') { //大于或大于等于 getChar(); if (ch == '=') { return new Token(SymType.LARE, line, "-"); } else { retract(); return new Token(SymType.LAR, line, "-"); } } else if (ch == ',') { //逗号 return new Token(SymType.COMMA, line, "-"); } else if (ch == ';') { //分号 return new Token(SymType.SEMIC, line, "-"); } else if (ch == '.') { //点 return new Token(SymType.POI, line, "-"); } else if (ch == '(') { //左括号 return new Token(SymType.LBR, line, "-"); } else if (ch == ')') { //右括号 return new Token(SymType.RBR, line, "-"); } else if (ch == ':') { //赋值号 getChar(); if (ch == '=') { return new Token(SymType.CEQU, line, "-"); } else { retract(); return new Token(SymType.COL, line, "-"); } } return new Token(SymType.EOF, line, "-"); }
    3.3 符号表管理符号表结构如下:
    public class PerSymbol { private int type; //表示常量、变量或过程 private int value; //表示常量或变量的值 private int level; //嵌套层次 private int address; //相对于所在嵌套过程基地址的地址 private int size; //表示常量,变量,过程所占的大小(这一项其实默认为0, 并没有用到) private String name; //变量、常量或过程名}
    我们可以看到,每个symbol明显要比token复杂的多,相关变量也复杂的多。其中level和address在运行时起到非常大的作用。
    各函数名功能表示如下表:



    函数名
    功能




    enterConst
    向符号表中插入常量


    enterVar
    向符号表中插入变量


    enterProc
    向符号表中插入过程


    isNowExists
    在符号表当前层查找变量是否存在


    isPreExists
    在符号表之前层查找符号是否存在


    getSymbol
    按名称查找变量


    getLevelProc
    查找当前层所在的过程



    3.4 语法分析和语义分析本项目使用了递归下降子程序法,对每一个PL/0中的语法成分都进行了分析,并单独编写为一个过程。
    各函数名功能表示如下表:



    函数名
    功能




    program()
    <主程序>::=<分程序>.


    block()
    <分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>


    conDeclare()
    <常量说明部分>::=const <常量定义>{,<常量定义>}


    conHandle()
    <常量定义>::=<标识符>=<无符号整数>


    varDeclare()
    <变量说明部分>::=var<标识符>{,<标识符>}


    proc()
    <过程说明部分>::=<过程首部><分程序>{;<过程说明部分>}; <过程首部>::=procedure<标识符>;


    body()
    <复合语句>::=begin<语句>{;<语句>}end


    statement()
    <语句>::=<赋值语句> \
    <条件语句> \
    <当循环语句> \
    <过程调用语句> \
    < 复合语句> \
    <读语句> \
    <写语句> \
    <空>


    condition()
    <条件>::=<表达式><关系运算符><表达式> \
    odd<表达式>


    expression()
    <表达式>::=[+\
    -]<项>{<加法运算符><项>} <加法运算符>::=+\
    -


    term()
    <项>::=<因子>{<乘法运算符><因子>} <乘法运算符>::=*\
    /


    factor()
    <因子>::=<标识符> \
    <无符号整数> \
    ‘(‘<表达式>’)’



    其中每个语法成分的分析按照语法图进行,并同时进行符号表管理及Pcode代码生成。
    程序语法描述图如下:

    分程序语法描述图如下:

    项语法描述图如下:

    因子语法描述图如下:
    3.5 Pcode生成P-code 语言:一种栈式机的语言。此类栈式机没有累加器和通用寄存器,有一个栈式存储器,有四个控制寄存器(指令寄存器 I,指令地址寄存器 P,栈顶寄存器 T和基址寄存器B),算术逻辑运算都在栈顶进行。
    指令格式:



    F
    L
    A










    F:操作码
    L:层次差 (标识符引用层减去定义层)
    A:不同的指令含义不同

    P-code 指令的具体含义如下表:



    指令
    具体含义




    LIT 0, a
    取常量a放到数据栈栈顶


    OPR 0, a
    执行运算,a表示执行何种运算(+ - * /)


    LOD l, a
    取变量放到数据栈栈顶(相对地址为a,层次差为l)


    STO l, a
    将数据栈栈顶内容存入变量(相对地址为a,层次差为l)


    CAL l, a
    调用过程(入口指令地址为a,层次差为l)


    INT 0, a
    数据栈栈顶指针增加a


    JMP 0, a
    无条件转移到指令地址a


    JPC 0, a
    条件转移到指令地址a


    OPR 0 0
    过程调用结束后,返回调用点并退栈


    OPR 0 1
    栈顶元素取反


    OPR 0 2
    次栈顶与栈顶相加,退两个栈元素,结果值进栈


    OPR 0 3
    次栈顶减去栈顶,退两个栈元素,结果值进栈


    OPR 0 4
    次栈顶乘以栈顶,退两个栈元素,结果值进栈


    OPR 0 5
    次栈顶除以栈顶,退两个栈元素,结果值进栈


    OPR 0 6
    栈顶元素的奇偶判断,结果值在栈顶


    OPR 0 7



    OPR 0 8
    次栈顶与栈顶是否相等,退两个栈元素,结果值进栈


    OPR 0 9
    次栈顶与栈顶是否不等,退两个栈元素,结果值进栈


    OPR 0 10
    次栈顶是否小于栈顶,退两个栈元素,结果值进栈


    OPR 0 11
    次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈


    OPR 0 12
    次栈顶是否大于栈顶,退两个栈元素,结果值进栈


    OPR 0 13
    次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈


    OPR 0 14
    栈顶值输出至屏幕


    OPR 0 15
    屏幕输出换行


    OPR 0 16
    从命令行读入一个输入置于栈顶



    3.6 出错管理本项目将错误分为24类,其中包含了语法错误和语义错误。以下是出错信息表:



    PL/0语言的出错信息表





    出错编号
    出错原因


    -1
    常量定义不是const开头,变量定义不是var开头


    0
    缺少分号


    1
    标识符不合法


    2
    不合法的比较符


    3
    常量赋值没用=


    4
    缺少(


    5
    缺少)


    6
    缺少begin


    7
    缺少end’。


    8
    缺少then。


    9
    缺少do


    10
    call, write, read语句中,不存在标识符


    11
    该标识符不是proc类型


    12
    read, write语句中,该标识符不是var类型


    13
    赋值语句中,该标识符不是var类型


    14
    赋值语句中,该标识符不存在


    15
    该标识符已存在


    16
    调用函数参数错误


    17
    缺少.


    18
    多余代码


    19
    缺少until


    20
    赋值符应为:=


    21
    until前多了;


    22
    缺少,



    四 运行测试本项目共提供了5个 测试用例,详见附件。
    Demo1.txt,demo2.txt, demo3.txt为书上代码,分别实现了鸡兔同笼问题,求最大公约数和最小公倍数以及找素数功能。Demo4.txt存在一些明显的语法错误, demo5.txt则存在语义错误。
    3 评论 84 下载 2018-10-30 19:39:58 下载需要9点积分
  • 基于JAVA实现的基于DFA的词法分析程序

    1 实验目的根据自己确定的正规表达式,编写、调试一个词法分析程序,对语句进行词法分析,从而更好理解词法分析原理。
    2 内容描述此程序用java编写。程序读取一个文本文件,并对其中的内容进行词法分析,此程序实现了对java程序简单的词法识别,可识别一部分保留字、标识符、操作符,一部分标点符号,同时可以识别行注释(形如//)和块状注释(形如/**/)。最终将识别的token写入指定文件名的文件,输出格式为{“type=”,”code=”,”error=”},对不符合可识别格式的字符进行错误处理。
    3 思路方法
    针对要识别的单词符号写出正则表达式
    构造出每个正则表达式对应的NFA
    合并所有NFA,并化简为DFA
    基于DFA编写代码
    代码思路参考核心算法部分

    4 假设
    AR1:保留字的优先级高于标识符
    AR2:输入的文件是正常的简单的java程序
    AR2:输入的java程序有大小限制,代码行数限制约20行及以内。

    5 DFA描述5.1 RE
    定义 a -> [a-zA-Z], d->[0-9], c为其他字符, ^*表示除*以为的字符,^/同理
    标识符/保留字:(a)(a|d)*
    数字: ((-)(d)*(.)( d)*)|( d)*|(-)( d)*|( (d)*(.)( d)*)
    块注释(*表示为#): /# ( (^#^/)*|(#(^/)*)*|((^#)*/)* )* #/
    行注释://(a|b|c)*(\n)

    其他符号的较为简单,这里不再一一列出。
    5.2 DFA
    6 数据结构定义6.1 类Token
    其中type有Number(数字), Note(行注释), ID,BlockNote(块注释), ReservedWord(保留字), Operater(操作符), Punctuation(标点), Other(其他)。
    6.2 类Word记录每次扫描的字符组成的单词。

    6.3 类Analyser扫描算法的主要执行类。

    7 算法描述程序主要的方法有:

    readCode ()—-从java中读取字符流,并存入codes数组中
    analyse(int state, Word word, int index)—-扫描codes数组,以DFA为标准循环提取其中的保留字、标识符、操作符、标点符号,并存入token列表。方法采取循环,state为当前在DFA中的状态,word为识别到一半的单词,index为codes数组的读指针。根据DFA中的状态流向决定程序每次循环下一次的走向
    saveResult()—-将扫描获得的token序列写入文本文件

    8 运行截图输入文件内容如下:

    输出文件内容如下:

    9 问题与解决
    关于块状注释的识别,遇到*需要确定后一个字符是否/,后一个字符对其判断有影响,目前只能预读取后一个字符进行判断,赞未找到更好的方法
    扫描一开始采用递归,在文件字符过长时,会出现stackoverflow的错误。随后将递归改为了while循环,解决了问题
    2 评论 57 下载 2018-11-19 18:54:41 下载需要10点积分
  • 基于Java和MySql实现的图书管理系统

    第一章 课题概述1.1 选题背景及意义图书管理系统主要用于图书馆的图书管理、读者管理、借阅信息管理。本图书管理系统以JAVA为开发语言,根据业务逻辑实现了相关功能,利用Swing开发了客户端图形界面,并使用Apache POI实现了报表生成功能。
    1.2 实验的主要工作本文就教普通用户及管理员可以使用的功能与权限进行分析,讲解图书管理系统的设计与实现。

    图书管理系统系统的需求分析。从两大角色介绍系统的业务需求,并说明接口需求以及该接口的目的
    用户和管理员与系统的交互设计。先描述系统的总体模块设计,然后从两个模块入手,分别介绍各个模块的设计
    图书管理系统相关功能的实现。从各个模块入手,介绍该模块的实现,包括用到的技术。使用MySQL技术,完成对数据的存储,查询等。使用Swing技术,完成对系统客户端的开发。使用Apache POI技术完成报表生成功能的开发
    图书管理系统的运行。根据不同的角色,按照各个角色的功能,介绍运行的结果

    1.3 实验报告的组织结构本文主要分为以下几个部分:

    第一章是绪论:主要介绍图书管理系统研究意义,研究背景,主要工作,章节安排等
    第二章是图书馆管理系统的需求分析:按总分总结构介绍系统的需求
    第三章是图书管理系统的设计:主要是对各个模块设计的分析,分析系统的功能和层次
    第四章是图书管理系统的实现:先描述数据库,接着对各个模块的实现进行介绍,主要包括其中的函数调用和接口
    第五章为系统测试:主要是图书管理系统的用例测试与接口测试

    第二章 需求分析2.1 系统总体需求本课题的目的是为高校开发一个图书管理系统。
    系统用例图

    整个系统分为2个模块。分别为:用户模块,管理员模块。主要用户分为两类,一个是普通用户,可以通过系统进行信息的填写提交、借书还书、续借缴费、个人信息查询、书籍信息查询等。另一个是管理员角色,通过系统可以帮助用户完成注册注销的功能,并能对图书进行管理(新书登记,旧书作废)。两个层次共同组成了图书管理系统。
    2.1.1 用户模块需求在该模块,涉及的主要角色是用户角色。
    用户模块用例图

    在用户模块,涉及了登录功能、图书借阅续借归还功能、书籍信息查询功能以及个人信息查询功能,对于用户角色,具体的用例说明如下表:



    用例
    功能




    登录
    通过注册的账号密码登录系统。


    基础信息填写
    填写基本信息,如:邮箱等。


    借书
    在押金足够的情况下可以借书


    还书
    还书时应判断是否超时,未超时则退还押金,超时则根据业务规则罚款


    续借
    未到归还日期时,如有需要可以续借,还书日期延长。


    查询用户信息
    用户自己查询自己的借书还书情况,押金剩余等等信息。


    查询书籍信息
    用户通过书籍名称查询书籍



    上表详细说明了在模块中,用户的需求,并针对用例图,说明了每个用例的功能。
    2.1.2 管理员模块需求管理员模块用例图




    用例
    功能




    缴费
    协助用户进行缴费


    新书登记,
    将书的相关信息记录入数据库中或从数据库中删除。


    旧书作废
    作废一定数目的旧书。


    登录
    通过管理员账号密码登录系统。


    查询书籍作者
    查询某本书的书籍作者。


    查询书籍价格
    查询某本书的书籍价格。


    查询书籍在库数量
    查询某本书的剩余数量。


    查询书籍总量
    查询某本书的总数量(含在库数量与借出数量)。


    查询书籍ISBN码
    查询某本书的国际标准书号。


    查询书籍编号
    查询某本书的图书馆内部编号,这个编号与放置的位置相关。


    借书
    在押金足够的情况下可以借书


    续借
    未到归还日期时,用户如有需要可以续借,收到信息后将还书日期延长。


    还书
    还书时应判断是否超时,未超时则退还押金,超时则根据业务规则罚款。



    上表详细说明了在模块中,管理员的作用,并针对用例图,说明了每个用例的功能。
    2.2 本章小结本章主要介绍了系统的需求分析,包括系统功能性需求,并通过使用用例图介绍了2个层次的功能,通过表格分析了用例图。
    第三章 图书管理系统系统设计本系统采用三层C/S架构,并采用了面向对象(OO)的风格。系统分为客户端(Client)和服务器端(Server)两个部分。在服务器端中,主线程负责监听端口及分配服务子线程,子线程利用面向对象中的多态,分别调用客户、管理员的处理函数,并对客户端的请求进行回复。客户端中,客户可以利用图形界面发起请求,客户端会根据服务器的返回信息进行提示,从而完成与客户的交互过程。
    3.1 总体系统功能设计本系统是基于Java开发的图书馆管理系统,用户登陆成功以后进入用户模块,可以完成用户的功能,如:借书还书续借缴费等。管理员登录成功进入管理员模块,可以协助用户完成:注销,缴费,退还押金等,同时还可以查询图书的相关信息并对图书进行管理。考虑到本系统的实际部署场景为图书馆内的自助借还电脑与管理员电脑,本系统仅需支持小规模的用户同时使用即可。本系统的总体设计如图3-1所示。
    图书管理系统模块设计图

    系统整体分为2个模块,分别是用户模块和管理员模块。用户模块主要包含登录系统,图书借阅管理、书籍信息查询、个人人信息查询功能,方便用户使用图书馆提供的服务;管理员模块主要包括登录系统、用户管理、书籍管理、书籍信息查询、个人信息查询功能;这两个模块组成了整个系统,完成了图书馆管理系统的一系列功能与服务。
    3.1.1 用户模块本项目为用户提供登陆的功能。当用户登录后,可以在界面上可以进行操作,完成图书的查询、借阅、续借、归还。除此之外,用户还可以查看书籍信息与个人信息等。模块中使用TCP Socket通信进行信息交互,将得到的字符串以约定方式解析后通过封装的前端组件进行展示。
    3.1.2 管理员模块本项目中管理员无需注册,登陆后可以协助用户进行缴费、注销等,同时管理员也可以进行借书、还书、续借、用户信息查询、书籍信息查询等操作。除此之外,管理员需要对书籍的信息进行管理,负责书籍的新书登记和旧书作废。此模块中使用TCP Socket通信进行信息交互,将得到的字符串以约定方式解析后通过封装的前端组件进行展示。
    3.2 体系结构设计本系统采用以三层C/S架构为主、面向对象为辅的混杂风格。系统分为客户端(Client)和服务器端(Server)两个部分。在服务器端中,主线程负责监听端口及分配服务子线程,子线程利用面向对象中的多态,分别调用客户、管理员的处理函数,并对客户端的请求进行回复。客户端中,客户可以利用图形界面发起请求,客户端会根据服务器的返回信息进行提示,从而完成与客户的交互过程。
    3.3 接口设计客户端与服务器端通信接口:遵循网络协议,满足局域网的通信需求。同时通过约定请求的消息类型,用于区分不同请求的解析方式与调用不同的方法。
    服务器端与MySQL数据库通信接口:利用JDBC与MySQL数据库进行通信,同时构建SQL类用于与数据库交互。SQL类中根据不同的功能提供数据库信息的增加、删除、更改、查询功能。实际调用时,使用SQL的单例化实例,传入相关数据,调用相应的API函数即可。
    3.4 本章小结本章主要介绍了该系统的设计。首先从总体出发,描述的系统的总体模块(用户和管理员),然后从2个模块详细分析他们的功能。在最后,并介绍了整体的设计风格和接口。
    第四章 图书管理系统系统的模块设计与实现4.1 数据库的设计本系统使用的数据库为MySQL,数据库名为BMS。数据库中有三个表,分别用于存储用户信息、书籍信息、借阅信息。其详细说明如下:
    4.1.1 用户信息表(user_information)

    User_account(String类型):用于存储用户账号
    Password(String类型):用于存储用户账号密码的实现
    email_address(String类型):用于存储用户的邮箱地址信息
    borrow_amount(Int类型):用于存储用户已经借阅的书本数量
    balance(Double类型):用于存储用户押金账户的余额

    4.1.2 书籍信息表(book_information)

    book_name(String类型):用于存储书籍名字
    directory_number(String类型):用于存储书籍的目录号
    ISBN(String类型):用于存储书籍的ISBN码
    Author(String类型):用于存储书籍的作者名
    amount_in_library (Int类型):用于存储书籍的在库数量
    amount(Int类型):用于存储书籍的总数
    price(Double类型):用于存储书籍的价格

    4.1.3 借阅信息表(borrow_information)

    borrow_user(String类型):用于存储本条借阅信息的借阅人
    book_name(String类型):用于存储本条借阅信息的书名
    borrow_date(Date类型):用于存储借出日期
    should_return_date(Date类型):用于存储书籍的应还日期
    renew(Boolean类型):用于存储此条借阅信息是否续借过

    4.2 用户模块的实现(侧重于服务器端的响应)
    通过主线程的start函数,启动服务器的服务,并对8080端口进行监听。当客户端尝试连接时,分配子线程进行响应。

    通过A型消息进行登录查证,并根据查证结果回复客户端并及时更新serverThread类中的currentPerson私有数据成员(currentPerson是父类person的指针,可以根据实例对象的不同进行多态调用。)服务器运行过程中会打印日志,用于监控服务器运行状态。


    功能实现举例:接受到K型消息时代表客户端发出续借请求,多态调用currentPerson.reBorrow函数即可利用SQL对象向数据库发出修改申请。同时会根据函数返回结果,回复客户端续借申请是否成功。客户端在接受到回复后,进行相应的提示。
    4.3 管理员模块的实现(侧重于服务器端的响应)
    通过主线程的start函数,启动服务器的服务,并对8080端口进行监听。当客户端尝试连接时,分配子线程进行响应。

    通过A型消息进行登录查证,并根据查证结果回复客户端并及时更新serverThread类中的currentPerson私有数据成员(currentPerson是父类person的指针,可以根据实例对象的不同进行多态调用。)服务器运行过程中会打印日志,用于监控服务器运行状态。


    功能举例:接收到L型消息时,代表管理员账户申请产生报表。多态调用urrentPerson.createReport函数,在这个函数中调用SQL类示例sql的产生报表函数。执行成功后,服务器回复客户端成功产生报表,客户端会提示管理员到服务器处查看报表。(由于报表中含有大量系统信息,出于安全考虑,我们决定不提供向客户端传送报表的API,以防止信息被简单地盗取。)
    4.4 本章小结本章主要介绍了系统的实现。介绍了实现时使用的关键性技术,并贴出了一些代码,以便理解。在介绍实现时,配上了完成的页面,与完成的页面相结合,更容易理解。
    第五章 系统测试5.1 外部界面测试 用户登录
    图书管理系统初始化界面,需要用户名和密码输入,用户和管理员可分别登录到对应个人界面。

    5.2 管理员内部界面测试管理员数据维护,首页默认为新书登记界面。
    添加书籍

    输入相应信息,点击确认上传按钮。
    旧书作废

    输入信息,点击确认按钮。
    查询用户信息

    输入用户名,键入回车,所需信息将在下面显示出来。
    查询图书信息

    输入书名,键入回车,所需信息将在下面显示出来。
    缴费

    输入用户信息和缴纳金额,点击确认按钮。
    注销

    输入要注销的用户名,键入回车,账号即注销,并显示当前余额数,进行相关操作。
    注册

    输入相应信息,点击确定注册按钮,并提示注册成功。
    报表

    点击菜单栏的报表按钮,生成报表。
    退出
    点击后显示退出成功直接返回上一层登陆界面。
    5.3 用户界面测试
    初始界面状态,用户选择操作菜单里的操作。
    借书

    用户选择一本可以借的书进行操作,否则会出现书籍被借走的情况。
    还书

    默认用户的书本还书成功,所以实际会根据实际书本的情况在数据库进行操作。
    续借

    用户选择要借的书本进行续借,这里也是和还书一个操作。
    书籍查询

    查询书籍信息,点击确认查询,返回信息。
    查询个人信息

    点击查询,将用户当前信息返回。
    第六章 实验小结本次实验中,我们设计、架构、实现、测试了图书管理系统,基本完成了实验的要求。从此次实验中我们也有了很多的收获和感悟。

    首先,我们明白了前期需求分析对项目后期实现的重大影响,前期的需求分析直接决定了架构风格、架构方式、实现技术的选择等诸多问题。从这次实验中,我们体会到了前期需求分析的重要性,了解了需求分析的基本方法和流程
    其次,我们了解到了架构设计对一个系统的重要性。好的架构应该是结构可靠、可用、安全、可修改、可变的,一个好的架构往往能降低后期实现与维护的难度和成本。由于本次的实验没有使用现成的web框架,因此需要我们自行搭建系统的框架。在我们小组成员的努力下,我们认为我们完成的系统框架基本满足具有良好延展性、高内聚低耦合的特点
    同时,此次实验中我们实践了上个学期UML课程的相关知识,使用了用例图进行用例分析,使用了包图、类图明确系统架构与接口。这些UML技术的使用,极大地方便我们展现系统的架构,也成功地帮助开发人员理解架构设计与实现方法
    最后,我们体会到了架构风格的选取对实现的重要性。我们选取的三层C/S分层架构。不同层之间的解耦合使得不同层之间可以独立开发,最后再进行统一的接口对接和集中测试。这个特点使得开发人员的工作效率极大的提高。事实上,我们的功能层开发进度是略慢于表现层的,但表现层的进度并没有被拖慢,而是提前于计划完成开发,这无疑得益于三层C/S架构层与层之间的解耦合。同时,面向对象(OO)的使用,使得我们系统更加简洁,也使得系统在日后的拓展更为方便
    2 评论 17 下载 2021-02-28 09:29:52 下载需要10点积分
  • 基于有限自动机的词法分析器构造

    一、目标本次实验的主要目的是对自定义的程序语言的词法分析器程序构造,我从 C 语言当中选择了部分具有代表性的子集,实现词法分析器,主要是对编译原理课程中学习的从正则达式转化为 NFA,再从 NFA 转化为 DFA 以及后续的代码生成的过程有更深刻的认识。同时,也希望对于在编译原理课程中所体现出的计算机科学当中的一些朴素而优美的思想有更多的体会。
    二、内容概述本报告主要描述了一个简单的词法分析器构造过程,包括最终成品的功能概要,实现过程中的理论推导,具体的核心算法和数据结构的描述,以及个人的收获和体会。
    三、实验环境
    操作系统 Win8.1实验的编译器 eclipse编码格式 Utf-8
    3.1 语言定义3.1.1 记号定义3.1.1.1 保留字我选择了 C 语言当中一部分具有代表性的保留字,同时为了保持整个编译原理课程实验的延续性和后续语义分析的实验内容,选择的保留字能够涵盖程序设计中的顺序、分支、和循环结构,这样也可以很好的对正则表达式当中的三种基本运算连接、或、闭包运算形成很好的对应,除此之外,选择了能够形成对函数调用,变量声明进行支持的部分保留字。具体选择的保留字有如下几个:
    else, if,int,double,char,do,continue,break,float, return, void, while,for
    3.1.1.2 特殊符号
    算术运算符:+、-、*、/
    比较运算符:<、<=、>、>=、==、!=
    分割符号:;、,
    括号:()、[]、{}
    数字:支持整数int,浮点数doule、float、char

    四、思路和方法首先,依据复杂性,把上文定义的 lexeme patterns 进行分类,我一共把它们分为三种类别,一种是简单的 lexeme patterns,包括所有单个字符且不成为任意其他任何 pattern 的前缀的 pattern;第二种是其正则表达式是有限长度的子序列的 pattern,也即其自动机不包含回路的情况;第三种是正则表达式子序列的长度可以是无限的 pattern,也就是其有限自动机包含回路,这种分类可以便于基于不同复杂度进行分别处理。
    对于第一种类型的 pattern,为其定义对应的 toekn 枚举类型为



    符号
    Token type 枚举变量




    +
    PLUS


    -
    MINES


    *
    MUTIPLY


    /
    DIVISION


    (
    LPAREN


    )
    RPAREN


    ;
    SEMI


    ,
    COMMA


    [
    LSQUARE


    ]
    RSQUARE


    {
    LBRACE


    }
    RBRACE


    !=
    NEQ


    <
    LT


    <=
    LTE


    >
    GT


    >=
    GTE


    ==
    EQ


    整数
    INT


    整数
    DOUBLE


    保留字
    KEY_WORD



    程序的大致流程是,从文件当中读入源文件,一次读取一行进行解析,忽略空白,然后依次对一行的缓存当中的每一个字符进行扫描,由状态机进行匹配,返回识别的 token以及具体信息或者报出错误提示。
    五、相关有限自动机描述对于数字:

    num—->INT|DOUBLEINT—>digit dight*DOUBLE—>dight*digit*.dightdigit*digit—>0|1|2|3|4|5|6|7|8|9

    在实现时,一旦检测到 digit,就进入 INNUM 状态,自此之后,程序将不对新扫描的digit 进行存储和输出,直到遇到一个非 digit 为止,此时 INNUM 状态转变为 DONE 状态,对缓存的数字进行输出,并把 token 类型定义为 NUM
    对于保留字和变量:本程序包含以下划线或者字母开头,包含数字或者字母的变量名,其正则表达式如下:

    digit—>0|1|2|3|4|5|6|7|8|9Leter—>[a-z]|[A-Z]Identifier—>(letter|_)(digit|leter|_)*

    一旦扫描到字母就进入 INID状态,此后不保存当前字符,知道遇到第一个非数字和字母的字符为止。对于任意一个识别出的字母序列,都要在保留字列表里面进行查找,用于发现是否在表保留字当中,不是就返回ID,否则就是keyWord。
    逻辑表达式符号:
    以>和>=为例子,正则表达式:GE → >,GTE→>=
    对这些转化为DFA,状态机如下

    而对于其他字符:
    以(和)为列子,Lparen→(,Rparen→) 其他的符号类似。

    六、核心算法描述这个词法分析器程序的核心算法就是 getToken()这个函数,它消耗字符并根据DFA 返回下一个被识别的记号。具体来说,getToken实现用 if语句对当前输入的ch进行下一次状态判断,在每个状态当中,再用Case语句对当前字符的特性进行判断,这个双重嵌套的情况分析就是对 DFA 的代码实现,识别了每个状态之后,在 case 语句下面进行是否存储当前字符,是否输出,是否回退等操。
    七、测试用例7.1 测试输入测试代码输入在项目中的program1.txt文件中。
    在这个测试用例当中,包括了多行注释,单行注释,有返回值为 int 的函数声明,有选择结构,循环结构,整形常量,标识符等,基本可以验证所有的特性。
    char c;int j=1;for(int i=0;i<10 && j!=5;i++){ j=j-1.123; double x=2.6; int a[10] x++; if(x>=6){ break; }}int lenth=10;while(length==0){ length--;}
    7.2 测试输出测试输出如下截图所示,同时打印出了行号,用于后续的错误跟踪信息的处理。如果是标识符就打印为 ID,输出标识符的内容,如果是保留字,就用KEY_WORD标志,整形数字用INT,浮点数字用DOUBLE,其余符号正常输出,也对应其标识符,可以看出,可以实现上文所述的特性。在测试时会在控制台打印出来,也会在项目中的result.txt文件中生成一份。

    八、困难与解决方案在实现过程中遇到的问题主要有系统的整体设计思路、保留字的处理、 对于需要回退情况的处理
    8.1 整体思路首先是将系统划分为输入,输出,得到 token,三个部分,这是一种非常经典的划分方式,也很好用。然后对和性的 getToken 进行处理。把 token 的识别放在一个函数当中,单独的函数处理比如读入字符,维护字符缓冲区,放回字符等内容,来隔离复杂度。每次处理一个char以后不是舍弃掉,因为是存在数组中,只是移动数组的下标来获取新的字符ch。
    8.2 保留字的处理关于保留字和标识符的冲突问题,这一点在龙书上就有叙述,在正则表达式的描述当中,保留字和标识符可以被不同的正则表达式匹配,比如if 和 while 的串既可以是标识符也可以是保留字,而正则表达式无法给出约束,所以要在程序语言定义中规定解释方式,而且是一个无二义性的规则,来处理所有可能出现二义性的情况。有两种典型的规则,一种是当串既可以是标识符也可以是关键字时,这种情况下我采取的是和龙书上所提把保留字预先存储在符号表当中(此处我用的是一个保留字数组进行存储,也即是一个字符串的数组),当新的标识符插入符号表的过程中发现此序列在符号表当中已经存在时,就认定此序列为保留字,改变其 token 的类型。
    8.3 回退处理对于判断一个数字的结尾,一个标识符的结尾,一个<符号而非<=的情况下,需要读入下一个字符,才能判断当前 tokenString的类型和状态已经到达了结束,但是这个提前读入的字符必须不能被消耗。我采取的处理方法是,我进行处理的方法是将字符放置于一个数组当中,设置一个表示处理当前字符的指向器p(就是数组的下标),然后当读出的字符不符合,不处理,下标不变,使用递归的方法调用当前的方法,传入将要处理的字符位置p。
    3 评论 133 下载 2018-11-02 16:09:30 下载需要9点积分
  • 基于SSM和MySQL的新闻管理系统设计与实现

    1 开发背景1.1 系统开发背景与意义个人博客是当今网络的热点,个人博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了博客文化。
    随着网络出版、发表和张贴文章等网络活动的急速增长,博客已经成为了一个指称这种网络出版和发表文章的专有名词。博客通常是由简短且经常更新的张贴构成,这些张贴的文章都按照年份和日期排列。博客的内容和目的有很大的不同,从对其他网站的超级链接和评论,到有关公司的新闻或构想,或者是个人的日记、照片、诗歌、散文,甚至科幻小说的发表或张贴。许多博客是个人将自己的想法表达出来,或者是一群人根据某个特定主题或共同目标进行合作,每个人都可以随时把自己的思想火花和灵感更新到博客站点之上。简言之,博客就是以网络作为载体,简单迅速便捷地发布自己的心得,及时有效轻松地与他人进行交流,再集丰富多彩的个性化展示于一体的综合性平台。
    1.2 研究内容新闻博客管理系统通过简洁、一目了然的方法进行界面设计,主界面上可以查询最新的新闻博客和其他操作,方便的查看各模块的详细明细等信息。
    研究的内容主要包括以下方面:
    该系统的开发主要包括后台数据库的建立、连接和维护以及前台网络页面的开发两大方面。由于Java的跨平台性、安全性等诸多优势,本论文采用Jsp+SSM+MYSQL的技术途径和规范全局设计开发流程,在Eclipse的开发环境下设计、编写新闻博客管理系统。
    该系统主要模块有用户管理、博客文章管理、日志管理、权限管理、查询统计管理、登录等六大功能模块,管理员主要是进行登陆后,对所有新闻博客信息进行管理编辑,可以上传新闻博客,按条件查询新闻博客信息,修改新闻博客信息,删除新闻博客信息,权限设置等等。
    1.3 文档的组织结构文档的组织结果安排如下:

    第一章绪论介绍了系统开发的背景与意义,对主要研究内容进行了说明,对文档的组织结构进行了阐述
    第二章主要讨论了系统的需求以及实现相关功能的关键技术和方法
    第三章对系统进行了业务建设与设计,对系统的用户角色和功能需求作了初步设计
    第四章主要对系统相关实现作了更详细的阐述,阐述了系统开发过程中所设计的代码、接口等
    第五章性能测试与分析
    第六章主要阐述了对系统的总结和展望
    最后为致谢与参考文献

    2 系统需求分析2.1 系统需求分析需求是软件开发的基础,也是研发团队进行系统开发的凭据。有资料指出在软件开发周期中,如果软件项目越新颖、所涉及的应用领域越偏僻,需求分析所占用的时间可以达到整个开发周期的一半以上,而如果是迭代式的开发模型,需求时间也不应该少于1/3。可见,软件需求的重要性不言而喻。然而在软件开发中,需求不明确,客户的参与度不高,沟通不及时,获取客户的信息不完整;无法理解某些领域的技术指标和概念;客户想法的多变性都会造成需求的变更,而一旦变更就会对软件的开发进度和整体结构产生影响,甚至是灾害性的重新设计。
    2.2 可行性分析2.2.1 经济可行性现在,计算机的价格已经十分低廉,性能却有了长足的进步。而本系统的开发,基本无需任何特殊的硬件配置,仅需一台普通的电脑。此系统可以为博客主提供很多便利,主要表现有以下几个方面:

    第一,本系统的运行更加轻量化,相比于WordPress更加简洁高效,节省更多资源
    第二,本系统的操作界面简洁,可以显著提高博客主的效率
    第三,本系统博客主可以完全掌控,可以使敏感文档更加安全

    本系统的开发所需的设备在现有条件下,只需要少量的投入资金就可以实现,并且借助云的弹性计算和分时租赁可以最大化降低成本开支,因此在经济上是可行的。
    2.2.2 技术可行性本系统采用的是JSP、ssm和MySQL开发,Windows 7操作系统,采用JDBC方式与后台数据库进行连接,完成数据的添加、修改、删除、查询等功能。由于JSP、ssm功能强大,而MySQL灵活易维护在开发方面具有方便快捷、使用灵活的特点,以及目前的广泛实际应用,因此使用JSP、ssm、MySQL是开发轻平台的最佳组合从而说明本系统在技术方面可行。
    硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。
    2.2.3 操作可行性操作可行性是指对开发出来的系统的界面是否美观、简洁易操作,是否有操作步骤提示、相关信息能否自动生成或更新等进行分析。操作是否顺畅很大程度上决定了系统的可行性和受欢迎度,总的来说,用户操作必须简便,系统需要有较好的人机交互,改善用户体验。本新闻博客管理系统采用的是目前较为流行的前端开发技术,界面简单美观,用户操作起来应该十分简单,因此,本新闻博客管理系统在界面操作方面也完全可行。
    2.3 功能分析
    系统管理:该模块主要是对系统的菜单信息、用户信息、用户权限信息进行有效管理,并实现按不同条件对这些数据进行查询的功能
    用户管理:该模块主要是对博客系统的多用户进行管理,允许用户自注册,允许不同的用户不同的角色和权限
    系统日志:该模块主要是管理员及其其他用户的所有操作进行日志记录,便于后期查看及排障
    新闻管理:该模块是整个新闻博客管理系统的核心,包含新闻编辑、新闻管理、分类管理、评论管理、阅读统计等多个功能

    2.5 信息需求分析通过对几个想要搭建自己博客网站的同学的调查分析,已经了解了一般的博客主对系统的一些要求,接下来将对博客主的使用情况进行系统分析,考虑到与计算机管理系统的交互性、复杂性和计算机本身的一些特点,在开发新闻博客管理系统时不能简单的对现有的博客系统进行模仿,而应根据一般博客主的真实需求和常用需求进行分类和汇总,通过逐步确认各主要功能的范围,先对主要功能系统分析解决,然后构建出系统的业务流程图和系统结构图。
    2.5 性能需求分析
    系统界面友好美观,操作简单易行,查询灵活方便
    新闻博客文章管理信息化,可随时掌握当前博客文章访问的情况
    系统维护方便可靠,有较高的安全性,满足实用性、先进性的要求
    提供多用户并发访问的能力,支持高并发

    3 系统设计3.1 系统概述新闻博客管理系统分为前台模块和后台模块两大部分。前台模块主要是用来浏览新闻博客信息的。后台模块是管理人员用来管理新闻博客信息的。
    新闻博客管理系统采用JAVA的三层架构开发,发布版本的运行环境包括:

    客户端:

    操作系统:Win7浏览器:谷歌浏览器
    服务器端:

    操作系统:windows server 2003应用服务器:Tomcat
    数据库服务器端:

    操作系统:windows server 2003数据库系统:MYSQL5.1

    3.2 系统功能
    3.3 数据库设计3.3.1 数据库概念设计本新闻博客管理系统包含多个数据库表项,根据每个数据表项分析得到如下E-R 图。
    用户表

    新闻表

    日志表

    评论表

    角色权限管理表

    3.3.2数据库逻辑设计本系统数据库名称为db_news_sys,一共有七张数据表,分别为用户表(如表3-6所示)、新闻博客分类表(如表3-7所示)、新闻博客文章表(如表3-8所示)、菜单管理信息表(如表3-9所示)、评论管理表(如表3-10所示)、系统日志信息表(如表3-11所示)、用户权限管理表(如表3-12所示)。
    用户表(tb_user)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    int
    Y
    N
    主键,用户ID


    username
    varchar(50)
    N
    N
    用户登录名


    password
    varchar(50)
    N
    N
    用户登录密码


    roleId
    int
    N
    N
    用户类别,是否为管理员


    photo
    varchar(128)
    Y
    N
    用户头像


    sex
    int(1)
    N
    N
    性别


    age
    int(3)
    N
    N
    年龄


    address
    varchar(128)
    Y
    N
    住址



    新闻博客分类表(tb_news_category)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    Int
    Y
    N
    主键,供应商ID


    name
    varchar(128)
    N
    N
    分类名称


    sort
    int
    N
    N
    分类排序,默认值0



    新闻博客文章表(tb_news)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    int
    Y
    N
    主键,文章ID


    categoryId
    int(11)
    N
    N
    文章分类ID


    title
    int(8)
    N
    N
    文章标题


    abstrs
    int(8)
    N
    N
    文章摘要


    tags
    datetime
    N
    N
    文章标签


    photo
    varchar
    N
    N
    文章需要的图片


    author
    Varchar
    N
    N
    文章作者


    content
    longtext
    N
    N
    文章内容


    viewNumber
    Int
    N
    N
    浏览次数


    commentNumber
    Int
    N
    N
    评论次数


    createTime
    Datetime
    N
    N
    创建时间



    菜单管理信息表(tb_menu)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    int
    Y
    N
    主键


    parentId
    int
    N
    N
    本菜单的父菜单的ID


    name
    int
    N
    N
    菜单名称


    url
    int
    N
    N
    菜单连接


    icon
    int
    N
    N
    菜单的图片



    评论关系表(tb_comment)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    int(11)
    Y
    N
    主键


    newsId
    int(11)
    N
    N
    用户类别ID


    nickname
    int(11)
    N
    N
    用户可以访问的菜单ID


    content
    varchar
    N
    N
    评论内容


    createTime
    datetime
    N
    N
    创建时间



    系统日志信息表(tb_log)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    int(11)
    Y
    N
    主键


    content
    varchar(255)
    N
    Y
    日志内容


    createTime
    datetime
    N
    Y
    销售时间



    用户权限管理表(tb_authority)表结构



    字段名称
    数据类型
    主键
    是否空
    说明




    id
    int(11)
    Y
    N
    主键


    roleId
    int(11)
    N
    N
    用户类别ID


    menuId
    int(11)
    N
    N
    用户可以访问的菜单ID



    4 系统实现4.1 系统开发规划新闻博客管理系统采用JAVA标准分层的基于组件模型设计。将处理过程拆分到不同的层级、不同服务、不同应用服务器中分别处理,使服务器资源得到更好的利用,解决网络传输时高并发的问题。
    新闻博客管理系统采用经典的三层结构,面向对象的JAVA语言和MYSQL数据库存储数据。三层框架包括了界面层、逻辑层和数据层。

    表现层:是系统数据来源和UI部分,承担用户操作与逻辑层之间的交互。在本层中实现前台页面的信息显示。后台登录和基本信息的管理操作。用户通过界面操作和业务逻辑层传输数据。逻辑层是整个系统的核心,它与这个系统的业务紧密相关
    数据层:其功能主要是负责数据库的访问。简单的说就是实现对数据表的Select, Insert, Update, Delete的操作。数据库的设计是在这一套开发系统中十分重要的,好的数据库建立可以让其更快的完成项目。整个数据库的创建是新闻交流系统开发和创立的核心技术,概括的说,就是根据用户的需求创立起满足用户的需要的数据库。数据库的整体设计是在软件开发是其最主要的问题

    4.2 开发语言简介4.2.1 JSP语言JSP本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
    JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
    4.2.2 EasyUIjQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签。
    4.2.3 SSM框架SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。
    Sping
    Spring是一个开源框架,是于2003年兴起的一个轻量级的Java开发框架由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。
    Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。但是,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
    SpringMVC
    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。pring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
    SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
    Mybatis
    MyBatis是一个基于Java的持久层框架,mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
    页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据
    4.2.4 JSPJSP本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
    JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
    4.2.5 MYSQL数据库MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
    自从Oracle公司收购了MySQL后不久,就发行了MySQL的企业版(不再免费)。
    4.2.6 JavaScriptJavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初由网景公司(Netscape)的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。
    Javascript语言与Java语言在语法上比较相似,但随着对Javascript的深入了解后你会发现,它们说到底是两种语言。
    4.3 开发页面简介4.3.1 首页本界面是新闻博客管理系统的首页设计,其功能主要具体如图4-1所示。

    用户可以在首页进行新闻博客浏览、搜索功能,关键代码如下:
    @RequestMapping(value="/index",method=RequestMethod.GET) public ModelAndView index(ModelAndView model){ Map<String, Object> queryMap = new HashMap<String, Object>(); queryMap.put("offset", 0); queryMap.put("pageSize", 10); model.addObject("newsCategoryList", newsCategoryService.findAll()); model.addObject("newsList", newsService.findList(queryMap)); model.setViewName("home/index/index"); return model; }
    4.3.2 新闻内容页面本界面是新闻博客管理系统的新闻内容页面设计,其功能主要具体如图4-2所示。

    用户可以在新闻内容页进行内容浏览、搜索、评论等功能,关键代码如下:
    @RequestMapping(value="/detail",method=RequestMethod.GET) public ModelAndView detail(ModelAndView model,Long id){ model.addObject("newsCategoryList", newsCategoryService.findAll()); News news = newsService.find(id); model.addObject("news", news); model.addObject("title", news.getTitle()); model.addObject("tags", news.getTags().split(",")); model.setViewName("home/news/detail"); //查看数加1 newsService.updateViewNumber(id); return model; } @RequestMapping(value="/search_list",method=RequestMethod.GET) public ModelAndView searchList(ModelAndView model, @RequestParam(name="keyword",required=false,defaultValue="") String keyword, Page page ){ Map<String, Object> queryMap = new HashMap<String, Object>(); try { keyword= new String(keyword.getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } queryMap.put("offset", 0); queryMap.put("pageSize", 10); queryMap.put("title", keyword); model.addObject("newsCategoryList", newsCategoryService.findAll()); model.addObject("newsList", newsService.findList(queryMap)); model.addObject("title", keyword + "关键字下的新闻信息"); model.addObject("keyword", keyword); model.setViewName("home/news/search_list"); return model; }
    4.3.3 登陆本界面是新闻博客管理系统的后台登陆页面设计,其功能主要具体如图4-3所示。

    登录页面以简明的形式提供给用户一个登录界面。用户登录后会显示当前系统的基本信息。在本系统中实现了用户角色管理、基于角色的权限管理、用户基本信息录入修改、用户管理等功能;关键代码如下:
    @RequestMapping(value="/login",method=RequestMethod.POST) @ResponseBody public Map<String, String> loginAct(User user,String cpacha,HttpServletRequest request){ Map<String, String> ret = new HashMap<String, String>(); if(user == null){ ret.put("type", "error"); ret.put("msg", "请填写用户信息!"); return ret; } if(StringUtils.isEmpty(cpacha)){ ret.put("type", "error"); ret.put("msg", "请填写验证码!"); return ret; } if(StringUtils.isEmpty(user.getUsername())){ ret.put("type", "error"); ret.put("msg", "请填写用户名!"); return ret; } if(StringUtils.isEmpty(user.getPassword())){ ret.put("type", "error"); ret.put("msg", "请填写密码!"); return ret; } Object loginCpacha = request.getSession().getAttribute("loginCpacha"); if(loginCpacha == null){ ret.put("type", "error"); ret.put("msg", "会话超时,请刷新页面!"); return ret; } if(!cpacha.toUpperCase().equals(loginCpacha.toString().toUpperCase())){ ret.put("type", "error"); ret.put("msg", "验证码错误!"); logService.add("用户名为"+user.getUsername()+"的用户登录时输入验证码错误!"); return ret; } User findByUsername = userService.findByUsername(user.getUsername()); if(findByUsername == null){ ret.put("type", "error"); ret.put("msg", "该用户名不存在!"); logService.add("登录时,用户名为"+user.getUsername()+"的用户不存在!"); return ret; } if(!user.getPassword().equals(findByUsername.getPassword())){ ret.put("type", "error"); ret.put("msg", "密码错误!"); logService.add("用户名为"+user.getUsername()+"的用户登录时输入密码错误!"); return ret; } //说明用户名密码及验证码都正确 //此时需要查询用户的角色权限 Role role = roleService.find(findByUsername.getRoleId()); List<Authority> authorityList = authorityService.findListByRoleId(role.getId());//根据角色获取权限列表 String menuIds = ""; for(Authority authority:authorityList){ menuIds += authority.getMenuId() + ","; } if(!StringUtils.isEmpty(menuIds)){ menuIds = menuIds.substring(0,menuIds.length()-1); } List<Menu> userMenus = menuService.findListByIds(menuIds); //把角色信息、菜单信息放到session中 request.getSession().setAttribute("admin", findByUsername); request.getSession().setAttribute("role", role); request.getSession().setAttribute("userMenus", userMenus); ret.put("type", "success"); ret.put("msg", "登录成功!"); logService.add("用户名为{"+user.getUsername()+"},角色为{"+role.getName()+"}的用户登录成功!"); return ret; }
    4.3.4 菜单管理本界面是新闻博客管理系统的菜单管理设计,其功能主要具体如图4-4所示。

    本系统具备菜单管理的能力,可以添加删除菜单,也可给用户设置每个菜单的权限,每个菜单具有自己的icon,更加美观直观。关键代码如下:
    @RequestMapping(value="/list",method=RequestMethod.POST) @ResponseBody public Map<String, Object> getMenuList(Page page, @RequestParam(name="name",required=false,defaultValue="") String name ){ Map<String, Object> ret = new HashMap<String, Object>(); Map<String, Object> queryMap = new HashMap<String, Object>(); queryMap.put("offset", page.getOffset()); queryMap.put("pageSize", page.getRows()); queryMap.put("name", name); List<Menu> findList = menuService.findList(queryMap); ret.put("rows", findList); ret.put("total", menuService.getTotal(queryMap)); return ret; } /** * 获取指定目录下的系统icon集合 * @param request * @return */ @RequestMapping(value="/get_icons",method=RequestMethod.POST) @ResponseBody public Map<String, Object> getIconList(HttpServletRequest request){ Map<String, Object> ret = new HashMap<String, Object>(); String realPath = request.getServletContext().getRealPath("/"); File file = new File(realPath + "\\resources\\admin\\easyui\\css\\icons"); List<String> icons = new ArrayList<String>(); if(!file.exists()){ ret.put("type", "error"); ret.put("msg", "文件目录不存在!"); return ret; } File[] listFiles = file.listFiles(); for(File f:listFiles){ if(f!= null && f.getName().contains("png")){ icons.add("icon-" + f.getName().substring(0, f.getName().indexOf(".")).replace("_", "-")); } } ret.put("type", "success"); ret.put("content", icons); return ret; }
    4.3.5 系统日志记录本界面是新闻博客管理系统的系统日志记录设计,其功能主要具体如图4-5所示。

    管理员可以记录平台的基本日志、操作日志、用户登录日志等,可用于排障、记录等功能,关键代码如下:
    /** * 获取日志列表 * @param page * @param content * @param roleId * @param sex * @return */ @RequestMapping(value="/list",method=RequestMethod.POST) @ResponseBody public Map<String, Object> getList(Page page, @RequestParam(name="content",required=false,defaultValue="") String content ){ Map<String, Object> ret = new HashMap<String, Object>(); Map<String, Object> queryMap = new HashMap<String, Object>(); queryMap.put("content", content); queryMap.put("offset", page.getOffset()); queryMap.put("pageSize", page.getRows()); ret.put("rows", logService.findList(queryMap)); ret.put("total", logService.getTotal(queryMap)); return ret; } /** * 添加日志 * @param user * @return */ @RequestMapping(value="/add",method=RequestMethod.POST) @ResponseBody public Map<String, String> add(Log log){ Map<String, String> ret = new HashMap<String, String>(); if(log == null){ ret.put("type", "error"); ret.put("msg", "请填写正确的日志信息!"); return ret; } if(StringUtils.isEmpty(log.getContent())){ ret.put("type", "error"); ret.put("msg", "请填写日志内容!"); return ret; } log.setCreateTime(new Date()); if(logService.add(log) <= 0){ ret.put("type", "error"); ret.put("msg", "日志添加失败,请联系管理员!"); return ret; } ret.put("type", "success"); ret.put("msg", "日志添加成功!"); return ret; }
    5 性能测试与分析测试是开发时期最后一个阶段,是保证软件质量的重要手段。软件测试就是在受控制的条件下对系统或应用程序进行操作并评价操作结果的过程,所谓控制条件应包括正常条件与非正常条件。软件测试过程中应该故意地去促使错误的发生,也就是事情在不该出现的时候出现或者在应该出现的时候没有出现。从本质上说,软件测试是”探测”,在”探测”中发现软件的毛病。
    5.1 系统测试的目的与目标在此系统进行初步实现之后,开始进行对系统进行测试,找出系统中存在的Bug和不足,通过测试,用提交的Bug报告来为以后软件的改进提供标准和参考,能够在以后的系统改进中找到依据。
    测试后的软件各模块基本功能可以顺利进行,尽可能的提高软件的健壮性。
    5.2 系统测试方法
    从是否关心软件内部结构和具体实现的角度划分:黑盒测试和白盒测试
    从是否执行程序的角度:静态测试和动态测试
    从软件开发的过程按阶段划分有:单元测试、集成测试、确认测试、系统测试、验收测试、回归测试、Alpha测试、Beta测试

    单元测试又称模块测试,是针对软件设计的最小单位 ─ 程序模块(这里所说的程序模块在Java中一个模块就是一个方法),进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。
    集成测试 (组装测试、联合测试),通常在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题是:

    在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失
    一个模块的功能是否会对另一个模块的功能产生不利的影响
    各个子功能组合起来,能否达到预期要求的父功能
    全局数据结构是否有问题
    单个模块的误差累积起来,是否会放大,从而达到不能接受的程度

    确认测试(Validation Testing),确认测试又称有效性测试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。
    系统测试(System Testing),是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。系统测试的目的在于通过与系统的需求定义作比较, 发现软件与系统的定义不符合或与之矛盾的地方。
    验收测试(Acceptance Testing),在通过了系统的有效性测试及软件配置审查之后,就应开始系统的验收测试。验收测试是以用户为主的测试。软件开发人员和QA(质量保证)人员也应参加。由用户参加设计测试用例,使用生产中的实际数据进行测试。在测试过程中,除了考虑软件的功能和性能外,还应对软件的可移植性、兼容性、可维护性、错误的恢复功能等进行确认。
    5.3 系统测试用例新闻博客管理系统包括了多个功能,下面对各主要功能进行测试用例说明。由于测试过程具有一定的相似性,所以本系统选取一部分功能进行测试,其余相似功能模块不再一一展示。
    5.4 系统测试结论通过对系统的全面测试,所有测试条目都已经通过,实现了基本要求,系统可以正常运行。
    6 总结与展望设计开发基于 JSP 的企业新闻博客管理系统是集业务管理与软件技术为一身的工作,只有在理解业务的基础上,才能对业务操作流程进行提炼优化,并通过软件设计与开发技术实现。本文设计的企业新闻博客管理系统角色多样、功能丰富,能适应大部分环境下的企业进销存管理工作。本系统在设计采用了 SSM 框架,设计上实现了高内聚、低耦合的要求,在设计上做到了可扩张和维护。本文在论文撰写、系统开发时实地到一家企业进行调研,与企业的仓库管理工作人员沟通,做需求分析,设计了系统管理员登录、新闻管理、用户管理等模块。
    通过开发《新闻博客管理系统》,我较为全面的掌握了JAVA的基本知识和编程技巧,并在开发过程中我的JAVA开发能力得到了进一步的提高。如:更进一步的深入了解MVC设计模式,软件三层框架;SQL语言的使用。

    对新闻博客管理系统进行用户需求调研,将现有业务与传统技术进行对比总结,完成本系统的用户需求分析。通过对用户需求分析和技术背景研究,分析了系统的业务流程,并采用UML工具对用户需求进行统一建模,导出系统的软件需求分析说明
    新闻博客管理系统使用MYECLIPSE和MYSQL数据库开发
    根据系统业务需求对系统数据库进行详细设计,主要采用了数据库3NF标准对数据库内部各种关系进行抽象分析,建立数据库E-R模型图,最大程度上避免数据冗余,保证数据的一致性

    系统不免有错误和待改进之处,真诚欢迎各位师长、同行提出宝贵意见。
    参考文献[1] 刘慧杰,舒大兴,陆斌,吴欢.双翻斗与JSP-01A型智能雨量计比较实验分析[J].中国新技术新产品,2019(18):69-71.
    [2] 张雅棋.SQL Sever、MySQL、Oracle数据库在水务系统中的应用比较[J].天津科技,2019,46(09):52-54.
    [3] 罗永权.HTML语言的网页制作技巧与方法研究[J].计算机产品与流通,2019(10):151.
    [4] 郑茹琼,刘杨.基于SSM的母婴购物网站的设计与实现[J].电脑知识与技术,2019,15(26):264-265.
    [5] 赵硕,范俊甫,孙永进,王开放.基于MySQL的矢量数据访问引擎设计与实现[J].测绘与空间地理信息,2019,42(09):138-141.
    [6] 董珊,周德阳,罗荣良.基于SSM的实验室管理系统设计[J].电脑知识与技术,2019,15(27):45-46+49.
    [7] 杨嘉诚,柯海丰.基于HTML5和JavaScript的信息学学习网站的设计与实现[J].计算机时代,2019(11):32-34+37.
    [8] 张丛丛.基于HTML语言的网页制作方法[J].电子技术与软件工程,2019(20):20-21.
    [9] 赵晓丹.网页开发中的JSP技术分析[J].南方农机,2019,50(20):247-248.
    [10] 许佩迪,王海燕,李闯.基于JSP的网上在线图书借阅系统开发与设计[J].智能计算机与应用,2019,9(05):310-311+319.
    [11] 甘启宏,崔亚强,王皓,余淇,冯鸟东.基于SSM框架的高校教学设备管理系统设计与实现[J/OL].软件导刊:1-4[2019-11-16].http://kns.cnki.net/kcms/detail/42.1671.TP.20190906.1321.002.html.
    [12] Juan C. Roldán,Patricia Jiménez,Rafael Corchuelo. On extracting data from tables that are encoded using HTML[J]. Knowledge-Based Systems,2019.
    [13] 赵雪娇,李明伟,靳大伟,孙达明.基于MVC4+EasyUI框架下数字校园接待管理系统的设计与实现[J].工业技术与职业教育,2018,16(02):16-19.
    1 评论 12 下载 2020-12-08 10:19:00 下载需要11点积分
  • 基于Python的Django框架实现的新闻检索平台

    1 功能概述本软件为一个新闻检索平台,实现了检索及显示10000条来自人民网的新闻的功能。
    1.1 主页面输入127.0.0.1:8000/search后,可得到以下初始界面。

    可在本页面上端的搜索框中输入关键词进行搜索,也可通过下方的翻页键浏览新闻。
    1.2 搜索结果界面
    上图为搜索结果页面,搜索关键词为”习近平 普京 特朗普”,搜索引擎会返回所有与关键词部分匹配的页面,且匹配程度越高,排名越靠前。对于出现在标题、摘要中的关键词,会高亮显示。
    同时,搜索引擎还支持按时间检索,若搜索关键词中包含用&&包起来的两个日期,则会返回发布时间在这两个日期之间的文章。下图是输入&2017-01-01-2017-01-01&后的返回页面。

    1.3 详情界面点击上述两个页面中的新闻标题后,可进入新闻的详情界面。

    详情页面展示了新闻的全文,并推荐3篇数据库中相似性最高的文章。
    2 代码实现2.1 相关配置爬虫使用python2,其版本号为2.7.13,使用的第三方库有 requeests 2.19.1 , pandas 0.23.4。
    其余部分使用python3,其版本号为3.7.0,所使用的第三方库有:Django 2.1.1 , jieba 0.39 , numpy 1.14.5 , pandas 0.23.3 2.2 爬虫 。
    从网页 http://world.people.com.cn/n1/2018/0911/c1002-30284709.html 开始,对网页的相关新闻版块进行 bfs,提取每个网页的标题、发表时间、正文,从0开始按爬取时间对所有爬取到的网页进行编号,把标题、发表时间存至’ info.csv 文件中,将正文存到以编号命名的txt文件中。爬虫代码位于 scripts/crawler.py 中。
    2.3 数据处理从爬取到的文件中提取文章摘要,存到 info.csv 中。
    使用 jieba 的search模式对每篇文章的标题及正文进行分词,记录文中出现的词及出现次数(词在标题中每出现 一次按照5次计入),使用出现次数在2次及以上的词建立倒排索引,在索引表中同时存储出现次数,倒排索引存储于 mix.csv 中。
    上述代码主要位于 scripts/segment.py 中。
    使用 tf-idf+jaccard similarity 进行相关文章推荐,首先计算每个关键词的 idf 值,导入到 mix.csv 中,再枚举所有文章对,计算每一对文章的相似程度,存到 similarity 文件夹中以文章编号命名的csv文件中。此部分代码位于 scripts/similarity.py 中。
    之后,将 info.csv 、mix.csv 、similarity/*.csv 中内容导入Django创建的sqlite3数据库中,此部分代码位于主要位于 database_insert.py 中。
    2.4 搜索算法使用打分的方法进行搜索。
    若开启了时间检索,则为位于这个时间区间内的文章加20000分,并将 threshold_time 值设为20000,否则将 threshold_time 值设为0。
    若使用了关键词检索,则将 threshold_text 值设为1000,否则设为0。对于检索使用的每个关键词,若在某篇文章中出现,则为该篇文章加 次,其中t表示关键词在文章及标题中的出现次数(标题中每出现一次 按5次计算)。每个关键词有1000分的基础分保证了出现关键词较多的文章得分会较高,使用 log 函数是为了适当平衡出现次数多的关键词和出现次数少的关键词的贡献。
    之后,将得分大于等于 threshold_time+threshold_text 的文章返回,返回前将文章按得分从高到低排序。
    2.5 服务器搭建服务器使用Django进行搭建。
    前端分为2个页面 index.html 与 article.html ,index.html 用于展示主页面及搜索结果,并使用JavaScript 实现关键词高亮。article.html 用于展示新闻详情及新闻内容。
    这两个页面都是在网上下载的网页模板的基础上添加了搜索栏,更改了上部的网站名称而得到的,网站模板位于 template 文件夹中。
    后端使用数据库进行交互,当用户点击文章详情时,读取本地静态文件进行显示,当用户进行搜索时,调用2.4中所描述的搜索算法进行搜索。
    3 评论 77 下载 2019-02-21 13:46:46 下载需要13点积分
  • 基于JAVA的即时通信软件

    一.设计任务书1.1 设计任务本文设计的是一个简单的即时通信软件,利用 Java Socket 进行点到点通信,其工作机制模仿即时通信软件的基本功能,已实现的功能有:

    客户端登录客户端退出群组成员之间传输文字或图片信息
    该软件分为客户端与服务器端,客户端负责与服务器建立连接,且执行收发消息的操作,服务器端负责等待客户端连接并保存用户的昵称与客户端 Socket 的输出流的对应关系。
    1.2 技术指标本程序使用的是 TCP 协议实现的即时通信软件,程序是基于 Java 语言开发的,主要用到的技术有:

    Socket 编程自定义协议
    如果使用普通的方法来标记一条消息的结束,如换行符,那么程序就不易扩展,只能发送纯文本消息,所以需要自己定义一种消息的格式,并且我们还需要提供发送消息与解析消息的方法。
    服务器端创建一个 ServerSocket,循环等待客户端的连接,每当有客户端连接,就获取到客户端的 Socket 对象,并将该对象交付给一个服务器端线程处理,服务器端线程会不断从 Socket 的输入流中解析出消息类型、长度及消息内容,然后根据类型执行不同的操作。
    客户端与服务器建立连接,同时开启一个客户端线程接收服务器端发送的消息,客户端登录是向服务器发送一条登录命令,客户端向服务器发送一条消息首先需要包装成定义的消息格式,然后再发送给服务器。
    不管是发送消息还是发送命令其实本质都是一条消息,向服务器发送的消息都必须按照定义的格式来。
    1.3 论证结果经论证,这个任务是可行的。TCP 协议的实现细节 Java Socket 已经帮我们做好了,我们需要做的是定义一个协议工具类,实现发送消息与接收消息的方法,然后客户端与服务器端都利用这两个方法来进行消息的发送与解析。
    二.实现原理2.1 基于 TCP 协议的即时通信TCP 协议是一种端到端协议,当一台计算机要与远程的另一台计算机连接时,TCP 协议会让他们建立一个用于发送和接收数据的虚拟链路。TCP 要负责收集数据信息包,并将其按照适当的次序放好传送,接收端收到后再正确的还原,TCP协议使用了重发机制,当一个通信实体发送一个消息到另一个通信实体后,需要接收到另一个通信实体的确认消息,如果没有收到确认消息,则会重发消息。所以 TCP 协议保证了数据包在传输中不发生错误。通信示意图如图 1 所示。

    在通信实体 1 与通信实体 2 建立虚拟链路前,必须有一方主动来接收其他通信实体的连接请求,作出“主动”的通信实体称为服务器,发出连接请求的通信实体称为客户机。
    2.2 自定义协议的定义2.2.1 通信原理客户端与服务器端相互通信,首先要建立 Socket 连接,连接建立好后双方都会拿到一个 Socket 对象,通过 Socket 对象拿到输入、输出流可以实现写、读的功能。服务器端接收到客户端的连接,将客户端的 Socket 对象交付给一个线程,该线程负责维护该客户端,在线程体中需要使用死循环不断的获取客户端发给服务器的消息。
    2.2.2 存在的问题那么问题来了:怎么标志客户端发送的消息的结尾?如果不对结尾标志,服务器端将不知道客户端本次客户端发送的消息到哪里。
    2.2.3 文本消息的解决办法对文本消息的一般做法是将‘\n’作为结尾标记,操作过程如下:

    客户端与服务器端建立连接,服务器端将客户端的 Socket 加入集合中保存,并将客户端的 Socket 交付给一个服务器端线程处理,服务器线程初始化套接字、输入输出流,然后一直循环等待客户端发送消息
    客户端向服务器发送消息“Hello World!\n”,服务器线程获取到客户端发送的消息,然后使用输入流读取一行消息,读取到的消息是“Hello World!”,然后遍历服务器端的那个集合,获取到集合中每个 Socket 的输出流,向每个输出流中写入消息。

    以上是一般意义上群聊的实现原理:客户端向服务器发送消息,服务器获取到消息后转发给群组中的所有成员。
    2.2.4 依然存在的问题
    问题一:如果发送的是图片、文档应该怎么标记消息的结束?问题二:在实际应用中,客户端向服务器端发送消息并不像刚才的例子那么简单,还需要登录、注销、登录成功等命令,怎么来区别这些命令?
    2.2.5 自定义协议的内容为解决以上问题,我们规定:消息的发送与解析都必须使用以下格式:

    由表 1 知,数据分为三个部分

    type:1 字节,表示发送的消息类型,所以可以表示 65535 种消息类型。totalLen:4 字节,整型数据,表示发送的消息的总长度,包含 type、totalLen的长度以及消息内容的长度,totalLen 占用 4 字节,所以最大可以发送 2G 的数据。bytes[]:字节数组,表示发送的消息的内容,大小没有限制。
    2.2.6 使用自定义协议制定消息的规范后以上两个问题都会迎刃而解了,客户端向服务器端发送消息的过程如下:
    例 1:发送纯文本
    客户端:

    客户端的视图与用户交互获取到用户要发送的文本内容“你好啊”客户端将获取到的文本内容转化为字节数组 bytes客户端将消息包装成自定义的消息格式,如表 2 所示


    客户端往输出流中写入消息
    服务器端:

    服务器端线程一直等待接收客户端的消息服务器端线程获取到客户端发送的消息,按照格式解析出消息的类型、长度以及消息内容服务器端线程获取到的消息类型是文本类型 TYPE_TEXT,那么需要遍历服务器端的集合,获取到集合中每个 Socket 的输出流,使用这个输出流对消息转发,在转发前同样需要包装成定义的消息格式。
    例 2:登录功能
    客户端:

    客户端与服务器端建立连接之后,将用户输入的昵称包装成一条消息,如表 3 所示,消息类型是 TYPE_LOAD,字节数组 bytes 是用户昵称。


    在建立连接的同时客户端会开启一个线程等待接收服务器端的消息。将消息发给服务器端。客户端线程如果收到服务器端反馈的信息,就将信息告知用户。
    服务器端:

    接收到消息后获取到消息类型为 TYPE_LOAD,服务器端就可以知道这条消息是登录请求,然后 bytes[]数组里的数据就是用户昵称,将用户昵称、该客户端的 Socket 对象的输出流先保存到 Map 中,然后将该 Map 保存到集合中。服务器端线程对客户端的登录请求处理完成后,向客户端反馈一条标记着是否操作成功的消息,类型是 TYPE_LOADSUCCESS 和 TYPE_LOADFAIL,bytes 数组是服务器端反馈的消息。
    如果登录成功,服务器反馈的消息格式如表 4 所示。

    如果登录失败,服务器反馈的消息格式如表 5。

    2.2.7 小结其实不管客户端发送的消息是哪种类型,客户端只需要负责将要发送的消息转化为字节数组,然后对数据包装后发送给服务器。对于一些非命令类的消息,服务器接收到消息后只需要根据数据类型对数据进行解析、包装、转发即可。对于一些命令类的消息,如登录,退出等功能,则需要服务器端执行相应的操作,服务器端不需要对消息转发,可能需要对一些命令给予反馈。
    通过自定义协议可以解决上述的两个问题,并给出了客户端与服务器端使用自定义协议发送消息的两个详细步骤
    2.3 自定义协议的实现这个自定义协议就是自己定义的一个发送消息、解析消息的规范,无论是发消息还是收消息都必须按照这个规范来,实现这个协议无非需要考虑三个问题:

    问题一:如何发送消息?问题二:如何解析消息?问题三:如何表示解析消息后的结果?
    我们只需要定义两个类,协议工具类 Protocol 负责消息的发送与解析,消息结果类 Result 封装了一个消息的三个部分:type、totalLen、bytes,协议工具类对消息解析后会返回一个 Result 对象表示一次解析的结果。所以这两个类结合起来使用就可以解决以上三个问题。
    2.3.1 协议工具类的实现协议工具类 Protocol 负责消息的发送与解析,内部需要定义消息的格式,协议工具类的设计如图 2 所示。

    2.3.1.1 消息类型消息类型是协议工具类的静态的公共的整型常量,这样的设置为程序后期的扩展提供了方便,提供的消息类型如表 6 所示。

    2.3.1.2 发送消息发送消息就是按照定义的格式往输出流中写入数据,我们首先要做的是包装数据定义方法签名,如表 7 所示。


    包装数据
    一条数据有三部分,消息类型、消息内容已经通过参数获取到了,消息的长度还要程序计算:消息长度=消息的内容的长度+5 字节。
    int totalLen = 1 + 4 + bytes.length;

    按格式写入输出流,先写入消息类型,然后写入消息的总长度,最后再写入消息的内容。
    dos.writeByte(type);dos.writeInt(totalLen);dos.write(bytes);dos.flush();
    2.3.1.3 解析消息解析消息是指将从输入流中读取到一条消息,然后按照格式转化为一个结果对象 Result。定义方法签名如表 8 所示。


    消息提取
    从输入流中依次读取三部分:type、totalLen、bytes[],dis 是方法的参数,调用方法时需要传入输入流
    byte type = dis.readByte();int totalLen = dis.readInt();byte[] bytes = new byte[totalLen - 4 - 1];dis.readFully(bytes);

    结果返回
    将提取出来的数据的三个部分封装成一个结果对象作为方法的返回值,注意第一个参数:type & 0xFF,因为 type 是字节,需要与 0xFF 进行“与”运算得到一个整型值。
    return new Result(type & 0xFF, totalLen, bytes);
    2.3.2 结果类的实现结果类 Result 封装一条消息的三个部分,主要提供了 setter、getter 方法来设置或者获取消息的三个组成部分,结果类的设计如图 3 所示。

    2.3.2.1 消息格式Result 类定义了消息的格式,消息的组成如表 9 所示。

    2.3.2.2 方法Result 类的方法签名如表 10 所示。

    2.4 服务器端的实现2.4.1 服务器类Server 类负责等待客户端连接并将连接上的客户端交付给服务器线程类。Server 类的设计如图 4 所示。

    clients 维护一个 List 集合,集合中每个元素都是 Map,每个 Map 中都有两个 item,保存着客户端的昵称和对应的输出流。
    main 方法中要实现的是等待客户端连接,使用 ServerSocket,有客户端连接时开启一个线程来处理。代码如下:
    ServerSocket serverSocket = new ServerSocket(30000);while (true) { Socket socket = serverSocket.accept(); new Thread(new ServerThread(socket)).start();}
    2.4.2 服务器线程类ServerThread 类负责接收客户端的消息并对消息进行相应的处理,ServerThread 类的设计如图 5 所示。

    2.4.2.1 变量ServerThread 类的变量以及其含义如表 11 所示。

    2.4.2.2 方法签名ServerThread 类的方法签名以及含义如表 12 所示。

    2.5 客户端的实现2.5.1 客户端界面界面的元素有:登录输入框、聊天内容文本域、消息输入文本域、发送按钮。客户端界面初始化时会调用 Client 的方法执行客户端与服务器的连接请求,连接成功后客户端与服务器端会形成一个虚拟链路,当用户输入用户名后回车,客户端通过该虚拟链路向服务器端发送一条登录命令。View 类的设计如图 6 所示。

    2.5.2 客户端客户端 Client 负责处理客户端连接、客户端发送消息的任务,Client 类的设计如图 7 所示。

    2.5.2.1 建立连接socket = new Socket(address, port);dos = new DataOutputStream(socket.getOutputStream());// 监听服务器发回的消息new ClientThread(socket).start();
    2.5.2.2 登录public void load(String user) { Protocol.send(Protocol.TYPE_LOAD,user.getBytes(), dos);}
    2.5.2.3 发送消息public void sendMsg(String msg) { Protocol.send(Protocol.TYPE_TEXT, msg.getBytes(), dos);}
    2.5.2.4 退出public void logout(){ Protocol.send(Protocol.TYPE_LOGOUT, "logout".getBytes(),dos);}
    客户端线程负责接收服务器端发的消息,其对消息的处理方法与服务器端线程的处理方法类似,都是先解析消息,然后根据消息类型执行相应的操作。
    2.5.2 客户端线程客户端线程主要负责接收消息,并对接收到的消息进行显示。ClientThread类的设计如图 8 所示。

    ClientThread 类维护的是客户端的套接字以及输入流,那三个方法的作用和服务器端线程类似,这里不再细说。
    三.实验结果3.1 运行结果
    服务器端启动后是没有运行界面的,运行结果如图 9 所示。


    客户端启动后初始界面如图 10 所示。


    输入用户名后回车登录,登录后如图 11 所示。


    两个客户端互发消息,如图 12 所示。


    单个客户端退出

    3.2 主要问题及故障分析3.2.1 主要问题
    不知道如何标记一条消息的结尾界面问题
    3.2.2 故障分析对于第一个问题:如果只是发送一条文本消息的话,是没有这个问题的。但是为了使程序拥有更好的扩展性,使其可以发送图片以及文档,这个问题还是值得思考的。定义一种消息的格式,无论是发送还是接收消息都按照这个标准来,这个就是我们定义的协议工具类的作用。
    对于第二个问题:本程序是基于 Java 语言开发的,AWT 和 SWING 是 Java 语言开发 GUI 的工具包。SWING 和 AWT 写界面都不是很方便,所以本程序的界面有点粗糙。
    3.3 设计结论由于之前写过这类的程序,所以在程序层次上的实现并不难,本次实验不仅巩固了编写程序的功底,还加深了对 Socket 通信底层理论的理解,可以说是收获非常大。至此,本论文已经接近尾声,所研究的是一个简单的即时通信软件的实现过程以及实现原理。
    四.附录一:实验相关4.1 实验数据客户端与客户端 2 发送的消息数据,[]内部表示的是发送方的昵称,昵称外部是发送的消息内容,具体实验数据如下:

    [客户端 1]我是客户端 1[客户端 1]你好啊![客户端 2]我是客户端 2
    4.2 系统软硬件环境4.2.1 硬件环境
    系统:Window7 旗舰版系统类型:64 位操作系统处理器:i5-4210U安装内存:4.0GB
    4.2.2 软件环境已安装 JRE、JDK 并配置好环境变量
    4.3 使用说明本程序分为客户端与服务器端,首先需要启动服务器端,然后可以打开多个客户端,客户端打开后可以进行聊天。
    4.4 参考资料[1] 李刚,疯狂 Java 讲义第 3 版,北京:电子工业出版社,2014.7
    [2] James F.Kurose,Keith W.Ross,计算机网络-自顶向下方法上册(第 5 版),北京:高等教育出版社
    5 评论 371 下载 2018-11-03 13:32:16 下载需要10点积分
  • 基于JAVA和TCP SOCKET实现的P2P的局域网即时通信系统

    一、设计要求
    掌握P2P原理
    实现一个图形用户界面局域网内的消息系统。
    功能:建立一个局域网内的简单的P2P消息系统,程序既是服务器又是客户,服务器端口(自拟服务器端口号并选定)

    用户注册及对等方列表的获取:对等方A启动后,用户设置自己的信息(用户名,所在组);扫描网段中在线的对等方(服务器端口打开),向所有在线对等方的服务端口发送消息,接收方接收到消息后,把对等方A加入到自己的用户列表中,并发应答消息;对等方A把回应消息的其它对等方加入用户列表。双方交换的消息格式自己根据需要定义,至少包括用户名、IP地址发送消息和文件:用户在列表中选择用户,与用户建立TCP连接,发送文件或消息
    用户界面:界面上包括对等方列表;消息显示列表;消息输入框;文件传输进程显示及操作按钮或菜单

    二、软件开发工具及运行环境
    软件开发工具

    编程语言:Java开发环境:EclipseJDK版本:1.8操作系统:windows 10
    运行环境

    操作系统无关性:Windows、Linux、Mac OS X下安装了Java的运行环境JRE即可运行

    三、程序开发的基础知识3.1 学习Socket和TCP的基本原理和通信机制3.1.1 TCP连接电脑能够使用联网功能是因为电脑底层实现了TCP/IP协议,可以使电脑终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
    建立起一个TCP连接需要经过“三次握手”:

    第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。(过程就不细写了,就是服务器和客户端交互,最终确定断开)
    3.2 SOCKET原理3.2.1 套接字(socket)概念套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
    应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
    3.2.2 建立socket连接建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求
    客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求
    连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求

    3.3 SOCKET连接与TCP连接创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
    3.4 主要运用知识
    Java socket编程Java GUI编程Java继承和事件绑定Java异常与捕获
    四、总体设计4.1 设计思路4.1.1 经典的TCP通信服务器客户端架构服务器有一个服务器等待用户连接的线程,该线程循环等待客户端的TCP连接请求。一旦用ServerSocket.accept()捕捉到了连接请求,就为该TCP连接分配一个客户服务线程,通过该消息传递线程服务器与客户端通信。服务器发送消息通过该客户服务线程的方法在主线程完成,而接收消息全部在客户服务线程中循环接收并处理。
    客户机能发起一个向服务器的socket连接请求,一旦收到服务器成功响应连接请求,客户机便为这个socket分配一个消息接收线程,否则关闭该socket。和服务器任务分配类似,发送消息作为非常用方法在主线程中完成,而接收消息在消息接收线程中不停刷新并作相应处理。
    4.2 统一ASCII码级文本传输协议为了实现客户机对服务器命令的响应、服务器对客户机需求的解读以及客户机与客户机之间的消息传递,我为服务器和客户端之间通信定义了一组文本传输协议。协议属于变长文本传输协议,用@作为各字段分隔符,所有消息的首节一定是消息类型,方便解析。协议定义了以下按发送方分类的消息格式:


    4.3 MVC分层模式Model-View-Controller是经典的应用程序开发设计模式,它讲究数据管理、界面显示和用户交互、程序维护管理分别封装在MVC三种类中,够成松耦合关系。本次课程设计中我也利用MVC的设计思路,独立了Model类User用于保存客户机用户信息,DefaultListModel模型类用于储存在线用户队列;将View单独放在一个包中,Controller监听用户操作事件,反映给Model类处理并在View中更新。
    MVC的思想即是M和V之间不要直接产生联系,业务逻辑均封装在MC中,而V仅仅负责显示。本实验为V类绑定了各自的Listener监听用户操作,在C中完成业务逻辑处理,保存并更新User和DefaultListModel,最后再显示到UI界面上。
    4.4 concurrentHashMap管理线程队列和用户列表concurrentHashMap是java.util.concurrent包中定义的多线程安全的哈希表,利用哈希表管理线程队列和用户列表可以快速索引,多线程安全也保证了多个用户服务线程之间共享资源的数据一致性。
    4.5 程序流程图
    4.6 关键数据结构4.6.1 User模型类
    构造方法
    有两个,一个是用独立的name和IP实例化一个User,另一个是用name%IP拼接而成的字符串实例化User
    只读字段
    name和ipAddr均是private的,给他们配置一个只读的getter
    description()用户描述
    返回name%IP拼接而成的字符串,用以代表一个独立的用户

    4.6.2 ServerView类
    UI相关的方法
    构造函数中的initUI()大部分是设置UI界面,其中用到了GridLayout和BorderLayout。用serviceUISetting(false)把所有连接状态才起作用的button和textField全部关闭了(false改为true开启他们,并关闭所有设置相关的button和textField)

    4.6.3 ServerMain类
    startServer()开启服务器方法———startButton绑定
    先检查maxClientNum和port的合法输入,如果不合法弹出出错窗口并退出。接着初始化管理客户服务线程队列的并发哈希表clientServiceThreads,初始化监听客户机连接请求的serverSocket,并且初始化和开启一个监听连接请求的线程。最后有一些差错处理以及服务器log日志
    请求监听线程ServerThread类
    isRunning作为线程运行标志位控制线程存活,线程start后会调用的函数run()里完成了监听逻辑。如果开启则一直循环,serverSocket.accept()是阻塞的,线程不会运行直到有其他线程/进程向其请求Socket连接。这也是我下面提到的一个bug的原因:accept()阻塞了线程它一直在等待,仅仅用标志位来结束线程并不能使之跳出阻塞状态(还没有循环到下一次while的判断),因此我在closeThread()中强行关闭serverSocket会报出一个异常!
    收到连接请求后accept()返回一个socket,这个socket用于和请求连接的客户机通信。至此时TCP建立连接3次握手已经完成,全部被serverSocket类封装起来了。获取了通信socket之后检查服务器在线人数是否已满,向客户机发送一个登陆成功或失败的消息。若在线人数未满连接成功,则为客户机分配一个clientServiceThread线程专门用于发送和接受客户机的TCP包。
    监听客户机消息的ClientServiceThread线程类
    该类比较庞大,我挑重点介绍。
    关键字段
    private Socket socket;private User user;private BufferedReader reader;private PrintWriter writer;private boolean isRunning;
    分别保存了通信socket、当前连接用户Model、绑定在socket输入流上的BufferedReader、绑定在socket输出流上的PrintWriter以及线程运行控制标志位isRunning。reader用来读取客户机消息输入,readLine方法也是阻塞的,直到客户机有消息发送过来。writer有一个写缓冲区,有flush()函数强制发送消息并刷新缓冲区,我把写消息封装在sendMessage(String)中。
    初始化
    初始化中先绑定reader和writer到socket响应流,在判断用户socket请求发送的消息格式是否正确(不正确线程将不能执行)。接着向所有已上线的用户通知一遍这个新用户上线了,发送通知需要遍历整个服务线程队列并发送文本传输协议中定义的各式的通知。注意到这时候该服务线程并没有加入到服务线程队列中,是在初始化完成之后加入的。
    通知了其他用户这个新客户机上线后,再告诉该客户机现在已经有哪些用户在线了,这也是用协议中的格式发送通知即可。这里用到了StringBuffer类,多字符串连接时该类比String的+的效率要高。
    线程run
    收到客户机消息后判断消息类型,若是LOGOUT通知客户机下线,则向所有其他客户端进程发送该用户下线的信息,并删除model类里的该用户对象和线程队列里的该线程。
    如果是消息则交与dispatchMessage(String)方法专门分发消息。
    分发消息方法dispatchMessage(String)
    该方法解析MSG类消息的to字段,根据to字段选择是将消息发给特定用户还是直接群发。发给特定用户的话根据to字段(userDescription)做索引,快速从服务线程队列找出服务该用户客户机的线程来发送信息。
    其他
    绑定时间如stopServer关闭服务器和sendAll群发消息都比较直白便省略介绍,主要需要注意一下其中的差错控制。关闭服务器还需要更新UI控制逻辑。
    说明
    ServerMain类虽然通过ClientServiceThread里的writer发送消息,并且也是调用封装在这个Thread内部类中的,但是调用writer来sendMessage并不是一定在该线程内完成的(该线程内指的是run()里的while循环内部),sendMessage是非阻塞的我们没有必要专门在线程中执行。ClientServiceThread主要工作是收听各个客户端向服务器发送的消息。

    4.6.4 ClientView类Client和Server稍微有点不一样,只有一个辅助线程MessageThread用于接收服务器消息。由于只需要绑定在一个socket上,所以writer和reader只有一个,是直接属于Client实例的字段。

    UI相关方法
    构造函数里的init和Server中几乎完全一样,这部分属于代码复用。注意需要多绑定一个监听器:
    javax.swing.event.ListSelectionListener类用来监听用户选择JList框里的条目,JList框里固定一个所有人的项(点击选中表示消息发送给所有人,默认发送给所有人,目标对象下线后也是自动把对象转变成所有人),其他则是在线用户。点击这些列表项时触发一个选择事件,通过判断index来判断用户的选择,并更新模型记录sendTarget和UI中messageToLabel显示的text。

    4.6.5 ClientMain类
    connect连接到服务器
    差错检测这里没有判断IP地址合法性,判断也不是很麻烦。用户输入合法时,根据服务器IP地址和端口实例化一个socket,这个socket用于将来和服务器通信。获取客户机本地IP地址并用这个IP地址实例化,通过socket给服务器发送一条自己用户信息(name和IP)的消息表示请求。发送完毕后立即开启MessageThread等待服务器的回应。
    MessageThread接受服务器消息线程
    reader.readLine()阻塞读取服务器消息。一直忘记介绍StringTokenizer类,这里说明一下。StringTokenizer类通过一个String和一个分割字符串实例或一个tokenizer,通过分割得到一系列记号流通过tokenizer.nextToken()获取这些记号字符串。不难发现其作用和String.split(String)一样也是做字符串分割,但是其效率显著优于split方法(百度搜索两者比较会有较详细的性能分析)。
    根据tokenizer返回的记号流我们来判断消息类型:
    服务器关闭:向服务器发送一个下线信息,关闭socket, write和read,清空记录Model,最后退出线程。
    服务器错误:log错误类型,啥也不干进入下一轮循环。
    登陆信息:
    成功:log成功,进入下一轮循环。
    失败:log失败,关闭socket, write和read,清空记录Model,最后退出线程。

    五、关键代码 private class ClientServiceThread extends Thread { private Socket socket; private User user; private BufferedReader reader; private PrintWriter writer; private boolean isRunning; private synchronized boolean init() { try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); String info = reader.readLine(); StringTokenizer tokenizer = new StringTokenizer(info, "@"); String type = tokenizer.nextToken(); if (!type.equals("LOGIN")) { sendMessage("ERROR@MESSAGE_TYPE"); return false; } user = new User(tokenizer.nextToken()); sendMessage("LOGIN@SUCCESS@" + user.description() + "与服务器连接成功!"); int clientNum = clientServiceThreads.size(); if (clientNum > 0) { //告诉该客户端还有谁在线 StringBuffer buffer = new StringBuffer(); buffer.append("@"); for (Map.Entry<String, ClientServiceThread> entry : clientServiceThreads.entrySet()) { ClientServiceThread serviceThread = entry.getValue(); buffer.append(serviceThread.getUser().description() + "@"); //告诉其他用户此用户在线 serviceThread.sendMessage("USER@ADD@" + user.description()); } sendMessage("USER@LIST@" + clientNum + buffer.toString()); } return true; } catch(Exception e) { e.printStackTrace(); return false; } } public ClientServiceThread(Socket socket) { this.socket = socket; this.isRunning = init(); if (!this.isRunning) { logMessage("服务线程开启失败!"); } } public void run() { while (isRunning) { try { String message = reader.readLine(); // System.out.println("recieve message: " + message); if (message.equals("LOGOUT")) { logMessage(user.description() + "下线..."); int clientNum = clientServiceThreads.size(); //告诉其他用户该用户已经下线 for (Map.Entry<String, ClientServiceThread> entry : clientServiceThreads.entrySet()) { entry.getValue().sendMessage("USER@DELETE@" + user.description()); } //移除该用户以及服务器线程 listModel.removeElement(user.getName()); clientServiceThreads.remove(user.description()); close(); return; } else { //发送消息 dispatchMessage(message); } } catch(Exception e) { e.printStackTrace(); } } } public void dispatchMessage(String message) { StringTokenizer tokenizer = new StringTokenizer(message, "@"); String type = tokenizer.nextToken(); if (!type.equals("MSG")) { sendMessage("ERROR@MESSAGE_TYPE"); return; } String to = tokenizer.nextToken(); String from = tokenizer.nextToken(); String content = tokenizer.nextToken(); logMessage(from + "->" + to + ": " + content); if (to.equals("ALL")) { //send to everyone for (Map.Entry<String, ClientServiceThread> entry : clientServiceThreads.entrySet()) { entry.getValue().sendMessage(message); } } else { //发送给某一个人 if (clientServiceThreads.containsKey(to)) { clientServiceThreads.get(to).sendMessage(message); } else { sendMessage("ERROR@INVALID_USER"); } } } public void close() throws IOException { this.isRunning = false; this.reader.close(); this.writer.close(); this.socket.close(); } public void sendMessage(String message) { writer.println(message); writer.flush(); } public User getUser() { return user; } }
    六、测试6.1 运行ServerMain和ClientMain本程序支持单服务器多客户端,我打开了1个Server和2个Client作为演示。进程开启后界面如下:


    服务器和客户端在未开启/连接的状态下无法发送消息只能修改配置,而在开启/连接状态下无法修改配置只能发送消息,UI逻辑均由开启/连接状态决定。
    服务器配置中可以修改监听端口和人数上限,开启后接收所有来自客户端的消息,模仿解析包动作进行转发,服务器可以群发消息。
    客户端可以设置自己的名字、服务器IP和服务器端口(默认均是192.168.1.154本地IP和端口6666)。客户端连接后可以在在线用户列表中选择所有人或其他在线用户发送消息。其他用户上下线信息在在线用户列表和聊天消息框中都有提示。
    6.2 开启服务器并登陆客户端下图是第二位登陆的用户杨劲登录时,从服务器接受其他用户,显示在左侧在线用户列表中。

    6.3 服务器群发消息
    6.4 客户端群发消息客户端 选择 所有人,并发送消息:

    客户端 收到了消息,并标记为群发:

    6.5 客户端发送私聊消息:客户端 和 客户端 私聊:


    6.6 客户端下线客户端下线时所有在线用户收到其下线消息,在线列表中不再出现此用户:
    客户端 下线,通知服务器,服务器转发其下线消息:

    客户端 收到 下线通知,左侧在线列表中已经没有下线的用户了:

    七、开发过程中遇到的问题及解决办法本次完成这个课程设计还是花了不少精力和时间,由于对于Java网络编程这一块并不是很擅长,开发过程中老是遇到各种大大小小的问题,例如一开始不太清楚tokenizer.nextToken()的意思以及用法, 在参考了一些书籍以及百度各种关于网络编程的文章,才得以顺利完成本次课设。
    八、程序中待解决的问题及改进方向程序可能还存在不少小bug,后期有时间再进行修复。目前发现的一个Bug是服务器关闭时,我关了服务器接收Socket请求的线程并close了该ServerSocket,但是该线程仍然继续执行了一次ServerSocket.accept()。我尝试用了synchronized方法并判断ServerSocket是否关闭,但这个异常还是会出现。我捕捉了该异常,仅仅printStackTrace而没有做其他错误处理,幸运的是这小Bug并不影响服务器关闭,所有客户端都能正确的接收服务器关闭的消息。希望以后有时间能把这个错误给改过来。
    8 评论 197 下载 2018-11-29 09:34:27 下载需要11点积分
  • 基于JavaWeb和SQL Server的物流管理系统的设计与实现

    摘 要物流作为中国经济发展迅速的代表行业之一,在当今时代,它在我们身边无处不在,我们几乎可以随时随地看到它们的身影,为什么我们能在网上买的东西能在几天时间里送到我们手中,都是因为有许许多多的物流企业存在,然而随着社会经济的发展,我们的购买能力的提升,物流企业信息管理面临着巨大的压力,如果还是照以前采用纸笔管理信息的方式,企业信息管理通常比较繁杂,企业工作的效率实在是太低,此时采用计算机来管理企业信息成为了一种趋势,计算机相比人为操作有更高的效率,更安全,也给企业工作人员降低了工作压力,工作管理人员只需要通过操作电脑,就可以管理企业的信息,但是我们如何通过计算机来管理企业信息呢,这时开发一个物流管系统成为了众多中小型物流企业的第一任务,它对于很多企业是发展中必不可少的一部。
    在本文中,我将介绍用Java语言实现物流管理系统的基本过程,以及各种使用的技术。在物流管理系统中,主要任务是简化企业信息的增删改查操作,通过一系列的开发,本系统基本实现了物流企业所需要的功能,基本达到了数据的一致性和安全性,为了达到企业内部管理的要求,本系统对人事信息和客户信息进行管理,使物流管理系统更加完善。
    关键词:物流;企业管理;Java
    1 绪论1.1 设计背景随着中国物流业的高速发展,物流管理的重要性不言而喻。而物流管理的效率更是各个物流企业最看重的地方。近些年来,我国计算机互联网技术高速发展,很多公司和企业都实现了自动化办公及信息管理,这样的管理方式更加高效率,工作人员只需要在电脑前动动手指,就可完成繁琐的管理操作,极大程度上减轻了工作人员的工作量。
    我通过在网络上对中小型物流企业的问卷调查,了解到仍有很多中小型企业对物流信息管理仍处于纸笔操作的阶段,我认为这种工作方式效率实在太低,这浪费了太多的人力物力,我认为我们应该采用计算机来管理物流企业信息将传统手工式的物流管理方式改变为以数据流驱动的信息化管理方式,实现信息化仓储,运输,车辆调度的管理系统,人机结合办公,大幅提高工作效率,为企业创造更好的效益,这也将会是现代物流管理的主流方式。
    1.2 设计意义人们生活工作与通信,目前都与信息密切相关,但很多国内企业的仓库作业没有达到信息化,因此为实现信息数字化,开发中小型物流管理系统正是最好的方式,利用现有的信息基础设施,实现计算机管理物流企业信息对社会有着重要的价值和意义。
    1.3 设计思路
    第1章为绪论部分:介绍了本系统的设计背景及意义,明确了设计目标,阐述了本系统的特色与创新之处
    第2章为需求分析部分:对所要开发的系统进行了详细的可行性分析和对系统的综合要求进行了分析,并介绍了数据库的逻辑模型
    第3章为系统设计部分:阐述了系统的总体设计,包括系统架构设计、模块设计数据设计
    第4章为产品实现部分:对产品实现的过程及个模块功能做出了详细的说明
    第5章为产品测试部分:对产品测试的过程及测试方法进行了详细的分析与说明
    第6章为结论部分:总结毕业设计的成果,详细说明此次设计的特点及使用价值,指出不足之处或者遗留的未解决的问题

    2 需求分析2.1 需求描述由于本系统只对企业内部人员开放,所以用户就是本企业管理层员工,用户可以通过自己的工作编号注册账号登录本系统进行业务操作,主要业务包括员工信息管理、货物信息管理、运输信息管理、订单信息管理等几个方面。
    2.2 用例建模用户具有登录后,可以进行货物信息管理、人事信息管理、车辆信息管理、订单信息管理的增删改查操作。如下图:

    2.2.1 人事信息管理人事信息管理主要包括员工信息管理和客户信息管理俩个模块,如下图:

    2.2.2 货物信息管理货物信息管理主要包括客户订单管理,货物出入库,库存等几个功能。如下图:

    2.2.3 订单信息管理订单信息管理主要包括订单基本信息管理、已处理订单信息管理、在途订单信息管理。如下图:

    2.3 用例描述
    员工管理用例描述

    用例编号:CASE01用例名称:员工管理用例描述:系统管理员对员工的信息进行CRUD操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了员工或修改了员工信息或删除了系统中已经存在的员工或查看某个员工的信息活动步骤
    系统管理员登录系统系统以分页模式显示员工信息列表(每页10条)系统管理点击【新增】按钮,弹出新建员工界面,系统管理员输入员工信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示新增后的员工列表系统管理员在用户列表中选择某个员工,点击【修改】,弹出员工信息修改界面,显示员工的当前信息,管理员更改员工信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的用户列表系统管理员在用户列表中选择某个用户,点击【删除】,弹出删除提示框,当用户确定删除后,系统将当前用户信息删除,并返回到用户列表,显示删除后的用户列表系统管理员也可以在左侧菜单查看自己信息,并根据自己需求可更改自己的密码
    扩展点:如果管理员没有没登录,则提示“请先登录”并返回至登录页面修改时:工作编号是不能修改的
    客户管理用例描述

    用例编号:CASE02用例名称:客户信息管理用例描述:系统管理员对客户的信息进行CRUD操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了客户或修改了客户信息或删除了系统中已经存在的客户或查看某个客户的信息活动步骤
    系统管理员登录系统系统以分页模式显示员工信息列表(每页10条)系统管理点击【新增】按钮,弹出添加客户信息界面,系统管理员输入客户信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示新增后的员工列表系统管理员在用户列表中选择某个客户,点击【修改】,弹出员工信息修改界面,显示客户的当前信息,管理员更改客户信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的客户列表系统管理员在客户列表中选择某个客户,点击【删除】,弹出删除提示框,当用户确定删除后,系统将当前用户信息删除,并返回到客户列表,显示删除后的客户列表

    订单管理用例描述

    用例编号:CASE03用例名称:订单信息管理用例描述:系统管理员对订单的信息进行CRUD操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了订单或修改了订单信息或删除了系统中已经存在的订单或查看某个订单的信息活动步骤
    系统管理员登录系统系统以分页模式显示订单信息列表(每页10条)系统管理点击【新增】按钮,弹出添加订单信息界面,系统管理员输入订单信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示新增后的订单列表系统管理员在用户列表中选择某个订单,点击【修改】,弹出订单信息修改界面,显示订单的当前信息,管理员更改订单信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的订单列表系统管理员在客户列表中选择某个订单,点击【删除】,弹出删除提示框,当用户确定删除后,系统将当前用户信息删除,并返回到客户列表,显示删除后的客户列表系统管理员还可以查看哪些订单已经完成,哪些订单正在途中
    扩展点:添加订单时,订单信息里的客户编号在客户信息表里必须存在此客户否则添加失败
    订单费用管理用例描述

    用例编号:CASE04用例名称:订单费用信息管理用例描述:系统管理员对订单费用的信息进行CRU操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了订单的费用信息或修改了订单的费用信息或查看某个订单的费用信息活动步骤
    系统管理员登录系统系统以分页模式显示订单的费用信息列表(每页10条)系统管理点击【新增】按钮,弹出添加订单的费用信息界面,系统管理员输入订单的费用信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示新增后的订单的费用信息列表系统管理员在用户列表中选择某个订单的费用信息,点击【修改】,弹出订单的费用信息修改界面,显示订单的当前信息,管理员更改订单的费用信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的订单的费用信息
    扩展点:添加订单的费用信息时,订单信息表里必须存在你所要添加的订单,否则添加失败
    货物统计管理用例描述

    用例编号:CASE05用例名称:货物统计管理用例描述:系统管理员对订单费用的信息进行CRUD操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了货物信息或修改了货物信息或查看某个订单的货物信息,或者删除某个订单的货物信息活动步骤
    系统管理员登录系统系统以分页模式显示订单的货物信息列表(每页10条)系统管理点击【新增】按钮,弹出添加订单的货物信息界面,系统管理员输入订单的货物信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示新增后的订单的货物信息列表系统管理员在用户列表中选择某个订单的货物信息,点击【修改】,弹出订单的货物信息修改界面,显示订单的货物信息,管理员更改订单的货物信息,点击【submit】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的订单的货物信息系统管理员在客户列表中选择某条货物信息,点击【删除】,弹出删除提示框,当用户确定删除后,系统将当前用户信息删除,并返回到货物信息列表,显示删除后的货物信息列表
    扩展点:添加订单的货物信息时,订单信息表里必须存在你所要添加的订单,否则添加失败

    3 系统设计本系统的主要功能:当客户有货物运输的需求时,系统管理员会询问客户的需求并进行分析,对客户提供的信息进行填写,首先填写客户信息,其中包含了客户的一些基本信息,比如说客户的名称,地址,电话等等,当客户所填写的信息提交后,可根据客户的需求为其生成订单,从而进行一系列的订单操作,最后完成订单。
    3.1 数据库设计在数据库设计方面上,我使用的是微软公司的SQL Server数据库管理系统,SQL Server是当今比较流行的关系型数据库管理系统,可跨越多种平台使用,其功能也是十分强大,作为一个全面的数据库平台,其为企业提供了非常安全和可靠的存储数据功能。
    3.1.1 概念模型
    3.1.2 逻辑模型
    3.1.3 物理模型
    3.1.4 数据库脚本create database LogisticsMggouse LogisticsMggo--用户表create table T_user(user_id int not null primary key identity,user_name varchar(20) not null,user_pwd varchar(20) not null,emp_worknum int not null)go--员工信息表create table T_emp(emp_worknum int not null primary key identity,emp_name varchar(20) not null,emp_sex char(2) not null,emp_brithday date ,emp_cardno varchar(60) not null,emp_address varchar(60),emp_tel varchar(40) ,dept_name varchar(40) not null,)go--部门表create table T_dept(dept_num int not null identity,dept_name varchar(40) primary key not null)go--客户信息表create table T_client(client_num int not null primary key identity,client_name varchar(40) not null,client_add varchar(60) not null,client_tel varchar(40) not null,client_email varchar(40),)go--客户订单表create table T_clientorder(order_num int not null primary key identity,client_num int not null ,tri_type varchar(20) not null,yufashijian date ,yudaodashijian date,ordercreatetime date ,order_whetherSend char(2) not null,con_name varchar(20) not null,con_tel varchar(40) not null,arrive varchar(60) not null,order_whetherReceive char(2),remake text,goodsName varchar(50),goodsNum varchar(50))go--库存信息表create table repertory(input_num int not null,order_num int not null,goods_type varchar(20) ,goods_name varchar(20) not null,goods_cilent varchar(20) not null,goods_num int not null,goods_boxnum int not null,goods_counts int not null,unit varchar(20) not null,input_time date,remake text)gocreate Table T_cost(order_id int not null,freight float not null,porerage float not null,stowage float not null,orderTime date,)alter table t_emp add Constraint fk_emp_dept foreign key( dept_name) references t_dept (dept_name) goalter table t_user add Constraint fk_user_empforeign key( emp_worknum) references t_emp(emp_worknum) goALTER TABLE t_user ADD CONSTRAINT unique_username UNIQUE (user_name)goalter table t_clientorder add Constraint fk_order_clientforeign key( client_num) references t_client(client_num) goinsert into T_dept values('财务部')goinsert into T_dept values('销售部')goinsert into T_dept values('操作管理部')goinsert into T_dept values('客服部')goinsert into T_dept values('质量管理部')
    3.2 系统架构设计本系统采用MVC设计模式:jsp页面为视图层,Entity包里所放的实体类为模型层,而action,service,dao组成控制层。Action存放所有页面请求的操作方法,Service存放业务逻辑接口,Dao存放对底层数据经行操作的接口,Entity 存放实体类。

    3.3 模块设计3.3.1 用户管理类图本系统使用了struts2框架进行设计,将实体类直接封装进Action作为数据模型对数据库进行操作,之后将结果返还给页面。
    员工管理类图

    客户管理类图

    订单管理类图

    3.3.2 用户管理操作流程员工管理时序图

    客户管理时序图

    订单管理时序图

    费用统计管理时序图

    3.3.3 角色管理操作流程
    4 产品实现4.1 系统管理模块实现4.1.1 界面设计系统登陆界面

    系统管理界面

    员工信息管理界面

    客户信息管理界面

    订单信息管理界面

    4.1.2 功能实现本系统运用了Struts2框架进行设计,在Action模块使用模型驱动封装处理数据,详细代码如下:

    Service层主要是将Action与Dao之间关联在一起的中间桥梁,详细代码如下:


    Dao是数据处理层,使用jdbc接口连接sqlserver数据库连接主要代码如下:


    5 产品测试5.1 测试方法与策略本系统采用了单元测试法,这是一种比较传统的测试方法,将每一段功能代码都一一测试,尽量减少代码的bug。单元测试法具有许许多多的多优点,首先因为通过对程序的一步一步编写和测试,如果每一段功能都可以保证其正确性,那么程序本身就不会存在太多问题,即使到了开发后期,我们也可以根据项目的需求,轻轻松松的增加自己所需要的功能,我们也不用担心这会破坏程序的核心,因为经过从程序开始的一步步验证,我们可以确保程序的核心不被破坏;其次,在写单元测试的同时我们也会从使用者的角度去想问题,将用户在实际中所遇到的所有问题都考虑在内一一测试,将每个单元功能分开测试,降低程序的耦合度。
    测试包括以下几个模块:程序功能性测试模块;程序界面测试模块;程序性能测试模块;程序安全性测试模块;程序兼容性测试模块

    程序功能性测试模块

    调试程序中的各个功能,按键,测试每个提交的数据是否合理,页面能否正确跳转数据显示测试,数据能否在界面上正确显示
    程序界面测试模块

    各个HTML页面是否完善,美观,风格一致页面中的重点内容和热点内容是否在页面中突出页面控件是否正常显示页面中文字、图片检查
    程序安全性测试

    登陆功能是否安全,是否保证不被恶意登陆系统数据是否存在溢出故障,导致数据丢失
    程序兼容性测试

    浏览器的兼容性操作系统的兼容性数据库的兼容性

    5.2 系统管理模块测试经过种种测试,系统原本设想的功能已基本实现,功能测试上,未发现异常,界面上并没有发现存在空页面和无效页面,有不正确的出错信息返回,各个提交按钮也能正常工作,页面风格统一,美观,布局合理,重点内容突出,控件正常使用。
    6 结论6.1 毕业设计成果特点此次毕业设计将中小型物流企业比较复杂繁多难以集中的信息,用计算机来管理,解决了中小型企业管理不便的问题,大幅度提高了企业管理效率,而这符合现代企业制度的主流,在当今信息化高度发展的社会中,无论是什么类型的企业,都会采用信息化管理制度,通过计算机互联网管理企业信息,不仅更加容易,且更加安全,不容易丢失。
    6.2 设计成果的实用价值或应用前景此次毕业设计的初心就是为了给中小型物流企业带来方便,而系统中的各个功能也基本满足了中小型物流企业的种种需求,为企业管理带了方便,我相信在以后的企业管理中,无论什么类型的企业都会采用计算机来管理信息,随着以后计算机技术越加发达,系统功能越到,将大大的为人类带来便利,其潜力也将是不可限量的。
    6.3 不足之处或遗留未予解决的问题在设计和实现该系统的过程中,由于系统的功能有限,因此并不能真正的投产于一个企业内部使用,一个项目又开始进行功能需求,到最终的实现是需要非常多的时间的,并且项目的开发过程并不是一个人能完成的,因此此系统只是大概模拟了现代物流的基本内容。但是通过此次毕业设计,我受益匪浅,通过对物流管理系统需求分析,不仅了解到了小型物流企业的基本工作流程,更重要的是真正体会到了软件开发流程中需求分析的重要性。本系统也将会在今后的应用中逐步完善,做到尽善尽美。
    参考文献[1] 刘京华 等. 《Java Web整合开发王者归来》[M]. 清华大学出版社, 2010年01月.
    [2] 萨师煊,王珊.《数据库系统概论》.高等教育出版社,2002年2月.
    [3] 张峋, 杨三成.《关键技术:JSP与JDBC应用详解》[M].中国铁道出版社, 2010年11月.
    [4] 徐玥. 《非平均访存集群中负载平衡零碎的设计与完成》[D]. 哈尔滨工业大学 2014
    [5] 黄大勇.《面向不同优先级网格作业资源重分配成绩的专业技术支持》[D].哈尔滨工业大学 2011
    [6] 刘振英. 《在媒介交融中不时开展 再创辉煌》[J]. 中国播送. 2011(03)
    [7] 刘宴兵,胡文平,杜江. 《基于物联网的网络信息平安体系》[J]. 中兴通讯技术. 2011(01)
    [8] 周鹏飞. 《国际有关SNS网站的研讨综述》[J]. 古代情报. 2010(07)
    [9] 何晓佑  《产品程序设计与方法》中国轻工业出版社,2003
    [10] 吴宏森,宋顺林. 《MVC架构在工程项目管理零碎中的使用》[J]. 微计算机信息. 2006(22)
    [11] 林锐.《软件工程与项目管理解析》[M].北京:电子工业出版社,2003.
    [12] 赵源.《使用JAVA语言编写计算器的设计研究》[J].今日科苑,2015.
    [13] 赵亚娟.计算机软件JAVA编程特点及其技术研究[J].数字技术与应用,2016.
    [14] 贾东.《基于java的文件监控程序设计与实现》[J].信息技术与信息化,2016.
    [15] 衣鹏,阎新芳,吴帅杰.《Java设计模式在数据库编程中的应用研究》[J].信息通信,2014.
    3 评论 25 下载 2020-08-24 12:21:25 下载需要12点积分
  • 基于Python实现的手写数字识别

    一、准备
    测试准备:pycharm,windows自带画图功能,python3.5
    安装python3.5
    将解压的文件夹拖入pycharm中,设置解释器路径为:文件解压路径\ML_num\venv\Scripts\python.exe
    若要调用文件,只要点入文件并点击右上角绿色三角或鼠标右键点 run 相应文件

    二、手写数字识别调用UI.py 得如图界面:

    测试可用windows自带画图功能,刷子选用喷枪,粗细第3个,尽量喷清楚,图片后缀为.png图片大小为400*400像素(其他大小也行只要不小于32*32)如下:

    点击选择文件找到测试文件,选择是否使用备份(默认使用)再点击开始识别, 可选择自动识别或手动识别,手动识别截图时鼠标左键按住拖动即可(数字周围尽量有些许空,若识别错误,很大原因是由于截的图左右空格太小、太大),再输入真实值,结果为:文件名为输入的真实值_最大数字.txt。以下结果为文件名为:6_3.txt 如图:

    三、摄像头务必使用笔记本电脑,数字尽量写得大一些,尽量在光线明亮处拍摄,点击摄像头,如图:

    按q键退出,其他键拍摄,之后点击开始识别与第二部分相同。
    四、介绍
    使用的非标准库:opencv,numpy,pillow
    机器学习技术:KNN邻近
    引用:《机器学习实战》源码并对其中部分内容修改,增加部分操作;部分代码参考cnblog与CSDN

    文件介绍


    data_set:备份文件夹
    images:图片文件
    testDigits:测试数据
    testDigits(测试):正确率测试数据
    trainingDigits:训练数据
    vedio_cut.py:摄像头拍摄
    hand_number.py:截取图片并修改大小为32*32, 转为灰度图
    zero_one.py:将灰度图转为01矩阵并存入testDigits文件夹内
    kNN.py:k值邻近算法识别数字并统计结果, 可以选择使用备份数据训练识别或重新开始
    get_next_num.py:得到指定数据文件数量
    check:测试正确率
    UI.py:使用tkinter库构造界面
    新增im:样例图片
    2 评论 177 下载 2019-04-19 10:14:37 下载需要11点积分
  • 基于java的网上考试系统

    开发一套标准化考试系统,要求通过该系统完成多个科目的标准化考试工作。考试开始时,考生在客户端机器上使用学号和密码登录进入考试系统,如下:

    所有考生的信息(包含学号,姓名和密码)在服务器端的student.cfg文件中保存,该文件的保存格式为:“学号:姓名:密码”,如下:

    登录成功后进入选择科目界面,考生选择一门考试科目,如下:

    所有考试科目的列表在服务器端的subject.cfg文件中保存,该文件不仅保存科目列表,还保存了与科目对应的试题文件的文件名,格式为:“科目名=试题文件名”,如下:

    考生选择考试科目后,程序将从服务器接收该科目的试题,并进入考试主界面,如下:

    每门科目的考试试题保存在服务器端的一个试题文件中,试题文件的格式如下:

    每5行构成一道试题,其中第一行为试题的题干,以下4行为试题的4个选项,并且在正确选项的行首用“<T>”来标示。
    考试完成后考生点击主界面上的“交卷”按钮,程序将自动计算考生的得分,并将得分发送给服务器,保存在服务器的*.sco文件中,每门科目都有一个相应的文件,该文件的格式为:
    “学号:成绩”,如下:

    为完成以上程序,定义以下包及类:

    1. 客户端和服务器端的通信方式
    登录请求
    客户端发送数据:学号、密码服务器端返回的数据:学生对象和当前能提供的考试科目列表
    选择考试科目
    客户端发送数据:科目名服务器端返回的数据:试卷对象
    交卷:
    客户端发送数据:学号,科目,成绩服务器端返回的数据:成功与否的信息
    退出
    2. 服务器端的文件
    若干试题库文件(corejava.exm)
    若干科目的成绩文件
    学生信息的文件

    3. 服务器对文件的访问方式:
    试题库文件:Paper getPaper(String 科目名);
    学生信息的文件:Student getStudent(int id,String passwd);
    成绩文件:addScore(int id,float score,String 科目);
    3 评论 70 下载 2019-05-08 22:06:34 下载需要11点积分
  • 基于java和Sql Server数据库的停车场管理系统

    一、实验内容:实现停车场管理系统,应用于车辆的出、入管理。
    二、功能要求:包括车辆进出管理与系统管理等功能模块,可根据车辆停放时间及收费标准自动收费。用户需要事先办理停车卡并充值,停车卡分优惠卡和普通卡两类。

    车场管理:车辆入场、车辆出场
    信息查询:某时间段的出入场信息,当前在场信息,车辆历史停车记录及收费信息
    信息维护:用户及停车卡信息维护、充值等
    系统管理:车位信息,计费标准等

    系统包含两类用户:管理员用户和普通用户。
    管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息、停车卡充值,查询计费标准。
    三、实验环境:
    Windows XP
    JDK 1.6
    Eclipse
    SQL Server
    备注:

    在XP平台开发DK(JavaDevelopment Kit)是Sun Microsystems针对Java开发员的产品Eclipse进行前台和程序设计,开发图形用户界面和停车收费功能实施
    SQL建立数据库

    四、需求分析与设计:4.1 需求分析:本软件具有如下主要功能:

    本系统包括两类用户:管理员用户和普通用户。管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息(只限于个人信息)、查询计费标准、查询当前在场信息、查询出入场信息、当前可用车位信息、口令修改。具体模块划分为如下模块:车场管理模块、信息查询模块、信息维护模块、系统管理模块。
    车场管理模块:(应该分为车辆入场和车辆出场两部分)

    车辆入场功能描述:车辆进入停车场时进行登记,记录入场时间并指定车位。只有具有停车卡的车辆才可进场,没有办理停车卡的车辆,应先办理车卡。如果没有相应车位,不能入场;如果卡中余额低于100元,应先充值后再入场。满足条件的车辆,为其指定车位并记录入场时间。车卡分两种类型普通型和优惠型。车辆出场功能描述:车辆开出停车场时进行登记,记录出场的时间并进行自动收费(从卡上扣除)。根据车辆进场时间,出场时间及收费标准自动计算车主应该缴纳的费用。如果停车时间包含不足一小时的时间,超过30分钟按一小时计算,不足三十分钟不计算。如果卡上余额足够则直接扣除;如果卡上余额不足,则应先充值后再扣除相应费用。
    信息查询模块功能描述:在这个模块里用户可以查询出入场信息、当前在场信息、用户个人信息、用户历史记录、收费标准以及当前可用车位信息
    查询出入场信息功能描述: 查询当前在场信息户可以在这里查询到两种车位的总量及当前可有的车位数量。
    查询用户个人信息功能描述:登录的管理员可以根据卡号和名字查询用户信息。登陆的普通用户只可以查到自己的信息。
    查询用户历史记录功能描述:用户可以输入卡号查询相应卡号的历史记录,包括车位号、开始停车时间、结束停车时间、停车总时间、相应收取的费用。
    收费标准功能描述:用户可以在这里查询不同种类的车位和不同卡的计费标准。
    当前在场信息功能描述:用户可以在这里查询到当前在场的车辆信息,包括卡号,车位号,开始停车时间。
    当前可用车位信息功能描述:在这里用户可以查询当前可用的车位的信息,包括车位号、车位类型。
    信息维护模块在这个模块里用户可以实现用户注册、用户修改及用户充值
    用户注册功能描述:在这里管理员可添加新的用户(普通用户)。
    用户修改管理员在这里可以修改用户。这里会以表的形式显示所有的用户信息,包括用户的停车卡信息维护,充值信息等。管理员点击相应的一行用户信息,这行信息会自动填充到表下的面板里,用户可以在面板里修改用户信息,面板下面有两个按钮,修改、删除,点击相应的按钮可以实现相应的功能。
    用户充值功能描述:用户可以再这里查到自己的余额,并且可以在这里完成充值。
    系统管理模块功能描述:在这个模块里可以修改相应的车位信息计费标准、注册管理员、更改用户口令以及查看系统声明信息。
    管理员注册功能描述:管理员可以在这里添加新的管理员。
    更改口令功能描述:用户可以在这里更该自己的密码。注:操作员只可以修改自己的密码。
    计费标准管理功能描述:管理员可以在这里不同车位类型、不同车卡类型的收费标准。
    关于功能描述:用户可以在这里看到系统声明。

    4.2 界面设计登陆界面

    管理员主界面

    普通用户主界面

    车辆入场界面

    车辆出场界面

    计费标准界面

    当场在场信息界面

    用户历史信息界面

    用户个人信息界面

    普通用户个人信息界面

    出入场信息界面

    当前可用车位信息界面

    用户注册界面

    用户修改界面

    用户充值界面

    管理员注册界面

    更改口令界面

    计费标准管理界面

    关于界面

    五、数据库设计5.1 数据库关系图
    5.2 数据表的结构设计


    用户表:users








    字段名称
    数据类型
    可空
    默认值
    说明


    cardid
    int
    不可

    主键,用户的停车卡号


    name
    Nvarchar(20)
    不可

    用户姓名


    password
    Nvarchar(20)


    用户密码


    cardtype
    Nvarchar(20)


    停车卡类型


    userstype
    Nvarchar(20)


    用户类型


    carid
    int


    用户车牌号


    tel
    int


    用户电话号码


    overage
    int


    用户余额






    车位信息表:sit_infor








    字段名称
    数据类型
    可空
    默认值
    说明


    stationid
    int
    不可

    主键,车位号


    stationtype
    Nvarchar(20)
    不可

    车位类型






    停车收费卡收费表:charger








    字段名称
    数据类型
    可空
    默认值
    说明


    cardtype
    Nvarchar(6)


    车卡类型


    stationtype
    Nvarchar(20)


    车位类型(车卡类型与车位类型一起作为主键)


    charge
    int


    价格






    停车表:park








    字段名称
    数据类型
    可空
    默认值
    说明


    cardid
    int


    车卡号(外键)


    stationid
    int


    车位号(外键)


    parkid
    int

    1,每次增加一
    停车号,主键


    startpark
    datetime


    停车开始时间


    endpark
    datetime


    停车结束时间


    fee
    int


    停车的收费


    sumpark
    int


    停车总时间



    六、关键技术介绍6.1 在其他类中得到当前登录用户对象 实现方法:在LoginFrame类中设置两个静态方法,在其他类中只需要引入LoginFrame类,然后调用他的静态方法即可。方法体如下:
    public static users getUser() { return user; } public static void setUser(users user) { LoginFrame.user = user; }
    6.2 实现用户类型不同,主界面不同的功能 可以定义静态方法disMenu().当用户是普通用户时,调用disMenu()方法即可。具体实现如下
    public void disMenu() { mnuPark.setEnabled(false); mnuSever.setEnabled(false); mnuManZhuCe.setEnabled(false); mnuManCharge.setEnabled(false); } if(user.getUserstype().equals("管理员")) { MdiFrame frame1 = new MdiFrame();//创建一个主窗体 frame1.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 } else {//判断用户名是否为null MdiFrame frame = new MdiFrame();//创建一个主窗体 frame.disMenu(); frame.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 }
    6.3 怎么得到系统时间 SimpleDateFormat myfmt=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String a4 = myfmt.format(new java.util.Date()).toString();
    6.4 怎么计算时间差值 try { java.util.Date now = myfmt.parse(a3);//a3是系统当前时间(即出场时间) java.util.Date date=myfmt.parse(a7);//a7是入场时间 int l=(int) (now.getTime()-date.getTime());//计算毫秒差值 day=l/(24*60*60*1000);//获取天数 hour=(l/(60*60*1000)-day*24);//获得小时 min=((l/(60*1000))-day*24*60-hour*60);//获得分钟 } catch (Exception e1) { JOptionPane.showMessageDialog(null,"消费计算错误"); } if(min < 30)//如果分钟小于30分钟 a8 = day*24+hour; else //如果分钟大于30分钟 a8 = day*24+hour+1;
    6.5 怎么让布局更优美 使用布局管理器; GridBagLayout,以更改密码界面为例:
    getContentPane().setLayout(new GridBagLayout()); setBounds(234, 129, 285, 223); final JLabel label_5 = new JLabel(); label_5.setText("登 录 名:"); final GridBagConstraints gridBagConstraints_11 = new GridBagConstraints(); gridBagConstraints_11.gridy = 2; gridBagConstraints_11.gridx = 0; getContentPane().add(label_5, gridBagConstraints_11);
    七、系统实现功能结构图
    48 评论 1464 下载 2018-11-19 09:32:08 下载需要13点积分
  • 基于LL1文法的语法分析

    一、目标本次实验的目的是对编译器进行词法分析的过程进行模拟,我选择了在实际中更为通用的自底向上的词法分析器的分析过程,最终产生规约序列。对于LR(0)和LR(1)问题,我的程序对于LR(0)和LR(1)是通用的,因为只要给出合法的parsing table和上下文无关文法, 程序就能进行相应的词法分析,而parsing table和文法都是用户输入文件给出。
    二、内容概述本文档描述了编译原理课程实验中,语法分析器部分的实验内容,实验方案以及结果。
    三、实验环境
    操作系统:win8.1编译器:eclipse使用的工具:github编码格式:utf-8
    四、思路和核心思想根据给出的文法,文法要求是非二义性的、非左递归的上下文无关文法,输入到product的文件中。从文件中读出输入的文法,先通过对输入的文法求每一个产生式中的非终结符的first和follow集合。来构建LL(1)的预测分析表。然后使用预测分析表来进行表格驱动,对于输入的串进行预测分析,使用书上的算法,现在在此处附上这算法,因为比较难打字,我附图:

    五、测试输入与输出:测试输入的文法产生式是书中的例子文法4-28,因为表示空的字符我打不出,就使用了#代替。书中的产生式还中的左边可以有或(|)进行连接,在我的输入中只能分开,当作多个产生式,同时不能有其他字符。对于终结符,只能有一个字母限定,书中的id我使用i代替。由于输入的原因,我把把书中的输入形式做了一下转变,实质上是同一个文法。
    同时,输入串中输入的文件在项目当中,截图如下:

    程序中产生的first和follow,如下,也存在项目中的文件first_follow.txt中:

    产生的预测分析表:

    预测分析过程:

    这些测试的结果都会以文件的形式产生在项目里的文件中。也会打印到控制台上。
    2 评论 95 下载 2018-11-02 16:00:40 下载需要8点积分
  • 基于Android系统手机通讯录管理软件的设计与开发

    摘要谷歌在安卓领域投入了大量精力来开发,使得安卓技术得以广泛推广,现安卓移动平台设备在市场上已经得到大量推广及普及。在Android移动终端操作系统的快速发展,Android的各种手机软件也大量增长。当然,在手机终端中,手机通讯录是手机终端必不可少的基础功能,其质量直接影响着用户对手机使用的体验与感觉。手机通讯管理软件不仅仅只是能够简单添加联系人以及联系方式的功能,而今已发展成为多种形式,丰富了联系人的信息,存储了更多的内容。此课程设计研究的这个项目,主要实现添加联系人的多种联系方式的功能。
    本软件采用Android Studio+Android SDK集成环境,应用程序编程语言采用Java高级语言开发。通过对通讯录中的联系人的管理,来方便用户通讯更加便捷,联系人的数据保存更加安全。在对Android手机通讯管理软件进行详细的系统设计时,对功能进行详细的划分并对其功能做了详细的介绍,列出了一些主要功能流程图。
    关键词:通讯录 Android 数据库 SQLite
    第一章 绪论1.1 项目研究背景经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
    Android是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android最大特点在于它是一个开放的体系架构,具有非常好的开发和调试环境,而且还支持各种可扩展的用户体验,Android里面具有非常丰富的图形系统,对多媒体的支持功能和非常强大的浏览器。
    Android平台的开放性等特点既能促进技术的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定特色化的产品。
    1.2 项目研究的目的及意义随着4G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。在Google和Android手机联盟的共同推动下,Android在众多手机操作系统中脱颖而出,受到广大消费者的欢迎。
    手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,有9成以上的消费者使用手机通讯录功能。随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展。通讯录从无到有,大大丰富了内容,同时结构也发生了革命性变化,而且随着手机的发展,相信更优秀的通讯录会越来越受到社会各层人士的喜爱。
    1.3 系统主要实现内容通过对Android技术的相关研究,了解Android源码实现原理以及过程,从而设计出一款能够使用的手机通讯录。
    这款手机通讯录实现的相关内容如下:

    简洁、实用的操作界面
    联系人的增删改查
    分类的增删改查
    呼叫联系人
    登录、注册、修改密码
    群组的增删改查
    导入导出联系人
    支持模糊查询手机通讯录

    第二章 系统分析2.1 系统可行性分析2.1.1 技术可行性Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java 应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。
    本软件用的是Java开发语言,在Android Studio集成开发环境下,调试容易。当前的计算机硬件配置或则现有安卓手机的硬件配置也完全能满足开发的需求,因此技术上是绝独可行的。
    2.1.2 经济可行性开发该系统所需的相关资料可以通过已存在的相关系统进行调查采集,所需的软件系统、硬件平台等都易于获得,且不需要Android平台机器,用模拟器即可实现开发研究,开发成本低,容易实现,从经济角度来看,该系统可行。
    2.1.3 操作可行性不管是安卓平台的手机,还是计算机,其成本的下降,导致计算机,安卓手机购买成本的降低.这套系统是利用自己的计算机,且使用安卓模拟器,使开发出来的系统有友好的用户界面、操作简单,因此在操作上是可行的。
    2.2 Android通讯录的使用意义该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等功能。要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。
    第三章 系统概要设计3.1 系统总体设计Android手机通讯管理软件主要功能模块包括:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等。

    3.2 处理流程设计3.2.1 业务流程图用户首次进入手机通讯管理软件后,会进入用户注册界面,当用户注册成功之后,输入密码即可看到联系人列表界面。联系人列表界面右下方显示增加联系人按钮。上方可以进行联系人的多条件搜索。同时长按某个联系人可实现编辑删除功能。当然点击联系人也可以看到详细信息。界面中显示我的群组列表,打开之后即可进行群组的增删改查功能。点击菜单键,显示通讯录的导入导出功能以及修改密码功能。
    3.2.2 数据增加流程图添加联系人时,数据由用户输入,点击确定按钮,判断数据是否合法(及用户名是否为空),合法则插入到数据库;不合法,提示错误信息,让用户重新输入。流程如图所示:

    3.2.3 数据修改流程图编辑联系人时,点击编辑联系人菜单,输入修改后的数据,点击确定按钮,判断数据是否合法,合法,则更新数据库;不合法,则返回错误信息。 流程如图所示:

    3.2.4 数据删除流程当用户选定一个联系人时,单击删除联系人菜单,提示用户是否删除,点击确定按钮,则从数据库中删除此条记录。数据删除流程如图所示:

    3.3 数据库设计3.3.1 SQLite数据库简介SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低。
    本系统采用的是Android系统自带的SQLite轻型数据库数据库。因此占用资源非常小。
    3.3.3 数据库表结构首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、群组ID、地址等联系方式。创建群组表用来保存ID和群组名称等信息。两个表联合配合。表结构如图所示:

    第四章 系统详细设计4.1 联系人浏览模块进入手机通讯管理软件后,看到的第一个界面是联系人列表界面。该列表是由ListView控件生成的,打开数据库(如果数据库不存在则创建数据库,并创建数据表),查找数据库中所有的联系人,并把联系人姓名和移动电话号码以及职位这填充到ListView的adapter中。每一行显示一个联系人的姓名和手机号码,联系人的显示的顺序是根据插入数据库的顺序显示的。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话、导入导出通讯录等。

    点击[菜单]按钮时,就会显示主菜单项,其中包括:修改密码、导出数据、导入数据。
    点击添加按钮,会进入添加联系人界面,可以输入联系人相关信息,完成联系人添加功能。点击上方搜索栏目,会进入联系人查找界面,可以进行联系人查找,搜索想要找的联系人。
    点击菜单按钮,打开修改密码、导出通讯录、导出通讯录等功能。

    长按列表的某一行时,会弹出长按菜单,其中包括:拨号、编辑联系人、删除联系人。点击查看联系人菜单会进入查看联系人界面。点击编辑联系人菜单会进入编辑联系人编辑界面。点击删除联系人时,会弹出对话框,询问是否删除联系人,点击确定,则从数据库中删除该联系人。

    4.2 查看联系人模块在联系人浏览界面点击某个联系人,则会跳转到该界面。该界面使用TextView把从数据库中调出的联系人的详细信息显示出来,这里面包括联系人姓名、手机号、地址等详细信息。

    4.3 编辑联系人模块编辑联系人界面使用EditView控件显示并修改联系人的详细信息。联系人的所有信息,处于可编辑状态,手机号和座机号的EditView设定为只能输入数字。修改完信息后点击确定按钮,触发确定按钮点击监听事件,从而对数据库中该联系人的信息进行更新, 然后自动返回联系人浏览界面。点击取消按钮会返回联系人浏览界面。

    4.4 查找联系人模块这里采用的查找方法是SQL模糊查询,可以只输入联系人姓名中的一部分,即可查找到所有包含该部分的联系人,并在ListView中显示出来所有的联系人的姓名和手机号码。可实现查找职位、手机号码、名字等信息。

    4.5 修改密码点击菜单,可以查看该软件的修改密码、导入导出等情况。并可实现全部功能。

    4.6 分类管理点击我的群组界面,可以查看群组并且显示群组。在里面可以对群组进行增删改查操作。
    77 评论 346 下载 2019-01-30 17:27:39 下载需要13点积分
  • 基于JSP和Mysql的城市公交查询系统的设计与实现

    摘 要近年来, Internet推动了以互联网技术为核心的各项工作蓬勃展开,互联网的强大也大大的促进了社会的发展,整个社会信息化进程逐步加快,网络也变成了我们日常活动中越来越重要的组成成分。为了使得我国公交乘客出行及查询有关信息更方便,本文运用JAVA语言技术,Jsp技术,Mysql数据库开发了B/S结构的城市公交查询系统。
    该系统顺应了时代发展且具有以下优点:首先,方便乘客的出行,乘客不用询问站牌工作人员如何倒车,便可到达目的地。其次,乘客在网上就可以查询到公交公司发布的路况信息,以便提早做好换乘准备节约出行时间。最后,本系统可以节约人力资源,以往的站牌附近要安排公交公司的工作人员来帮助不熟悉的乘客,有了公交查询系统提前上网查询便可知道。
    关键词:B/S架构;JAVA;Mysql;JSP
    AbstractIn recent years, Internet promoted the work of Internet technology as the core of the Internet booming, powerful also greatly promoted the development of the society, the information process of the society gradually accelerated, network has become an increasingly important component of our daily activities. In order to make our bus passengers travel and query information more convenient, this paper uses the JAVA language technology, Jsp technology, Mysql database to develop the B/S structure of urban public transport query system.
    The system complies with the development of the times and has the following advantages: first of all, to facilitate passenger travel, passengers do not ask the stop sign, how to reverse the staff, you can reach the destination. Secondly, passengers can inquire about the traffic information issued by the bus company in order to save the travel time. Finally, the system can save human resources, the bus stop near the bus station staff to help passengers who are not familiar with, with a public transport inquiry system, advance access to the Internet will be able to know.
    Key words: B/S architecture; JAVA; Mysql; JSP
    1 绪论1.1 选题背景随着低碳生活的普及,人们更倾向于低碳环保的出行方式,完善公交系统无疑具有重要意义。公交是居民日常生活中最常使用的交通工具之一,伴随着我国经济繁荣和城市人口增长,出行工具的选择也变得越来越重要。政府在公共交通方面的投入正在逐步加大,使得城市内、城乡间的公交系统更加完善,原来的公交线路不断更新,居民们接收到的信息滞后,出行变得很不方便。纸质公交指南时效性低且不方便使用者查询。本系统加入了浏览器查询、自动更新等功能完善系统使居民的出行更加方便快捷。
    1.2 国内外发展状况除了杭州,上海等几个城市的居民可以通过电子站牌了解公交车的行驶情况外,其它城市需要乘公交出行的居民获取公交实时信息几乎是不可能的。我国许多城市都有一些颇具设计感的公交站台,但我们却很难在这里找到我们出行需要的信息。因此,居民想要找到“静态线路信息”或者“动态实时信息”都感到十分困难。
    有了权威的交通信息发布机构才能确保乘客获得信息的时效性,而迄今为止我国大多数城市还没有有关的管理机构和相关法律法规。随着居民对于公共交通出行的需求越来越大,本文基于信息技术和管理理论建立了管理信息系统。从提高居民生活水平的角度看,将计算机管理信息系统应用于我们的日常生活中是时不我待的。所以我的毕业论文选择了公交车查询系统,就因为他是一个较为贴近生活的一个问题,并且如果开发出来,则可以很大的方便乘客查询相关的公交信息,为自己的出行制定良好的乘车计划。
    1.3 选题的目的近年来,我国的城市发展速度之快,道路修缮之完善令很多市民的非常吃惊,城市的范围在不断扩大,随之公交线路的铺设也在随时进行,作为当代的大学生,每学期从学校回到自己的故土,是否发现自己的家乡在经历着一些变化,一时间连自己家乡的方位都有些晕头转向,更何况是那些外地的打工者或是来当地旅游的游客他们未尝不是这样,询问当地的市民看似是一种好办法,但是遇到倒车频繁,路途偏远,也怕是心有余而力不足,所以一个好的,便捷的,用户体验好的公交查询系统甚是重要,想去什么地方把他们输入进去,一目了然,想途径什么地点自己也可随意的查看,也不用因为自己解释不清楚或听得不清楚引起不必要的绕远。我设计的系统不仅包括了站点,公交线路的查询,还包括了公告发布和在线提问功能,让市民实时掌握城市的公交动态,方便他们的出行。
    1.4 研究手段及意义1.4.1 研究方法本研究课题设计的公交查询系统客户端模块,主要工作有:

    亲身体验了解客户需求,进行相关的需求分析
    根据需求分析和设计的本系统的框架
    根据框架结构的设计,制结构图
    编写相关的开发技术文档
    编写代码
    对系统进行单元测试

    1.4.2 技术路线本文涉及的系统基于B/S(Browser/server,浏览器/服务器),该模式采用了多种技术,在所有平台下都能顺畅地运行。
    1.4.3 意义近年来,我国经济发展迅速,城市建设也越来越完善。随着人口的增加,城市交通压力也在不断加大,公共交通与居民的生活息息相关,同时对于经济发展有着不容忽视的影响。虽然公共交通快捷且客运量大,但是公交信息的更新却跟不上公交系统发展壮大的步伐,居民难以获得及时的信息造成耽误出行。因此,创建一个方便的的公交信息查询系统,包含浏览器查询,实现中心控制、自动更新等功能,将极大地提升居民的出行体验。
    2 相关技术简介2.1 Jsp技术介绍JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet,主要用来运行Java web的使用者界面。开发者通过使用HTML代码、XHTML代码、XML元素和嵌入JSP操作编写JSP。JSP技术使用web表单得到用户自定义数据、通过数据库和其他数据库资源,接着动态地建立网页。JSP标签有各种各样的功能,像访问数据库、记载用户采取的信息、造访JavaBeans组件等,不仅如此在各种网页中对信息的传达和共用。
    JSP程序通过Java的编程语言,对动态网页进行封装。根据tags和scriptlets,网页对存在于服务端的资源的应用逻辑的造访也是可以的。JSP将网页逻辑与网页设计和显示分隔开,对可重新利用的基于组件的设计进行支持,更易于对基于Web的应用程序进行开发。
    JSP以及Servlet ,在服务器上运行的,一般将运行后的html文本返送给客户端,仅仅在客户端的浏览器就能显示。先运行调用JSP页面的代码,然后在Web服务器送回的JSP文件的结果中碰到的HTML代码送回到客户端。Java程序段来运行数据库,重定向页面可以插入页面和动态页面的功能需要被新建。运用标记和编程语言技术形成动态生成的网页时,将形成逻辑处理包。
    Java Servlet 是JSP的技术根本,并且很多的Web应用程序的设计都要有Java Servlet和JSP的共同合作。JSP简单易用,完全的面向对象,不仅平台无关性还有安全可靠,这些都是继承了java技术。
    从JSP出世后,很多的企业都设立JSP技术的服务器,像IBM、Oracle、Bea这些企业,也让JSP快速变为商业应用的服务器端语言。JSP和 Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java 2 platform Enterprise Edition)应用体系中的一部分。Servlet与 CGI很相似,它是HTML程序和后台隔离开的。它们的开始原理也差不多,都是服务器接到客户端的指令后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process),而Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(Parent Thread)来实现资源共享,这样就减轻了服务器的负担,所以,Java Servlet可以用来做大规模的应用服务
    JSP技术的优点:

    一次编写,到处运行:除了系统之外,代码无需做任何改动
    系统的多平台支持:一般可以在所有情况下的平台上进行设计,可以放在所有情况下进行发展。相比ASP/.net来说,优点是显而易见的
    强大的可塑性:根据一个小的Jar程序能够对Servlet/JSP进行操作,也能根据不少的服务器进行集群和负载平衡,而且可以根据多个Application处理问题。单个服务器到多个服务器,Java表现了一个创造性的能力
    拥有多元化的工具:Java现有的很多设计方法中许多工具不需要成本,其中大部分均可以在各平台中顺利进行
    支持服务器端组件:web的运行需要强大的服务器支持,因此为了完善系统的可操作性,开发者应当在使用web时加入其它工具,JSP能够利用 JAVA BEANS 组件来展示出各式各样的商务功能
    内部对象表现出:request 用户端请求,这个请求会包括来自GET/POST请求的参数; response网页传回用户端的反应;管理pageContext 网页的属性;session 与请求相关的会话;application servlet正在进行的内容;out 用来输送响应的输出流; config 代码片段配置对象;page JSP网页本身

    2.2 MyEclipse简介MyEclipse是基于Eclipse进行插件合成,最终形成功能强大的开发软件。目前主要用于JAVA,JAVAEE的开发,也可以用于移动应用的开发,其主要特点是功能强大,应用广泛,并且支持很多开源的产品,应用前景非常广发。
    MyEclipse是由Eclipse通过对插件的集成而来,是对IDE的拓展,可以用来开发网页等应用,可以实现程序的开发,调试,发布等,能极大的提高开发效率,能完美支持HTML、STRUTS等,可以说集成后的MyEclipse包含了当前所有主流的开源产品。MyEclpise也经历了很多代的产品,从最开始的到后来的2014版本,2015版本等都说明了它在发展历程中的变化。
    MyEclipse的配置使用也非常智能,不需要使用者懂太多的知识,只需要在自己使用的功能中进行了解即可,在完成项目开发之后,也可以直接通过MyEclipse进行项目部署,可以将网页项目进行选中,直接运行在Tomcat中,也可以将项目打包通过导出功能将项目全部导出,然后将项目发布到tomcat中,通过对配置文件的设置安排项目,之后进行查看。可以说,有了MyEclipse之后,基本就能支持所有的web开发,就能使用快捷的编译工具进行快速的开发,也能在各种各样的服务器上进行代码测试。在其他方面,MyEclispe也有很多的开发前景,比如在云开发领域,在移动端开发领域,在企业级开发领域等等,因此,MyEclipse的应用场景非常的广泛。
    2.3 数据库技术数据库的设计是研究数据库及其应用系统的技术,是数据库在应用领域中主要的研究课题。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效的存储数据,满足各种用户的应用需求(信息要求和处理要求)。一个信息系统的各个部分能否紧密的结合在一起以及如何结合,关键在数据库。因此只有对数据库进行正确的概念设计、合理的逻辑设计以及有效的物理设计才能开发出完善而高效的信息系统。数据库设计是信息系统的开发和建设的重要组成部分。
    2.3.1 数据库的体系结构数据的体系结构分成三级:内部级(Internal),概念级(Conceptual)和外部级(External)。这个三级结构有时也称为“三级模式结构”。

    外部级:最接近用户,是单个用户所能看到的数据特性。单个用户使用的数据视图的描述称为“外模式”
    概念级:涉及到所有用户的数据定义、是全局的数据视图。全局视图的描述称为“概念模式”
    内部级:最接近于物理存储设备,涉及到实际数据存储的结构物理存储数据视图的描述称为“内模式”

    数据库的三级模式结构是数据的三个抽象级别。它把数据的具体组织留给DBMS去做,用户只要抽象地处理数据,而不必关心数据在计算机中的表示和存储,这样就减轻了用户使用系统的负担。
    2.3.2 数据库管理系统(DBMS)数据库管理系统(DBMS)是指数据库系统中管理数据的软件系统。DBMS是数据库系统的核心组成部分。对数据库的一切操作,包括定义、查询、更新及各种控制,都是通过DBMS进行的。
    在不同的计算机系统中,由于缺乏统一的标准,即使同种数据模型的DBMS,它们在用户接口、系统功能方面也常常是不相同的。
    用户对数据库进行操作,是由DBMS把操作从应用程序带到外部级、概念级、再导向内部级,进而操作存储器中的数据。DBMS的主要目标,是使数据作为一种可管理的资源处理。
    DBMS的主要功能为:

    数据库定义功能:DBMS提供数据定义语言(DDL)定义数据库的三级结构,包括外模式、概念模式、内模式及基相互之间的映象,定义数据的完整性、安全控制等约束。因此,在DBMS中应包括DDL的编译程序
    数据库的操纵功能:DBMS提供数据操纵语言(DML)实现对数据库中数据的操作。基本的数据操作分成两类:检索、更新
    数据库的保护功能:数据库中的数据是信息社会的战略资源,对数据的保护是至关重要的大事
    数据库的恢复功能:在数据库被破坏或数据不正确时,系统有能力把数据库恢复到正确的状态
    数据库的并发控制:DBMS的并发控制子系统能防止错误发生,正确处理好多用户、多任务环境下的并发操作
    数据库的完整性控制:保证数据库中数据及语义的正确性和有效性,防止任何对数据造成错误的操作
    数据库的安全性控制:防止未经授权的用户蓄谋或无意地存取数据库中的数据,以免数据的泄露、更改或破坏
    数据库的存储管理:把各种DML语句转换成低层的文件系统命令,起到数据的存储、检索和更新的作用
    数据库的维护功能:数据装载程序、备份程序、文件重组织程序、性能监控程序
    数据字典:数据库系统中存放三级结构定义的数据库称为数据字典(DD)。对数据库的操作都要通过访问DD才能实现,通常DD中还存放数据库运行时的统计信息

    2.3.3 Mysql数据库MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。

    MySQL是一种数据库管理系统:数据库是数据的结构化集合。它可以是任何东西,从简单的购物清单到画展,或企业网络中的海量信息。要想将数据添加到数据库,或访问、处理计算机数据库中保存的数据,需要使用数据库管理系统,如MySQL服务器。计算机是处理大量数据的理想工具,因此,数据库管理系统在计算方面扮演着关键的中心角色,或是作为独立的实用工具,或是作为其他应用程序的组成部分
    MySQL是一种关联数据库管理系统:关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内。这样就增加了速度并提高了灵活性。MySQL的SQL指得是“结构化查询语言”。SQL是用于访问数据库的最常用标准化语言,它是由ANSI/ISO SQL标准定义的。SQL标准自1986年以来不断演化发展,有数种版本。在本手册中,“SQL-92”指得是1992年发布的标准,“SQL:1999” 指得是1999年发布的标准,“SQL:2003” 指得是标准的当前版本。我们采用术语“SQL标准”标示SQL标准的当前版本

    MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的优点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适用于Web站点或者其他应用软件的数据库后端的开发工作。此外,用户可利用许多语言编写访问MySQL数据库的程序。作为开放源代码运动的产物之一,MySQL关系数据库管理系统越来越受到人们的青睐,应用范围也越来越广。速度和易用性使MySQL特别适用于Web站点或应用软件的数据库后端的开发工作。
    该数据库是数据和数据库对象的集合,包括表数据库对象是指(表) ,视图(View ),存储过程(存储过程)和触发(触发)等。
    数据库通过SQL(Structured Query Language)来对数据进行操作和管理,这里包括一些基本的操作如select、delete、insert、update语句。ADO ( ActiveX数据对象)是微软的数据库应用程序开发和数据库访问技术。数据库访问接口,来自不同数据源的数据。 ADO封装了很多的程序中使用的OLE DB访问接口的COM接口,它是技术的高级别访问。在数据库管理系统和接口如图2-1所示的原则。 MySQL是一个小型关系型数据库管理系统,它的快速,多线程,多用户。可以与网页文件一起方便地放在网站的目录中的MySQL数据库文件,正是由于此类特点,网站开发的数据库支持技术通常采用MySQL数据库。使用图形化的管理工具的数据库管理。
    JSP MyAdmin是一个用JSP编写的、基于Web的、跨平台的MySQL管理程序,支持简体中文,使用Web浏览器作为管理界面。通过JSPMyAdmin可以进行绝大部分的MySQL操作,包括对数据库级操作,表级操作,以及数据管理等。

    2.3.4 MySQL特点特性
    可以处理拥有上千万条记录的大型数据
    支持常见的SQL语句规范
    可移植行高,安装简单小巧
    良好的运行效率,有丰富信息的网络支持
    调试、管理,优化简单(相对其他大型数据库)
    支持多种操作系统,这意味着在一个操作系统中实现的应用可以很方便地移植到其他的操作系统下
    MySQL的核心采用完全的多线程编程
    算法优化查询SQL,切实提高搜索速度

    2.3.5 MySQL数据库应用环境相对于其他主要数据库如Oracle,DB2,SQL Server,MySQL有自己的缺点,如,如有限MySQL集群,是一个相对贫穷的效率,但它并没有降低它的声誉。一般的个人消费者和中小型企业,非常的适用MySQL数据库,不仅因为其实一个开源的软件而且体积小、速度快、总体拥有成本低,这也是使用者考虑的范畴之一。
    目前,互联网的结构来最流行的网站上的LAMP(Linux操作系统,Apache+ MySQL的+ PHP)使用的操作系统,如Linux操作系统,Apache Web服务器,服务器端脚本解释器的MySQL数据库, PHP等四个免费软件或开源软件,因为,可持续和可以创建一个免费的网站系统(劳动力成本),所以你的花费不大。
    2.4 JAVA概述Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一。面向对象主要有四大特性:封装、抽象、继承和多态。

    封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性
    抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言是由抽象类来体现的。比如鸟就是一个抽象实体,因为抽象实体并不是一个真正的对象,它的属性还不能完全描述一个对象,所以在语言中体现为抽象类不能实例化
    继承:继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体
    多态:多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为,多态可为程序提供更好的可扩展性,同样也可以代码重用

    2.5 J2EE技术J2EE 技术,即Java 2平台企业版(Java 2 Platform Enterprise Edition),是一种B/S模式的体系结构,是利用 Java技术简化企业应用系统开发、管理和部署等复杂问题的一套完整的体系结构。该技术由SUN公司推出,基于Java 2平台,它继承了Java语言方便、灵活、跨平台等优势,还提供了对EJB(Enterprise Java Bean)、Java Servlets、JSP(Java Server Pagers)、XML 、API等技术的支持,从而即降低了开发多层应用系统的难度和复杂性,又提供了对现有应用系统的强大支持。
    J2EE技术一般分为四个层级:客户层、WEB表示层、业务逻辑层、数据层(EIS)。如下图2-2所示。


    客户层:可以包括瘦客户端、胖客户端,用户可以与该层进行交互作用,是系统的用户界面,可以呈现出适当的视图,收集查询,显示最终结果,是用户在本地所使用的最后的模型成品
    Web表示层:接收客户层组件的要求,处理请求,然后将请求路由到业务层的适当组件;接受业务层传來的结果,计算一个适当的视图,然后将视图路由到对应客户端
    业务逻辑层:这一层由若干运行在EJB容器下的EJB组件和应用服务器组成。EJB封装了业务逻辑,应用服务器提供了JDBC技术,来访问数据库
    数据层(EIS): 将前端业务逻辑层的组件与后端数据库层连接起来,收集好的信息放在该层,供用户访问

    Web表示层和业务逻辑层是给 J2EE 发布工作任务的层次,主要是通过服务器完成工作。这两层是 J2EE 的核心层次。
    2.6 B/S结构B/S框架是目前被广泛采用的一种先进的框架结构,它是一种基于互联网的程序架构。当前的使用已经非常广泛,突破了传统的C/S结构的模式,给程序开发的模式带来新的技术革命。它是随着互联网技术的不断发展而发展起来的。随着互联网技术的不断发展,各种信息网站已经不能单独在一台电脑上使用和运行了,所以基于互联网的模式就逐步的发展起来了,并且得到了大规模的应用。
    B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。只要有一台能上网的电脑就能使用,客户端零维护。系统的扩展非常容易。
    B/S架构不需要在任何客户端来进行进行程序的部署,使用这样的程序结构来使用开发好的系统是利用浏览器来使用的,就是把开发好的程序配置到一台远程服务器上,在任何可以访问这台服务器的客户端电脑上都可以对程序进行操作和使用,这样的方式给使用者带来了极大的便捷。这样的结构提高了程序的运行效率,打破了地域的限制,降低了程序的使用成本。
    对于我的城市公交查询系统,我们可以把系统配置在远程的服务器上,在得到访问权限之后,只要能够上网就可以使用和访问该系统并进行相关的操作,这样的一种先进模式我们之后只需要对服务器上的程序进行维护即可保证程序的正常使用,大大的提高了工作效率,降低了维护的成本。
    C/S与B/S 区别:

    硬件环境不同:B/S 建立在广域网之上的,不必是专门的网络硬件环境,例如电话上网,租用设备,信息自己管理。有比C/S更强的适应范围,一般只要有操作系统和浏览器就行
    对安全要求不同:C/S 一般面向相对固定的用户群,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S 结构适宜。可以通过B/S发布部分可公开信息。 B/S 建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户
    对程序架构不同:C/S 程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上。比C/S有更高的要求 B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000,Exchange2000等,全面支持网络的构件搭建的系统.SUN和IBM推的JavaBean构件技术等,使 B/S更加成熟
    软件重用不同:C/S 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好。B/S 面对的多重结构,要求构件相对独立的功能,能够相对较好的重用,就如买来的餐桌可以再利用,而不是做在墙上的石头桌子
    系统维护不同:C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级。升级难,可能要再做一个全新的系统。B/S 构件组成,方面构件个别的更换,实现系统的无缝升级。系统维护开销减到最小,用户从网上自己下载安装就可以实现升级
    处理问题不同:C/S 程序可以处理用户面固定,并且在相同区域,安全要求高需求,与操作系统相关,应该都是相同的系统。B/S 建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的. 与操作系统平台关系最小
    用户接口不同:C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高。B/S 建立在浏览器上,有更加丰富和生动的表现方式与用户交流。并且大部分难度减低,减低开发成本
    信息流不同:C/S 程序一般是典型的中央集权的机械式处理,交互性相对低

    B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化,更像交易中心。
    2.7 Tomcat服务器Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP[15]程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 服务器部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 服务器时,它实际上作为一个与Apache 独立的进程单独运行的。
    当配置正确时,Apache 为HTML页面服务,而Tomcat 服务器实际上运行JSP 页面和Servlet容器。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat服务器的默认模式。不过,Tomcat服务器处理静态HTML的能力不如Apache服务器。目前Tomcat服务器最新版本为8.0.0。
    Tomcat 服务器运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。因此利用Tomcat服务器作为集群服务器管理系统的Web应用服务器。
    2.8 Web技术网络对人类生活的影响是革命性的。它改变了人们传统的生活方式,有了网络人们可以从众多的信息中搜索,然后找到自己想要的部分;无论何时何地人们都可以通过网络与朋友取得联系,通过网络可以坐在家里就能够认识来自世界各地的陌生人,还可以登陆网上银行或在网上购物,足不出户就可以货比三家。
    网络的快捷是大家有目共睹的,只要几秒种的时间就可以把一封电子邮件发送到大洋彼岸。可以让处在地球上不同角落的人在同一时间收到同一条讯息,这种传递信息的方式可以让消息的传送者与接收者之间能够及时进行互动,快捷的信息交流的方式服务了全人类。
    网络是非常自由的,在网络上人人都是平等的,无论是什么身份什么地位的人都有权力发表自己的观点和看法,做自己想做的事情,不必有所顾忌,不用在乎对方的职位、年龄。
    创新性是网络的另一特性。每一项技术的发展都离不开创新,网络技术的发展也是如此。不断创新是网络之所以始终保持旺盛的生命力的根本,这种创新性也让我们不断地接收新的观念,学习新的技术,从而引导我们更好地去发展我们社会。
    Web技术提供了下面的优点:

    一个提供了很好的用户体验,让用户能很容易地完成任务,并利用了设备本地的一些性能
    一个web应用提供了丰富的视觉体验,又不会分散人的注意力;它注重美学,使用和本地应用一样的设计模式,又不失易用性
    一个web应用非常注重用户的交互、参与和完成任务,而不是让他们仅仅浏览网页。应用程序是自包含的(self-contained),也即用户不用导航到其他站点或者应用来完成任务

    3 系统需求分析3.1 需求分析软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。通过对应问题及其环境的理解与分析,为问题涉及的信息、功能及系统行为建立模型,将用户需求精确化、完全化,最终形成需求规格说明,这一系列的活动即构成软件开发生命周期的需求分析阶段。
    需求分析是介于系统分析和软件设计阶段之间的桥梁。一方面,需求分析以系统规格说明和项目规划作为分析活动的基本出发点,并从软件角度对它们进行检查与调整;另一方面,需求规格说明又是软件设计、实现、测试直至维护的主要基础。良好的分析活动有助于避免或尽早剔除早期错误,从而提高软件生产率,降低开发成本,改进软件质量。
    3.1.1 设计的原则
    可用性原则:开发此系统本着以方便乘客查询准确的公交信息和方便用户对公交系统合理安排调度为原则
    可靠性原则:必须为管理员和用户提供安全的服务,尤其是要保证从 Internet 上可以访问到的后台用户管理,公交信息管理等功能的安全性
    友好性原则:使城市公交信息查询系统的操作上要求简单方便,便于用户和管理员掌握
    可维护性原则:能够对用户提出的相关的需求对该软件进行相关的修改和维护

    3.1.2 系统设计目标
    分析国内外公共交通建设及公交查询的研究现状和特点,简述学者在公交网络路径算法研究的发展历程
    分析系统的需求。研究乘客出行的心理和行为,包括乘客获取公交信息的 途径、关注的信息、出行的考虑因素等,从用户角度分析得到系统需要完成的目标 和功能
    设计系统的总体框架。介绍系统的开发环境和流程,从总体上设计系统的 功能,根据系统功能划分子模块,并详述每部分需要完成的功能,设计数据库
    查找了解现有公交查询系统的网络路径最优算法。分析城市的公交线路特点,通过对地理公交网络的抽象,建立了公交网络的路径模型,并在此模型基础上,探讨了公交网络的最优路径算法
    详述系统的设计与实现过程。对系统各模块的具体实现和结果给出了清晰的说明,以拟定的路线为实验数据,给出了查询的结果分析
    总结了查询系统的特点以及一些不足之处,并对系统的改进作了展望

    3.2 系统可行性分析可行性分析包括现有的条件和解决的问题,研究方法的分析,采用的技术路线,实验方案的可行性。现有的条件是:对城市公交查询系统的研究和体会,本人计算机完备的软硬件,对文献资料的准备。要解决的问题是实现页面的设计,数据库的建立,数据库连接和创造,每一个表的文件上传功能。
    3.2.1 经济可行性分析由于本系统属于小规模管理使用的系统,整个系统比较小,因此开发成本不是特别大。本人独立完成了整个开发过程,实现全部的开发任务只需要一台PC机和上述的各种软件。由于PC机是我原有的,而且无需专门升级硬件;而在网上又可以免费下载各种软件,因此,整个开发成本较小,这也为我们提供了非常大的方便,可以进一步完善网站。在使用成本上,连接国际互联网上的计算机,用户只需要拥有一台能够了,在世界的任何一个角落使用网站所有功能和服务只需要通过注册就行了。并且没有很高的要求计算机的硬件,软件方面也没有别的要求,访问与使用具有广泛性。因此,从经济可行性分析来看,这个系统体现了经济实惠,但是功能强大的特点。
    3.2.2 技术可行性分析本课题使用的是Java技术,开发平台选用MyEclipse,MyEclipse有这完整配备的功能,便于初学者使用还有代码提示,让我使用更加得心应手。在决定好编程框架后,再说用Java语言编码的优点:效率高、可重用性强、代码量少等。同时,使用的数据库是MySQL,开源的MySQL增添了可视化和稳定化的优点,而且安全方面也做得很好,更别说它的强大的保存数据功能以及查询数据功能。
    3.3 用户需求要设计一个良好的公交查询系统,就必须首先明确该应用环境对系统的要求。公交查询系统的应用背景为:方便市民搭乘公交车出行。所以乘客可以通过对车站站点查询、公交线路查询、站-站查询三种查询形式。同时设有管理员管理界面,负责添加、修改、删除指定的公交线路信息,为了更好的适应公交查询系统的实时性,使本系统更加完善,能更好的为用户所利用,我觉得还设计了在线提问和网站发布公告功能,在线提问能很好,很快的知道市民对公交查询系统的意见和一些对线路上不明确的提问,而网站发布功能则能更好的帮助政府和公交公司发布新闻和紧急情况,方便市民的知晓。因此,该系统需满足以下几方面需求:

    查询功能:系统需要提供几种不同方式的查询手段,包括根据公交线路、日常站点、和任意两个站点查询乘车路线。其次,采用算法查找任意两个站点之间的乘车路线。具体功能如下所述:

    根据公交站点进行相应的信息查询根据公交线路进行相应的信息查询通过选择任意两个站点,完成两站点之间最短乘车路线查询
    用户管理功能:主要是删除用户信息和修改用户基本信息

    后台车次管理功能主要包含添加车次和站点功能、更新车次和站点功能、删除车次和站点功能,这样做到系统实时更新,为用户查询提供更为准确的信息。具体如下:

    完成车次和站点添加功能
    完成车次和站点更新功能
    完成车次和站点删除功能
    用户登录验证功能
    用户注册信息功能
    用户注销功能
    删除用户信息功能
    在线提问功能:在线提问主要包括用户对公交线路疑惑的问题发布,旨在让市民和政府和共同为提出疑问的市民进行解决和讨论
    网站公告发布功能:进行一些实时新闻的发布,包括线路的绕行,公交车价格的调整,以及一些实时的路况信息,均可通过此来查询,旨在为用户提供一个实时的,便捷的公交插叙系统

    3.4 系统功能需求概述需求分析就是分析用户的需要与要求。如果需要评估的结果准确地反映用户的实际需求,这将直接影响到方案设计的整个阶段,而且对系统的使用产生影响。着眼于需求评估是完成调查,收集和研究,并可能受到影响的数据管理和安全信息的需求的过程。一般使用者都相对缺少相关的计算机方面的知识,并且可以确定计算机是否可以为自己做什么,不能做什么,所以无法非常准确的去表达自己的需求,但是他们是最终的用户,他们的需求才是最终的需求,但是技术人员缺少用户的专业方面的知识,不是很容易理解到用户的真正需求,有时候可能还会误解到用户的需求;新的硬件和软件技术的出现也会让系统的业务需求得打变化。所以技术人员必须要使用一些得到的方法来保证可以与用户不断的交流这样才可以确定用户最终的需求。通过与用户不断深入地进行交流,了解到目前系统存在的主要问题。
    需要研究是从用户分析和细化的信息,在功能和性能上有描述。它是软件开发过程中的第一阶段的一部分,主要任务是要了解你需要什么,什么应做的工作,以确定系统的,因此在目标系统提出完整,准确,清晰,具体的要求,并表示以书面形式唤醒。
    软件的用户界面是与该对象最直接的接触,包括是否允许用户简单,方便使用,该请求的响应时间,对整体的用户感受有很大落差。
    要设计一个良好的公交查询系统,就必须首先明确该应用环境对系统的要求。公交查询系统的应用背景为:方便市民搭乘公交车出行;手动(目前)、自动(将来)、及时更新查询数据。因此,该系统需满足以下几方面需求:

    查询功能:系统需要提供几种不同方式的查询手段,以实现灵活方便地管理整个系统
    数据的更新修改

    更新:系统允许管理员级别的用户对数据进行更新、修改并且存盘操作编辑:系统允许管理员级别的用户对数据进行编辑、删除的操作,保证现库的真实性与实时性

    系统采用B/S模式。整个系统最关键的就是数据库系统,一个强大的数据库可以支持完善一个优秀的软件设计,通过软件系统与数据库系统的连接来实现通过软件界面观察和处理操作数据。
    3.5 运行环境本系统是一个WEb版的应用程序,需要在服务器上部署中间件Tomcat、MySQL数据库,其他的客户端通过网络进行访问该服务器即可。

    开发硬件平台

    CPU:酷睿双核 3.2GHZ内存:4G以上硬盘:500GB
    服务器端硬件平台

    服务器参考配置:Intel Xeon Quad Core E5530 80W 2.40GHz/5.8GT/8MB Cache, 2x2GB DDR3-1066MHz, 2.5in HS 146GB SAS,HS 675W PSU, ServeRAID MR10i(RAID 5), 2*Giga Ethernet,Light Path, CD-RW/DVD Combo, 1U,3 Years Onsite Next Business Day. 146GB 10K 6Gbps SAS 2.5” SFF Slim-HS HDD x3550M2/x3650M2/HS22
    开发软件平台

    操作系统:Window 8 或Win 7均可数据库:Mysql

    4 系统概要设计4.1 概要设计的概论软件概要设计的核心内容就是依据需求规格或规格定义,合理、有效地实现产品规格中定义的各项需求。他注重框架设计、总体结构设计、数据库设计、接口设计、网络环境设计等。概要设计是将产品分割成一些可以独立设计和实现的部分,保证系统的各个部分可以和谐的工作。概要设计的原则包括:模块化和分层细化、模块独立和信息隐蔽。
    4.2 架构设计系统采用B/S模式架构。B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix 、SQL Server或 MySQL等数据库。浏览器与同数据库进行数据交互,可以通过Web Server实现 。
    我们的系统使用的应用程序开发模型的B / S结构的三个阶段。目前,互联网应用架构,事务处理分为三个层次,即Web浏览器的互联网服务器数据库服务器。在这种架构中,通过Web浏览器业务表现是容易执行,用户通过Web浏览器提交表单时,将信息提供给消费需求的Internet服务器,Internet服务器,所需的分析查询,数据库服务器,数据库服务器执行,数据库服务器的查询结果返回给使用标准的HTML语言返回给Web浏览器的Internet服务器,Internet服务器。
    4.3 系统功能结构图及分析4.3.1 系统功能结构图系统功能结构图如图4-1所示:

    4.3.2 系统基本功能系统功能的划分方式可以分成很多种类,但是我按照界面流程将它分为了两大模块,第一个模块为前台查询模块。前台查询包括:站点查询,公交线路查询,站-站的查询,在线提问,网站公告。第二个模块为后台管理模块,后台管理模块包括:用户管理、线路维护、公告管理、提问管理。下面本节主要对各个基本的功能进行一个简要的介绍。
    站点查询
    站点查询是本系统的主要功能之一,为用户倒车提供前提条件,用户可以根据自己所到的站点,查询本站所经过的公交线路,从而完成换乘,前往自己的目的地,进入系统首页,在站点查询的对话框内输入自己要查询的地点,接着会转入到另一页面,这个页面包含了经过这一站点的所有公交线路,可点击查看,了解自己需换成的公交车的车号,完成换乘。
    公交线路查询
    公交线路查询是不系统不可缺少的功能之一,用户可根据自己了解到的公交线路名称,查询该线路途经的站点,事先了解好自己所要经过的站点,提前做好下车准备,防止自己下错站,进入功能页面,在公交线路的对话框里输入所要乘坐的公交线路名称,之后会出现匹配的公交线路,点击查看,了解自己的所经的站点信息。
    站—站的查询
    此功能是整个系统的核心,也是最便捷的公交查询方法,只要用户输入自己的位置,以及所要到的位置,就会出现公交线路名称,途径站,以及所要换乘的下一班车,无需自己查看,系统自己就会给成乘车意见。进入页面输入自己的起始站,然后在第二个对话框输入自己要到达的站点,系统将显示出换乘的路线,这个功能十分的便利,深受广大市民的喜欢。
    在线提问
    在线提问功能是本系统的辅助功能。用户可根据自己对公交线路的不明确,向广大的市民发出提问,也可以抱怨本系统的不完善的地方供系统的设计者进行修改,完善系统的功能。
    网站公告
    网站公告功能也是本系统的辅助功能,用户可以点击此模块,查看网站管理员发布的公交信息,包括一些公交价格的调整,以及道路的施工导致的公交线路的绕行都可以在上面发表。
    登录功能
    登录功能是一个系统的重要组成部分,也是一个系统重要的门户功能,登录功能主要实现了使用者对系统的登录,在本文所设计的系统中,登录主要分成了两种登录身份:一般用户登录和管理员登录。两种身份登陆,能细分系统的功能模块,实现更加方便的操作和管理。
    用户管理
    用户管理是一个系统的重要功能之一,对用户的管理可以实现对系统使用者的了解和查看,能让使用者更加方便的使用本系统,用户的种类分为多种,本文主要体现在一般用户和管理者两种用户上面,可以对用户的信息进行添加修改,也可以删除和禁用用户。
    线路维护
    线路维护是对此系统功能的最大的保障,一个系统的基本功能是否可以实现全靠此功能维护,线路维护功能可对现有公交线路进行修改和删除操作,也可添加新的公交线路,这部分属于管理员用户的功能。
    公告管理
    公告管理是对前面所说的公告发布的一种监管,管理员用户可对已经发布的公告就行修改和删除,也可对新的公告进行添加,旨在为用户提供一个实时的公交线路查询的体验,方便乘客出行。
    提问管理
    提问管理是系统管理员对在线提问内市民发布的问题进行答复的功能,这个功能是系统管理员与市民进行交流的一个模块,管理员不仅能回答市民的问题,也可以发布一些问题征求市民的意见。
    4.4 系统用例图4.4.1 UML用例图简介用例图用来确定需求的范围,这些需求是设计开发的依据。用例图将系统看作黑盒,从外部执行者的角度来理解系统。
    用例图展示了用例之间以及同用例参与者之间是怎样相互联系的。用例图用于对系统、子系统或类的行为进行可视化,使用户能够理解如何使用这些元素,并使开发者能够实现这些元素。
    下面简要介绍一下用例图中的组成元素:

    角色(Actor)是与系统中的用例交互的一些实体,在实际情况中,角色可以是人,也可以是其他系统或者硬件设备。在画用例图的过程中,角色往往是第一个被确定的,因为系统或者用例在开始时是模糊的,但是参与系统的角色是最容易明晰的。有了角色之后,根据角色与系统的交互,以及角色要求的功能,可以进一步确定系统和用例
    用例(Use case)指的是系统的功能,它是系统某个功能的所有执行动作的集合。在UML图示中它是一个椭圆,但是具体分析用例的时候需要给出这个用例的所有执行动作的步骤
    连接(Assocation)是角色与用例的连接,表达此角色可以初始化此用例
    注释(Note)可以添加到任何地方,对用例图的不同部分加以说明
    泛化(Generalization)在面向对象的技术中无处不在,它的另一个名字也许更为著名,就是“继承”

    4.4.2 系统用例图系统总用例图如图4-2所示:

    此用例图给出了系统所有用户的操作用例的框架,包括乘客用户和后台管理员用户,乘客用户的操作登陆浏览器,进入查询页面,选择查询方式,在线提问,以及查看发布的公告等功能,而后台管理员则可进行用户管理,线路管理及公告发布等功能,根据此用例图一目了然一般用户和管理员用户的职责。
    后台管理系统用例图如图4-3所示:

    后台管理用户包括的工作有:公交线路管理、公告发布管理、用户管理。公交线路管理包括对所用公交线路的进行的增加还有删除操作的功能。公告发布管理包括对公告的增加和删除操作,用户管理就是对所有使用该系统的管理员用户进行的管理,包括增加用户和删除用户。
    4.5 技术架构所使用的架构是系统建设的关键,传统c/s架构,访问和操作已经不能满足大量用户需求,目前网络系统应用的主流是b/s,它基于浏览器的架构,可以交给服务器端来处理大量的数据处理工作,只用通过普通IE浏览器的客户端,还可以访问系统,操作起来方便快捷,而且利于更新和维护系统,在该方面具有优势的是java语言。
    系统三层架构如图4-4所示:

    4.6 数据库结构设计数据库设计( Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求。
    4.6.1 数据库设计的原则数据库的结构分析在系统开发前的设计中占有很重要的位置,一个好的系统离不开一个层次清晰、功能完整的后台数据库结构。
    在设计数据库时,应尽量分离各个实体和表,一个实体对应一个表;同时,应明确各实体间的关联,明确各实体间的属性,以便确定它的字段。总之,在设计数据库时,应注意各表间的独立性和关联性,这是一个好的数据库结构首先要具备的条件。下面给出了数据库设计中的几点要求:

    规范命名:所有的库名、表名、域名必须遵循统一的命名规则,并进行必要说明,以方便设计、维护、查询
    控制字段的引用:在设计时,可以选择适当的数据库设计管理工具,以方便开发人员的分布式设计和数据小组的集中审核管理。采用统一的命名规则,如果设计的字段已经存在,可直接引用;否则,应重新设计
    库表重复控制:在设计过程中,如果发现大部分字段已经存在,开发人员应怀疑所设计的库表是否已经存在。通过对字段所在的库表及相应设计人员的查询,可确认库表是否确实重复
    并发控制:设计中应进行并发控制,即对于同一个库表,在同一时间只有一个人有控制权,其他人只能进行查询

    4.6.2 数据库结构分析根据系统功能的要求,本系统管理和维护的数据元素(Entity 实体)有:系统用户、普通乘客用户、公交线路、公告发布,在线提问,提问评论。

    系统用户实体包含这样一些基本属性:系统用户的ID、登录账户、密码、姓名、联系电话、系统用户的状态。其中,系统用户的ID是用户的唯一标志。系统用户能够实现系统的登录,完成对后台公交线路的管理,包括对线路的添加和删除操作,还有对所有用户的管理,对公告发布的管理
    普通乘客用户可以直接点击主页上的公交信息查询按钮进入查询功能:包括两个站点之间的查询、根据公交线路进行查询、根据站点进行查询。还可以进行公告的查看和在线提问和评论
    公交线路的基本属性有:公交线路id,公交线路名称,公交线路所经站点,公交线路开始时间,以及公交线路终止时间
    公告发布的基本属性:公告id,公告的正文以及公告发布的标题
    在线提问的基本属性:问题id,问题的描述,问题的状态,问题发布的时间,问题的标题,问题发布者id

    4.6.3 数据库概念模型现今应用的最广泛的数据库是关系型数据库。因为它是一个面向对象的系统设计,当然,数据库的设计,必须是面向对象的。现在应该怎么考虑对类进行持久性操作,即对象类是怎样映射到关系数据库的二维表中的。现今,像PowerDesigner、Rose 等都可以采用数据库建模工具来实现。
    用户的信息实体图如图4-6:

    公交线路实体图如图4-7:

    公交公告发布实体图如图4-8:

    公交在线提问实体图如图4-9:

    4.6.4 部分数据库数据表字段设计在物理结构设计阶段,首先应该分两步走:

    一是,在关系数据库中,确定数据库的物理结构,主要是指存取方法和存储结构。时间和空间效率是对物理结构的评价
    二是,要选取存取方法,并且是正确的关系模式,存取索引方法、聚簇存取、HASH存取方法等都是常用的方法

    依据以上规范数据库的部分表设计见下页:
    用户表如表4-1所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    userid
    char
    11
    用户id


    2
    password
    varchar
    20
    密码


    3
    phone
    varchar
    15
    用户联系电话


    4
    ralname
    varchar
    30
    用户姓名


    5
    state
    varchar
    2
    用户状态


    6
    username
    verchar
    20
    用户账号


    7
    usertype
    verchar
    20
    用户的类型



    公交线路信息表如表4-2所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    bid
    char
    11
    公交线路id


    2
    bname
    varchar
    30
    公交线路名称


    3
    buspath
    Longtext

    公交线路站点


    4
    endDate
    varchar
    30
    公交线路起始时间


    5
    startDate
    varchar
    30
    公交线路终止时间



    公交系统公告发布信息表如表4-3所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    pid
    char
    11
    公告发布id


    2
    content
    varchar
    255
    公告发布正文


    3
    title
    varchar
    30
    公告发布标题



    公交系统在线提问信息表如表4-4所示:



    编号
    字段名称
    数据类型
    字段大小
    说明




    1
    talkid
    char
    11
    在线提问id


    2
    talkcontent
    varchar
    255
    在线提问内容描述


    3
    talktime
    varchar
    30
    在线提问的时间


    4
    talktitle
    varchar
    30
    在线提问的标题


    5
    talkuserid
    char
    11
    在线提问的用户id



    5 系统详细设计详细设计是将解决问题的办法进行具体化。详细设计主要是针对程序开发部分来说的,但这个阶段是不真的编写程序的,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的代码。
    详细设计是将概要设计的框架内容具体化,明细化,将概要设计转化为可以操作的软件模型。在实际项目进行过程中,这个过程可以省略,主要是视项目的具体情况和项目要求而定,可以有详细设计,也可以直接按照概要设计进行编码。这个过程主要是保证编码的顺利进行,可以预先扫清编码过程中的障碍,提高代码的质量和编码的效率。详细设计的结果决定了最终的程序代码的质量。详细设计不仅仅要逻辑上正确的实现模块的功能,更重要的是设计出的出处理过程应该进可能简明易懂。
    5.1 系统数据库连接配置<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/newspubs"> </property> <property name="username" value="root"></property> <property name="password" value="123456"></property></bean>
    5.2 系统流程图的分析设计5.2.1 用户登录流程图用户登录流程图如图5-1所示:

    进入用户登录界面,首先输入用户名和密码,点击登录按钮,后台就行用户名和密码的匹配环节,如若俩个都正确及进入该用户界面,倘若有一个不对则登录失败,系统会提示用户重新输入。
    5.2.2 会员注册流程图会员注册的流程图如图5-2所示:

    用户注册进入注册页面,注册内容有,账号,密码,姓名以及手机号,当将这些信息输入之后,后台数据库会比对用户输入的信息是否有无注册,假如已经注册,系统则会提示用户这个信息已经注册过,需要重新输入,假如没有比对成功,则成功建立相应的账户,并在数据库中得以保存。
    5.3 系统登陆模块实现用户系统主要分为俩大类:一类是一般用户,一类是管理员用户。
    由于系统功能的特殊性,前台使用者不用登陆就可以实现公交查询的功能。
    第一部分主要是一般用户,一般用户可以随意注册,注册的信息主要包括:用户的账号,用户的密码,用户的信息,还有用户的电话这四大部分,注册的信息会同数据库中已存在的信息进行对比,查看是否重复,如果重复则重新输入。注册成功就可进行一般用户的登录,比对用户账号和密码是否正确,若正确登录成功,反之重新提醒用户进行登录。
    一般用户登录界面如图5-3所示:

    第二部分为管理员用户登录,因为管理员用户的登录界面不能存在注册按钮,所有管理员用户的信息必须从数据库中直接录入。
    实现的过程主要有几个步骤,进入首页后点击右上角的进入后台按钮,将会看到图5-4的登录界面,按照要求输入管理员用户的账号密码,首先对管理员输入的信息进行保存然后利用程序从数据库中进行检索看是不是有管理员输入的信息在数据库中是否存在如果存在就返回正确的结果,如果不正确就返回错误的结果。如果结果数据库中存在就显示登录成功,如果数据库不存在就显示失败请重新登录。
    管理员用户登录界面如图5-4所示:

    5.4 前台功能模块设计5.4.1 公交查询设计本系统的首页设计为查询界面,为的是方便高效和快捷,此系统查询分为三大功能:第一个功能为站-站的查询功能,第二个是公交线路的查询功能,第三个是公交站点的查询功能。接下来将介绍三大功能:

    站—站的查询功能:用户可将准备出发的起始站点和终止站点分别对应的输入到换乘查询的输入框内,系统会根据用户输入的站点信息,列出提供的换乘路线,系统将优先查找到的直达公交线路排在前面,方便用户的选择
    公交线路的查询功能:用户可以输入完整的公交线路号进行查询公交线路,系统会筛选出匹配的线路,用户可以点击查看,查看所查到的公交线路,里面有每个线路确切的途经站点
    公交站点的查询功能:用户在不了解公交线路的情况下,可以搜素要到达的公交站点,输入自己要到达的地点,公交查询系统会对比数据库为用户匹配出所有进过这一站点的公交线路,用户可根据此来选择乘坐的线路

    查询界面如图5-5所示:

    用户输入起始站与终点站查到的结果如图5-6所示:

    用户输入公交线路查询如图5-7所示:

    用户输入公交站点查询如图5-8所示:

    5.4.2 热门线路功能模块设计热门查询线路模块列举了所有在数据库中的公交线路,本人在网上随意挑选了一些公交线路录入其中,市民可以在热门线路中查看所有公交线路,挑选符合属于自己出行的公交线路
    下图是热门线路模块的界面,如图5-9所示:

    5.4.3 网站公告功能模块设计用户点击网站公告模块后会看到管理员发布的公交新闻,包括一些公交线路的改道,还有公交价格的调整,网站公告由后台管理员进行上传。
    下图是网站公告功能模块的实现界面图,如图5-10所示:

    下图是网站公告内容的详细信息,如图5-11所示:

    5.4.4 在线提问模块设计在线提问模块旨在帮助乘客解决他们在实际的乘车过程中遇到的困难,以及对城市公交查询系统的建议,这是一项非常人性化的设计,因为设计员并没有真正的参与使用,有些问题体会不到,用户可在此模块发表问题,提出自己的见解,也可在此回答其他市民的疑惑。
    下图是在线提问功能模块的界面,如图5-12所示:

    5.5 后台功能模块设计管理员的设置是为了系统能够安全的、系统的平稳运行,本系统为管理员设置了用户管理、公告管理、线路维护和会员提问四大功能模块。

    用户管理:用户管理是对已注册用户的基本信息进行更新维护;主要包括对用户的添加,用户的删除,用户的修改
    公告管理:公告管理是对公告进行发布和对已发布公告进行修改和删除操作,保证公告的实时性,及时添加新的公告,也要删除旧的,无用的公告
    线路维护:线路维护主要是对新线路进行添加和对不用线路的删除,以及对现有线路的修改
    会员提问:对市民提出的问题进行答复,帮助市民解决出行问题,更好的完善城市公交管理系统

    用户管理的实现界面,如图5-13所示:

    线路维护管理管理的实现界面如图5-14所示:

    公告管理的实现界面如图5-15所示:

    6 系统测试6.1 程序测试网站测试是软件设计的最后一道工序,也是非常重要的一步。用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。通常网站测试包括:功能测试,安全测试,可用性测试,性能测试、兼容性测试等方面。
    在系统设计的过程中,这是必然的,存在一些错误。对于错误的语言和语法,程序在运行时,会自动提示你错的地方,并请求立即修改,所以,这样类型的错误是比较容易发现和纠正的。但另一类错误是在程序执行时由于不正确的操作,或是导致的错误结果的对某些数据的计算公式的逻辑错误。这类错误隐蔽性很强,时而出现,因此,这是非常耗时费力的,对这一类动态发生的错误的排查。
    软件测试,描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
    为了使本软件运行更加稳定,我对它进行了全面的测试,其中测试分为二部分,一种是界面测试;另一种功能测试。
    首先我们来说界面测试,界面测试是为了使程序在不同的的操作平台上能够运行界面,并且能够保持原来的风格。经测试程序运行正常,运行界面上的字体图片等设置都能够保持得非常好。不出现字体变形等情况。
    其次进行功能测试。该系统测试采用的是单元测试,集成测试,完善性测试等多种方式进行测试。
    经过测试,所有功能都能得以实现,没有任何变形。至此,在功能的测试上也已经比较圆满的完成了。
    6.2 测试的重要性及目的6.2.1 测试的重要性系统测试是开发一个管理信息周期中非常重要而且漫长的的阶段。其重要性体现在他是保证系统质量与可靠性的重要关口,是对整个系统开发过程的最终审查。
    系统测试的主要任务是尽可能的检查出程序中的错误,提高系统的可靠性,主要的目的是位列检验系统“做得如何”。其中这一阶段又可以分为三个步骤:模块测试;组装测试;确认测试;通过测试整个管理系统来确定能不能够满足用户的需求。通过测试发现问题以后,我们要经过不断的调试找出错误具体原因和位置,然后对其进行修改。
    系统开发完成后就需要进行系统测试,测试在一个软件的开发过程中是非常重要的,其意义在于:

    发现软件错误
    有效定义和实现软件成分由低到高层的组装过程
    验证软件是否满足任务书和系统定义文档所规定的技术要求
    为软件质量模型的建立提供依据

    6.2.2 测试的目的Grenford J.Myers曾对软件测试的目的提出过以下观点:

    测试是为了更好的找出程序中存在的问题、错误
    好的测试方案是很有可能是到现在为止仍然未被发现的错误的测试方案
    成功的测试则是找出了至今仍然没有被发现的错误的测试
    测试并不单纯是为了找出错误。而是通过分析错误,来找出产生错误的原因,来避免发生错误,帮助程序员找出软件开发过程中的缺陷,以便及时进项改正
    测试是为了检验修改或优化过程是否引发新的问题、软件所能达到处理能力和是否达到预期的处理能力等

    6.3 测试的步骤就像开发过程,测试过程中要完成的一步一步的逻辑上的每一步都是在继续之前的一个步骤。由许多个子系统是大型软件系统,并且多个包括各子系统模块的。因此,一个软件系统的测试基本上由以下步骤组成:

    测试模块,编码和详细设计错误往往在本测试程序中找到
    在此测试步骤中遇到的测试系统的软件错误的设计,规范的要求的错误也可以找到
    系统需求规格说明书的错误也是在这个测试程序进行验收测试发现

    在我们设计软件的过程中,测试系统常用的测试方法主要有两种:功能测试和结构测试。
    功能测试也被叫做黑盒测试和数据驱动测试,是在已经知道系统应该具有的具体功能的情况下,通过黑盒测试来测试系统功能是不是能够正常运行。在测试时,将系统当做不能打开的盒子,在不管系统内部结构与特性的状况下进行测试,它只检查系统功能是不是根据系统说明书的规定正常运行的,同时检测系统是否能正确接收的输入信息和输出信息的正确对应,并保持系统的完整性的外部信息需求。
    白盒测试与黑盒测试相反,它了解系统内部工作的各项具体程序,能够通过测试来检查系统内部的运行是不是按照系统说明书的规定进行正常运作的,因此,白盒测试又被叫做结构测试和逻辑驱动测试。根据测试程序的结构在每个道路试验,当系统运行时不是能按预定要求正确运行,无论其功能如,白盒测试试验,道路试验是一个逻辑驱动器,这种测试主要用来软件测验。
    首先我们来说界面测试,界面测试是为了使程序在不同的的操作平台上能够运行界面,并且能够保持原来的风格。我把完整程序拷贝到不同版本的电脑平台环境下,程序运行正常,运行界面上的字体、图片等设置都能够保持得非常好。不出现字体变形等情况。
    其次进行功能测试和性能测试,功能测试主要包括五项内容:适用性、准确性、可操作性、依从性、安全性。
    系统性能测试主要是通过模拟系统运行环境,测试系统性能是否符合客户的需求。性能测试的重要技术指标是:系统的运行速度、系统响应的时间和支持并发节点数。
    最后进行系统的可用性测试,可用性测试用于检测系统的可理解性、可操作性和学习性等方面内容。
    6.4 测试的主要内容测试过程分为哪会保证测试,即质量几个阶段:代码审查,单元测试,集成测试,确认测试和系统测试。

    单元测试:集中在一个小软件单元设计审查 - 模块是一个测试单元,意识和定义模块的功能实际发现,这种情况不符合测试说明和编码错误
    集成测试:集成测试模块安装在根据进行集成测试的设计要求,其主要目的是为了发现问题相关的接口。例如有可能是一个问题,由于疏忽,与其他模块的模块,并造成有害影响;不能产生所需的功能键,组合功能;看起来可以接受的个别错误是不可接受的,当积累;可能有错误,如整个数据结构
    确认测试:该试验的目的是验证,该系统能够工作如期,根据需要,以显示未来的用户。集成测试后,已经把一个完整的软件系统,设计按照完成安装的所有模块,从根本上推动问题接口错误的,那么软件的有效性将能够得到进一步的确认,试验工作证实,它是功能和软件的性能,如用户所期望的
    系统测试:在软件开发完成后,并且系统将最终在包的其它部分,在测试系统上执行。包括恢复测试,安全性测试,强度测试和性能测试

    系统测试主要从以下几个方面:

    功能测试:测试满足发展的需要,旨在提供这里所描述的功能,用户需求是否得到满足。功能测试是测试最常用的系统和强制性测试和正式的规格通常是标准的软件测试
    强度测试和性能测试:该测试系统的最大实际程度的能力,即在某些情况下,负载的软件功能进行
    安全测试:验证内置到系统中的保护机制,它可以保护系统,所以从很不安。该系统主要是针对权限对系统进行测试,并为void仅仅是数据,错误的数据和测试数据的非法干扰的能力

    6.4.1 功能测试功能测试主要包括五项内容:适用性、准确性、可操作性、依从性、安全性。
    本系统功能测试如表6-1所示:



    测试内容
    测试结果




    适用性



    准确性



    可操作性



    依从性



    安全性




    本系统功能测试测试用例6-2所示:



    测试标识
    测试项目
    测试用例输入及说明
    预期结果
    测试记录




    用户管理模块功能点
    新增用户
    系统管理员单击”新增”按钮
    成功进入到新增用户界面
    测试通过


    用户管理模块功能点
    登录全部置空
    令所有文本框为空
    提示(请输入账号密码)
    测试通过


    用户管理模块功能点
    提交新增用户信息
    在新增用户界面输入有效数据并点击提交按钮
    显示注册成功
    测试通过


    用户管理模块功能点
    删除用户
    在界面上点击要删除的用户,并点击删除按钮
    删除成功,并退回到用户管理界面
    测试通过


    用户管理模块功能点
    编辑用户
    系统管理员单击”编辑”按钮
    成功进入到编辑用户界面
    测试通过


    公告管理模块功能点
    新增公告
    系统管理员单击”添加”按钮
    成功进入到新增公告界面
    测试通过


    公告管理模块功能点
    全部置空
    令所有文本框为空
    提示(标题不能为空)
    测试通过


    公告管理模块功能点
    提交新增公告信息
    在添加公告界面,点击保存
    添加成功后跳转到公告界面
    测试通过


    公告管理模块功能点
    删除公告
    系统管理员点击删除公告并点击删除键
    显示删除成功并跳转到公告界面
    测试通过


    线路维护模块功能点
    新增线路
    系统管理员单击”添加”按钮
    成功进入到添加线路界面
    测试通过


    线路维护模块功能点
    全部置空
    令所有文本框为空
    提示(线路名称不能为空)
    测试通过


    线路维护模块功能点
    提交新增线路信息
    在新增线路输入有效数据并点保存
    添加成功后跳转到线路维护界面
    测试通过


    线路维护模块功能点
    编辑线路
    系统管理员单击”编辑”按钮
    成功进入到编辑线路界面
    测试通过


    题目管理模块功能点
    删除线路
    点击删除的线路再点击删除按钮
    显示删除成功
    测试通过


    会员提问模块功能点
    查看问题
    点击查看按钮
    成功查看问题
    测试通过


    会员提问模块功能点
    回复问题
    点击查看问题并参与回复
    成功增加回复内容
    测试通过



    6.4.2 可用性测试可用性测试用于检测网站的可理解性、可操作性和学习性等方面内容。具体测试方面如表6-3所示。



    测试项
    测试人员的评价




    窗口移动、改变大小、关闭等操作是否正常



    操作模块是否友好



    模块和提示内容等文字描述是否正确



    模块布局是否合理、协调



    模块的状态是否正确(对选中项能否发生对应切换)



    键盘、鼠标操作是否支持



    所需的数据项是否正确显示



    操作流程是否合理



    是否提供帮助信息




    6.4.3 性能测试系统的性能测试主要是通过模拟网站运行环境,测试网站性能是否符合客户的需求。性能测试的重要技术指标是:网站的运行速度、网络响应的时间和支持并发节点数。

    测试网站的运行速度:通过在不同的计算机上进行试运行本网站,没有发现任何停顿、迟滞现象
    测试网络响应时间:网络响应时间主要包括:网络最小响应时间、平均响应时间和最大响应时间这三个参数。经过测试,在网络运营良好状态下,局域网内响应时间三参数为:1/2/5s,外网响应时间三参数为3/7/12s,符合客户的需求,属于在用户的心理可承受范围内
    支持并发节点数:经过模拟的环境测试,本网站在并发节点达到45个时,网络运营的速度会发生比较大的波动,延迟时间10秒左右,符合客户需求

    6.5 测试结论由于自己独立写的项目不多,考虑问题肯定会不周全,存在很多的难以预料的问题,写的功能有时候也难以满足用户需求,代码和接口也会出现很多问题,不规范的书写习惯,都会导致项目不无法达到用户的目标,无法让用户放心的使用,用户体验效果差。正是因为这样所有的项目在交付用户使用之前,必须经过专业技术人员的测试,一个好的项目需要不断的打磨,需要不断的反馈意见,不断地再加工,才能设计出符合用户要求,用户体验良好的项目。测试的技术人员,需要根据项目设计的人员制作的项目文档,对用户要求的各个功能进行测试并根据测试结果编写好测试的文档,在经过这一系列的工作后,可以有效的规避因设计人员在设计过程中的小纰漏,提升项目的质量,最终交付给用户一个完美的作品。
    本系统设计要求基本都可以达到,此系统具有完整的软件功能,良好的用户界面,能够正确的处理错误信息,而且能够准确的提出错误的种类。总体说来,软件通过测试。
    经过对上述的测试结果分析,本系统满足用户的通过计算机平台用户使用的要求和需求。所有基本功能齐全,操作简单,产品运行性能良好,是一个值得推广的公交查询系统。
    总结与展望本此毕业的内容所实现的是城市公交查询系统的设计与实现,主要介绍了java与jsp技术。本设计按照以下五个步骤对此项目进行设计:

    需求分析
    概要设计
    后台数据库的实现
    项目的详细设计
    系统的测试

    当下此系统的基本功能已得到实现,从3月份开始准备资料到5月份基本完成了项目的设计,要是想很好的完成这个项目,使它运用到生活中是远远不够的,还需要不断地用户反馈,不断修改,不断地充实,我也将会在今后的学习中,不断的完善它,改进它,使其更好。
    本系统具有以下优点:

    该系统可以运行在多个操作系统平台(Windows NT和Windows 2000 / Windows XP和Windows Vista)数据库管理系统采用MySQL和Java开发环境,可移植性好
    该系统界面简单,操作方便,容易进入的信息,人们使用的术语

    但也存在以下缺点:

    界面跳转复杂,接口不能被刷新,可以改进
    功能比较简单,没有进一步提高一些选修的程序等,不能更好的为用户提供更强大的功能服务
    数据库设计有冗余,需要进一步优化

    毕业设计的选题是在老师的指导下最终确立的,选题确定好后就开始学习这方面的资料进行学习,开始在这方面可以说是不熟悉的,虽然最初学习JSP技术,但学校学习的东西如果没有运用到实际的设计中终究是不行的,以前都是老师带领我们做,第一次做难免会怯场,但是最终通过自己的努力,老师的指导,同学的帮助,完成了本系统的设计。
    本次毕业设计已基本画上句号,在整个设计的道路上是劳动和汗水凝结的成果。为了解决一丢点的困难,我翻阅书籍,询问老师,与同学探讨,从不懂到熟知也是一个新的经验和新的收获的过程。学习是一个长期的过程,系统设计过程中,遇到了很多问题,后来通过自己的努力来解决大部分问题,但同时也学到了很多知识。通过这次毕业设计,我从最初的Java语言,和后来的Web开发学会了很多,然后在训练过程中,通过所学到的知识应用到实际发展实践中,最后到软件功能集成的整个设计过程的思想。
    该系统在实施过程中也常遇到一些困难,毕竟,JSP技术的掌握不熟练,有许多控件不能真正明白他们的意思,有一个对象调用的一些方法,并不十分了解,美化界面处理不好。所以开始的设计真的遇到了许多困难,但通过和老师同学的帮助以及在线学习,解决设计中的许多问题,但也使我有了一定的JSP技术的掌握,同时巩固了以前学过的知识。实现了质的上升,在一个纯粹的理论学习到实际上手再向完成毕业设计前进,理论联系实际情况,是学术认知的另一次跃进。
    参考文献[1] 汪光焘.畅通城市交通,实现城市的可持续发展.可持续发展,2002,(2):18-19
    [2] 马武定.城市化与城市可持续发展的基本问题.城市规划汇刊,2002,(2):7-9
    [3] 冯博.SQL实用教程.北京:人民邮电出版社,2005
    [4] 严蔚敏,吴伟明.数据结构(c语言版).北京清华大学出版社,1997
    [5] 张海藩.软件工程.北京:人民邮电出版社,2002
    [6] 黄斯伟.HTML完全使用详解.北京:人民邮电出版社,2005
    [7] Anthony J.Dos Reis. Compiler Construction Using Java,JavaCC,and Yacc. Wiley-IEEE Computer Society Pr; 1 , 2011
    [8] Joan Casteel. Oracle 12c:SQL. Course Technology; 3, 2015
    [9] Richard North Patterson. Eclipse. Pan Publishing, 2009
    [10] 李兴华,王月清.名师讲坛:Java Web开发实战经典基础篇(JSP、Servlet、Struts、Ajax) [平装][M].清华大学出版社,2010.
    [11] 李刚.轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发[M].电子工业出版社,2012.
    [12] 孙卫琴:《精通Hibernate:Java对象持久化技术详解》[M].电子工业出版社出版,2010.
    [13] Budi Kurniawan (作者),崔毅 (译者),俞哲皆 (译者),俞黎敏 (译者).Servlet和JSP学习指南[M].机械工业出版社,2013.
    [14] 陆舟.Struts2技术内幕:深入解析Struts2架构设计与实现原理 [M].机械工业出版社,2012.
    [15] 陈亚辉,缪勇.Struts2+Spring+Hibernate框架技术与项目实战[M].清华大学出版社,2012.
    [16] 施瓦茨 (Baron Schwartz),扎伊采夫 (Peter Zaitsev),特卡琴科 (Vadim Tkachenko),宁海元.高性能MySQL(第3版)[M].电子工业出版社,2013.
    [17] 薛华成.信息管理与信息系统专业教材系列:管理信息系统(第6版)[M].清华大学出版社,2012.
    [18] 王颖.基于JSP的学生学籍信息管理系统的设计与实现[J].电子科技大学,2012.
    [19] 朱丽萍.基于JSP的高校图书管理系统开发和实现[J].电子科技大学,2011.
    [20] 吕勇.基于JSP的实验室项目管理系统的设计与实现[J].武汉理工大学,2012.
    [21] 庞丽娜.Java 应用开发技术详解[M],科学出版社,2007:126-235
    [22] Cay S.Horstmann,Gary Cornell著,叶乃文,邝劲筠,杜永萍.JAVA核心技术卷I:基础知识,程序设计教程[M].人民邮电出版社,2008.5:87-234
    [23] 张超.基于JSP Struts2技术的房地产信息管理系统的设计与实现[D].吉林大学,2012.
    [24] (美)Powell.R. (美)Weeks.R.著. 袁鹏飞译. C#和.NET架构. 北京:人民邮电出版社,2002.4 17
    [25] 萨师煊,王珊.数据库系统概论(第三版).北京:高等教育出版社,2000.2
    5 评论 149 下载 2020-08-10 11:47:16 下载需要13点积分
显示 0 到 15 ,共 15 条
eject