• 1.98 MB
  • 2022-05-16 18:34:37 发布

仓库管理系统+java源代码++设计说明

  • 55页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
~~计算机与通信学院本科生毕业设计说明书仓库管理系统作者:曹亚磊学号:05240207专业:计算机科学与技术班级:05级软件工程(2)指导教师:曹来成答辩时间:2009年6月~~~ ~~仓库管理系统StorageManagementSystem曹亚磊(CaoYalei)05240207~~~ ~~前言随着科学技术的不断发展,我们的社会已经进入了一个信息化的社会,人们每天都要接收大量的信息和处理大量的数据,仅靠传统的纸和笔已不能适应这个时代的要求,人们必须采取新的手段,于是信息技术进入我们的生活,计算机不再是简单的计算工具,它已成为我们生活中处理大量信息的不可或缺的手段。在当今产业竞争越来越激烈的信息时代,企业经营除了降低成本,提高品质外,更需要以先进的管理理念来整合企业内部与外部资源。仓库管理系统正是在这个背景下产生的。本系统正是针对仓库部门的货物信息管理,通过对仓库基本信息﹑出入库信息等的系统界面设计,将会给管理者带来极大的方便,具有手工管理无法比拟的优点,例如检索速度快、查找方便、可靠性高、存储量大、使用时间长等。用计算机管理取代传统的手工操作,大大减少了管理人员的工作量,提高了工作效率,为获取详细的管理信息提供了保证,方便各类人员的查询和信息保证,增强了管理工作的时效和人员主动性。仓库管理主要摆阔两方面:一是仓库的基本信息,涉及人员信息、库房信息、供货商信息、客户信息;另一项是仓库业务管理,包括入库管理、在库管理、出库管理、报表管理。在本系统中侧重实现仓库的基本信息管理。~~~ ~~摘要仓库管理系统是为了实现企业产品管理的系统化、规范化和自动化,从而提高企业管理效率而设计的。它完全取代了原来一直用人工管理的工作方式,避免了由于管理人员的工作疏忽以及管理质量问题所造成的各种错误,为及时、准确、高效的完成仓库管理提供了强有力的工具和管理手段。仓库管理系统是一个中小型数据库管理系统,它界面美观、操作简单、安全性高,基本满足了仓库管理的要求。整个系统由基本信息、单据中心、查询统计、报表打印、维护设置、帮助等模块组成。本系统是在以MySql作为后台数据库,以J2EE为编程语言来开发的。仓库管理系统在运行阶段,效果好,数据准确性高,提高了工作效率,同时也实现了仓库管理计算机化。关键词:仓库;管理系统;数据库~~~ ~~AbstractTheadministrativesystemofthewarehouseisdesignedforrealizingthesystematization,standardizationandautomizationofenterprise"sproductsmanagementandimprovingefficiencyofenterprisesmanagement.Itcompletelyreplacestheworkingwayofartificialmanagementoriginally,preventsfromvariouskindsofmistakesbecauseofadministrativestaffneglectandthequalityproblemofmanagementandofferespowerfultoolandmanagementwaytocompletstorehousemanagementforprompt,accurate,high-efficient.Theadministrativesystemofthewarehouseisamediumandsmall-scaledatabasemanagementsystem,ithasnotonlybeautifulinterface,butalsothehighsecurityandthesimplyoperation,andmeetthedemandforstorehousemanagementbasically.Wholesystemismadeupbybasicinformation,documentinthecenter,inquirestatistics,reportformtype,setuptomaintainandmoduleofhelpingetc.TheWarehouseadministrativesystemisdesignedwithregardingMySqlasthebackstagedatabaseandregardingJ2EEasprogramminglanguage.Theadministrativesystemiseffectual,thehighdataaccuracyduringthecourseofoperating,improvesworkingefficiencyandrealizescomputerizationforstorehousemanagementatthesametime.Keyword:TheWarehouse;AdministrativeSystem;TheDatabase~~~ ~~目录摘要IABSTRACTII第1章绪论1第2章需求分析22.1仓库管理系统概述22.2系统流程图22.3数据流程图32.4仓库管理系统的角色定义5第3章总体设计63.1总体用例图63.2用例说明63.2.1用户从浏览器登录72.2.2供货商信息查询用例概述82.2.3供货商信息修改用例概述92.2.4供货商信息添加用例概述103.3功能模块图11第4章详细设计144.1ER图144.2数据库设计154.2.1数据库的逻辑设计164.3运行环境20第5章编码215.1登陆的实现215.1.1登陆action215.1.2登陆过滤器225.1.3登陆DAO235.2供货商的实现235.2.1供货商查询Action235.2.2供货商修改Action255.2.2供货商添加Action255.2.3供货商DAO26第6章测试306.1登陆测试方案306.2数据录入测试306.3查询测试306.4测试结论30第7章使用说明31~~~ ~~7.1系统功能简介317.2运行环境简介317.3系统运行与操作指南327.4操作演示327.5特色介绍35第8章总结36参考文献37致谢38翻译资料原文39翻译资料译文45~~~ ~~第1章绪论仓库管理系统是现代仓储企业进行货物管理和处理的业务操作系统。它可以实现本地一个或几个仓库的精细化管理,也可实现制造企业、物流企业、连锁业在全国范围内、异地多点仓库的管理;它可以对货物存储和出货等进行动态安排,可以对仓储作业流程的全过程进行电子化操作;可以与客服中心建立数据接口使客户通过互联网实现远程货物管理,可以与企业的ERP系统实现无缝连接。在现代企业中,仓库管理是一项繁琐复杂的工作,每天要处理大量的单据数据。为及时结清每笔业务,盘点库存和货物流动情况,保证企业生产用料以及货物安全,库管人员要花费大量人力物力和时间来作数据记录统计工作。众所周知,仓库管理是一种既麻烦又单调的工作,每天都是重复记录一些货物的存入与取出,而且货物的种类繁多,存取有很大的随机性,这样为工作人员带来了很大的不便,在操作过程中,由于人为的计算出错率很高,一旦出错改正也很困难,这样简单繁重的工作要很多人来做,为经营者增加了很多成本。所以开发一个可行的仓库管理系统是十分必要的。本系统以MySQL作为后台数据库,以java语言来开发的,不仅实现了仓库管理的自动化,同时也提高了工作效率。本系统由以下几个模块组成:基本信息管理、入库管理、在库管理、出库管理、报表管理。~~~ ~~第2章需求分析2.1仓库管理系统概述本系统是为物流管理而设计的高效管理系统,系统功能强大,同时操作又比较简单,而管理人员大多受到过系统的培训,并能够操作电脑,所以只要花很少的时间,就能够让他们熟悉本系统。系统开发的总体任务是实现各种信息的系统化、规范化和自动化。系统功能分析是在系统开发的总体任务的基础上完成。本仓库管理系统需要完成功能主要有:●仓库管理各种信息的输入,包括货物、供应商、客户、仓库信息的输入等。●仓库管理各种信息的查询、统计、修改和维护,包括货物、单据查询,货物出入、职员操作统计,各种信息的修改和维护等。●打印报表的生成。●在货物管理中加入最高储备和最低储备字段,对仓库中的产品实现监控和报警。●操作日志的管理。●仓库管核对货物清单程序入库单库存数据库出库单打印程序出库单库存查询程序库存分析程序查询库存信息库存备份程序库存备份报损计划表理系统的使用帮助。2.2系统流程图出库单~~~ ~~图2-2系统流程图2.3数据流程图数据流图是描述系统的逻辑模型的,图中没有任何具体的物理元素,只是描述信息在系统中流动和处理的情况,它比口头与文字的描述更直观地显示出来系统中数据的使用。数据流图简称DFD图,数据流图有四种成分:源点或终点、处理、数据存储表和数据流。图中没有任何具体的物理元素,只是描述信息在系统中的流动和处理情况,即使不是专业的计算机技术人员也容易理解,是极好的理解工具。它能精确的描述系统的逻辑模型,描述数据在MIS中有输入经过存储、加工处理最后输出的全过程,是设计者和用户交流的很好的工具。仔细分析调查有关仓库管理信息需求的基础上,得到如图4-1所示的本系统所处理的数据流程。~~~ ~~图2-3仓库管理系统数据流程图通过对企业仓库管理的内容和数据流程分析,设计数据项和数据结构如下:●货物信息,包括的数据项有编号、货物名称、货物类别、货物规格、计量单位、最高限量、最低限量、备注等。●仓库信息,包括的数据项有编号、仓库名称、仓库地点、保管员编号、备注等。●库存状况信息,包括的数据项有编号、货物编号、库存数量、仓库编号等。●入库单信息,包括的数据项有编号、货物编号、经办人编号、入库时间、入库单价、入库数量、供应商编号、仓库编号、定单状况、其它金额、备注等。●出库单信息,包括的数据项有编号、货物编号、经办人编号、出库时间、出库单价、出库数量、客户编号、仓库编号、定单状况、其它金额、备注等。●进行月盘点信息,包括的数据项有编号、仓库编号、盘点时间、经办人编号、盘点数据等。●系统日志信息,包括的数据项有用户名、操作时间、操作内容等。●用户管理信息,包括的数据项有用户名、用户密码、用户权限等。另外,还有借入单、借出单、报损单、调拨单信息等。它们与入库单、出库单信息基本类似,这里不再一一例举。~~~ ~~2.4仓库管理系统的角色定义本系统角色包括两种,仓管部管理人员和管理部主管,其中,管理部主管拥有整个系统的最高权限。 仓管部管理人员:负责仓库的出入库管理,可以根据流向单实现出/入库操作。具体权限有:●库存信息管理●库检信息维护●入库单信息维护●出库单信息维护●报表信息管理●进行密码修改、清除表信息等系统设置●客户、供应商、库房等基本信息的查询浏览等仓管部主管:●负责整个山口仓管部门的日常运作和管理工作,主要包括:部门信息维护人员信息管理●审批●报表信息管理●进行密码修改、备份数据库等系统设置~~~ ~~第3章总体设计3.1总体用例图用例图是一个系统建模的启始点,可以使用用例图对将要开发系统的实际工作流程进行业务建模,从业务模型的基础上过度到系统建模的开始,可以通过用例图来搜集用户的需求,明确和系统相关的用户和其他系统,同时确定系统将会提供什么功能,以及各个功能间的关系。图3-1总体用例图3.2用例说明根据上述用例图,对登陆和人员信息管理模块做了如下用例说明:~~~ ~~3.2.1用户从浏览器登录用例概述用例名称用户登陆主题领域用例定义用户登录到系统,获得相应的界面和使用权限角色仓管员或主管业务触发事件用户准备开始使用系统进行业务处理或系统管理前置条件系统中已为该用户建立系统用户,并分配了相应权限结束条件n成功条件用户登录系统,并获得相应权限n失败条件1)系统中没有该用户;2)用户名、密码错误相关用例输入概述用户名、密码、角色输出概述与用户权限相应的界面使用性备注本用例使用频繁用例备注主事件流步骤角色/系统描述数据项备注1.角色启动登录程序2.系统显示登录界面;提示输入用户标识和保密字3.角色输入用户标识和保密字,登录系统用户名,密码,角色4.系统验证用户是否合法用户、保密字是否正确;返回用户相应的界面、菜单如果不是合法用户、或保密字不正确转到A1。5.分支事件流编号主事件流步骤号角色/系统条件描述数据项转去主事件流步骤号备注A14系统不是合法用户,用户名、密码错误,用户名和密码与角色不对应返回登录失败信息登录失败信息2~~~ ~~2.2.2供货商信息查询用例概述用例名称供货商信息查询主题领域供货商信息查询用例包用例定义供货商信息查询角色仓库管理人员业务触发事件进行供货商信息查询前置条件有需要查询的供货商信息记录结束条件n成功条件查询到需要查询的供货商信息n失败条件未查询到需要查询的供货商信息相关用例输入概述所需查询的供货商信息输出概述查询结果使用性备注用例备注主事件流步骤角色/系统描述数据项备注1.角色进入查询界面2.系统显示查询界面3.角色输入所需查询的供货商信息4.系统查询是否成功查询成功如果查询成功转到A1如果查询不成功转到A2分支事件流编号主事件流步骤号角色/系统条件描述数据项转去主事件流步骤号备注A14系统完成供货商信息查询返回成功信息查询的供货商信息2A24系统没有完成供货商信息查询返回失败信息查询失败的信息提示2~~~ ~~2.2.3供货商信息修改用例概述用例名称供货商信息修改主题领域供货商信息修改用例包用例定义供货商信息修改角色仓库管理人员业务触发事件进行供货商信息修改前置条件有需要修改的供货商信息记录结束条件n成功条件查询到需要修改的供货商信息n失败条件未查询到需要修改的供货商信息相关用例输入概述所需修改的供货商信息输出概述修改结果使用性备注用例备注主事件流步骤角色/系统描述数据项备注1.角色进入修改界面2.系统显示修改界面3.角色输入所需修改的供货商信息4.系统修改是否成功修改成功如果修改成功转到A1如果修改不成功转到A2分支事件流编号主事件流步骤号角色/系统条件描述数据项转去主事件流步骤号备注A14系统完成供货商信息修改返回成功信息修改的供货商信息2A24系统没有完成供货商信息修改返回失败信息修改失败的信息提示2~~~ ~~2.2.4供货商信息添加用例概述用例名称供货商信息添加主题领域供货商信息添加用例包用例定义供货商信息角色仓库管理人员业务触发事件进行供货商信息添加前置条件有需要添加的供货商信息记录结束条件n成功条件查询到需要添加的供货商信息n失败条件未查询到需要添加的供货商信息相关用例输入概述所需添加的供货商信息输出概述添加结果使用性备注用例备注主事件流步骤角色/系统描述数据项备注1.角色进入添加界面2.系统显示添加界面3.角色输入所需添加的供货商信息4.系统添加是否成功添加成功如果添加成功转到A1如果添加不成功转到A2分支事件流编号主事件流步骤号角色/系统条件描述数据项转去主事件流步骤号备注A14系统完成供货商信息添加返回成功信息添加的供货商信息2A24系统没有完成供货商信息添加返回失败信息添加失败的信息提示2~~~ ~~3.3功能模块图功能模块:山口电脑仓库管理系统包括仓管部信息管理、业务管理、系统维护等几个功能模块。仓管部信息管理仓管部业务管理山口电脑仓库管理系统系统维护图3-3总功能模块图1、仓管部信息管理模块:为仓管部主管提供对仓管部信息的管理维护的功能。~~~ ~~仓管部信息管理基本信息管理出库信息维护入库信息维护库检信息维护报表信息管理系统设置客户信息维护供货商信息维护库房信息维护短线货品信息维护部件、礼品信息维护修改密码成品品信息维护库存信息维护在库信息管理仓管人员信息维护图3-3-1仓管部模块图一、仓管部信息管理模块,如图所示,包括以下功能模块: 1.基本信息管理模块:为管理员提供实现对客户信息、供货商信息、库房信息和仓管人员信息的管理维护,包括对信息查询、添加、修改和删除等操作。2.在库信息管理模块:a、库存信息管理模块:为管理员提供实现对短线货物、货物信息的管理维护,包括对信息查询、添加、修改和删除等操作。b、库检信息管理模块:为管理员提供实现对产品库检信息、部件库检信息、礼品库检信息的管理维护,包括对信息查询、添加、修改和删除等操作。3.出库信息管理模块:为管理员提供查询、添加、修改和删除出库流向单(包括:产品出库单、部件出库单、礼品出库单)的操作,其中添加和删除操作后的出库货检单要交由管理部审核。4.入库信息管理模块:为管理员提供查询、添加、修改和删除入库流向单(包括:部件入库单、产品入库单、礼品入库单)的操作、其中添加和删除操作后的入库货检单要交由管理部审核。5.报表信息管理模块:为管理员提供实现对报表信息的管理维护,包括对报表信息查询、浏览和上交等操作。~~~ ~~1.系统设置模块:为管理员提供实现对密码修改、清除表信息的功能管理部信息管理仓管部人员管理仓库报表管理仓库货检信息管理基本信息管理系统设置修改密码备份数据库恢复数据库、图3-3-2管理部模块图二、管理部信息管理模块,如图所示,包括以下功能模块:1、仓管部人员管理模块:为管理员提供实现对仓库部门信息的管理维护,包括对部门信息查询、添加、修改和删除等操作。2、仓库报表管理模块:为管理员提供实现对报表信息的管理维护,包括对报表的查询、浏览和删除等操作。3、仓库货检信息管理模块:为管理员提供实现对货检信息的管理维护,包括对在库货检信息、入库货检信息和出库货检信息的审核操作。4、基本信息管理模块:为管理员提供实现对基本信息进行添加、删除、查询和浏览功能、5、系统设置模块:为管理员提供实现修改密码、备份数据库和恢复数据库的功能~~~ ~~第4章详细设计4.1ER图ER图就是实体关系图,主要完成了对系统中数据部分设计。E-R图为实体-联系图,提供了表示实体型、属性和联系的方法,用来描述现实世界的概念模型。构成E-R图的基本要素是实体型、属性和联系。以下是系统的整个ER图:图4-1ER图~~~ ~~4.2数据库设计数据库设计(DatabaseDesign)是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。一般,数据库的设计过程大致可分数据库设计为5个步骤:l需求分析;调查和分析用户的业务活动和数据的使用情况,弄清所用数据的种类、范围、数量以及它们在业务活动中交流的情况,确定用户对数据库系统的使用要求和各种约束条件等,形成用户需求规约。l概念设计;对用户要求描述的现实世界(可能是一个工厂、一个商场或者一个学校等),通过对其中住处的分类、聚集和概括,建立抽象的概念数据模型。这个概念模型应反映现实世界各部门的信息结构、信息流动情况、信息间的互相制约关系以及各部门对信息储存、查询和加工的要求等。所建立的模型应避开数据库在计算机上的具体实现细节,用一种抽象的形式表示出来。以扩充的实体—(E-R模型)联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。第二步再将前面得到的多个用户的局部视图集成为一个全局视图,即用户要描述的现实世界的概念数据模型。l逻辑设计;主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库”。l物理设计;根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。l验证设计;在上述设计的基础上,收集数据并具体建立一个数据库,运行一些典型的应用任务来验证数据库设计的正确性和合理性。一般,一个大型数据库的设计过程往往需要经过多次循环反复。当设计的某步发现问题时,可能就需要返回到前面去进行修改。因此,在做上述数据库设计时就应考虑到今后修改设计的可能性和方便性。数据库的完整性是指数据的正确性和有效性,是为防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据库的完整性包括:实体完整性、参照完整性和用户定义完整性。实体完整性(EntityIntegrity):现实世界的实体是可区分的,即它们具有某种唯一性标识。相应地,关系模型中主键应作为唯一性标识。因此实体完整性规则规定基本关系的所有主键(PrimaryKey)都不能取空值(NULL)。参照完整性(ReferentialIntegrity):参照完整性维护表与表之间的相关性,通常用“主键(PrimaryKey)/外键(ForeignKey)”保证,其中ForeignKey可以取NULL值,或取其参照表中PrimaryKey的取值。用户定义的完整性(User_definedIntegrity):针对某一具体数据的约束条件,由应用环境决定。~~~ ~~数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据。4.2.1数据库的逻辑设计仓库管理系统所用的数据库是MySQL,如下是表在数据库的逻辑表示:表assembly的结构字段名注释类型长度是否主键是否不为空id编号INTEGER11√√ Inbill_id入库单编号VARCHAR20  Supplier_id供货商编号VARCHAR20  Depot_id库房编号VARCHAR20   Number数量INTEGER11Sumof_bad不合格数量INTEGER11Atcheck_date在库货检日期DATE11√ In_date入库日期DATE11√ Employee_id货检员编号char5 表product的结构字段名注释类型长度是否主键是否不为空id编号INTEGER11√√ Makebill_id组装单编号VARCHAR20 √ Depot_id库房编号VARCHAR20  Check_id货检编号VARCHAR20   Number数量INTEGER11Sumof_bad不合格数量INTEGER11Make_date组装日期DATE11√ Check_date货检日期DATE11√ 表assembly_product的结构字段名注释类型长度是否主键是否不为空id编号INTEGER11√√ Assembly_id部件编号VARCHAR20 Product_id成品编号VARCHAR20  表customer的结构~~~ ~~字段名注释类型长度是否主键是否不为空Customer_id客户编号VARCHAR20√√ name姓名VARCHAR20  sex性别VARCHAR20  credit信誉度INTEGER11   phone电话号码VARCHAR20address地址VARCHAR20remark备注VARCHAR20 表depot的结构字段名注释类型长度是否主键是否不为空Depot_id库房编号VARCHAR20√√ Employee_id责任人编号VARCHAR20  phone电话号码VARCHAR20address地址VARCHAR20remark备注VARCHAR20 表employee的结构字段名注释类型长度是否主键是否不为空Employee_id人员编号VARCHAR20√√ Inbill_id入库单编号VARCHAR20  Supplier_id供货商编号VARCHAR20  Depot_id库房编号VARCHAR20   Number数量INTEGER11Sumof_bad不合格数量INTEGER11Atcheck_date在库货检日期DATE11√ In_date入库日期DATE11√ Employee_id货检员编号VARCHAR5 ~~~ ~~表supplier的结构字段名注释类型长度是否主键是否不为空Supplier_id供货商编号VARCHAR20√√ name姓名VARCHAR20 √ sex性别VARCHAR20  credit信誉度INTEGER11   phone电话号码VARCHAR20address地址VARCHAR20remark备注VARCHAR20 表inbill的结构字段名注释类型长度是否主键是否不为空In_id入库单编号VARCHAR20√√ Depot_id库房编号VARCHAR20  Refer_date入库日期DATE11  Wh_id提交人编号VARCHAR20Check_date货检日期DATE11Ch_id货检人编号VARCHAR20√ Audit_date审核日期DATE11√ M_id主管编号VARCHAR20 In_state入库单状态VARCHAR20 表inlist的结构字段名注释类型长度是否主键是否不为空id编号INTEGER11√√ In_id入库单编号VARCHAR20 √  Assembly_id部件编号VARCHAR20 √  Supplier_id供货商编号VARCHAR20  √  Number数量INTEGER11Badnumber不合格数量INTEGER11Good_rate合格率VARCHAR20 ~~~ ~~表makebill的结构字段名注释类型长度是否主键是否不为空Makebill_id组装单编号VARCHAR20√√ Depot_id库房编号VARCHAR20  Product_id成品编号VARCHAR20 √  Number数量INTEGER11Atcheck_date在库货检日期DATE11√ Make_date组装日期DATE11 Manager_id主管编号VARCHAR20 √表outbill的结构字段名注释类型长度是否主键是否不为空Outbill_id出库单编号VARCHAR20√√ Depot_id库房编号VARCHAR20  Refer_date供货商编号VARCHAR20  Refer_id提交人编号VARCHAR20Audit_date审核日期DATE11Out_state出库单状态VARCHAR11 Audit_id审核人编号VARCHAR20 Customer_id客户编号VARCHAR20 √ 表outlist的结构字段名注释类型长度是否主键是否不为空id编号INTEGER11√√ Outbill_id出库单编号VARCHAR20 √  Product_id成品编号VARCHAR20 √  Number数量INTEGER11~~~ ~~表report的结构字段名注释类型长度是否主键是否不为空Reportid报表编号VARCHAR20√√ Reporttype报表类型VARCHAR20 √ Depotid库房编号VARCHAR20 √ beginDate起始日期DATE11√endDate结束日期DATE11√createTime创建日期DATE11√ referId提交人编号VARCHAR20√ checkState审核状态VARCHAR20 √ checkDate审核日期DATE11AuditId审核人编号VARCHAR20表report_detail的结构字段名注释类型长度是否主键是否不为空id编号INTEGER11√√ reportId报表编号VARCHAR20 √ Depotid库房编号VARCHAR20 √ goodsName货物名称VARCHAR40√goodsType货物类型VARCHAR30√allNumber总数量INTEGER11 badNumber不合格数量INTEGER11checkId审核人编号VARCHAR20 √ 4.3运行环境1.开发工具:Eclipse,2.软件环境:Tomcat6.0,JDK5.0以上,3.硬件环境:cpu:P32.0GHZ以上 Memory:512M以上~~~ ~~第5章编码5.1登陆的实现5.1.1登陆actionimportjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importcom.javateam3.struts.form.LoginForm;importcom.javateam3.whmsys.common.dao.LoginService;/***MyEclipseStruts*Creationdate:05-30-2009**XDocletdefinition:*@struts.actionpath="/login"name="loginForm"input="/webpage/login.jsp"scope="request"validate="true"*/publicclassLoginActionextendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){LoginFormloginForm=(LoginForm)form;try{StringuserName=loginForm.getUser_name().trim();Stringpsw=loginForm.getPsw().trim();LoginServiceloginService=newLoginService();HttpSessionsession=request.getSession(true);if(loginService.login(userName,psw)){session.setAttribute("username",userName);//如果登录成功把登录的名字放在session中以便在过滤器中判断returnmapping.findForward("loginSuccess");//返回到登陆成功页面}else{~~~ ~~session.invalidate();request.setAttribute("loginError","用户或者密码错误!!");//返回到错误页面returnmapping.findForward("loginError");}}catch(Exceptione){e.printStackTrace();}returnnull;}}5.1.2登陆过滤器importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.*;publicclassSecurityAndDenyimplementsFilter{publicvoiddestroy(){//注销时调用}publicvoiddoFilter(ServletRequestreq,ServletResponseresp,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)resp;HttpSessionsession=request.getSession(false);//取出来session如果没有得到空值if(session==null||session.getAttribute("username")==null){//判断是否登录过如果没有就重定向到登陆页面Stringtemp="你还没登陆请重新登陆!!";temp=java.net.URLEncoder.encode(temp.toString(),"utf-8");response.sendRedirect("http://localhost:8080/JT03EtpLgtWebProject03/login.jsp?loginErr="+temp);return;}//如果登录了就进入请求页面chain.doFilter(req,resp);}publicvoidinit(FilterConfigarg0)throwsServletException{//初始化时调用的方法~~~ ~~}}5.1.3登陆DAOpublicBooleanlogin(StringuserName,Stringpsw){Employeeemployee=newEmployee();employee.setPsw(psw);employee.setUserName(userName);Listresults=findByExample(employee);intlength=results.size();if(length==1){returntrue;}else{returnfalse;}}5.2供货商的实现5.2.1供货商查询Actionpackagecom.javateam3.whmsys.manager.basicinfo.supplyerinfo.action;importjava.util.List;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importcom.javateam3.whmsys.common.PageBean;importcom.javateam3.whmsys.manager.basicinfo.supplyerinfo.form.QueryForm;importcom.javateam3.whmsys.manager.basicinfo.supplyerinfo.service.SupplierService;importcom.javateam3.whmsys.common.pojo.Supplier;importcom.javateam3.whmsys.common.utils.Tool;~~~ ~~publicclassQueryActionextendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{QueryFormqueryForm=(QueryForm)form;SupplierServicess=newSupplierService();PageBeanpageBean=newPageBean();Listlist=null;//存放查出来的spplier对象StringcrrPage=request.getParameter("cp");intcurrentPage=pageBean.getCurrentPage();intlineSize=pageBean.getLineSize();Suppliersupplier=change(queryForm);if(crrPage!=null){currentPage=Integer.parseInt(crrPage);}else{intallRecorders=ss.getCount(supplier);Tool.setALLRECORDERS(allRecorders);Tool.setPAGESIZE((allRecorders+lineSize-1)/lineSize);pageBean.setAllRecorders(allRecorders);pageBean.setPageSize((allRecorders+lineSize-1)/lineSize);}list=ss.queryByExample(supplier,currentPage,lineSize);pageBean.setCurrentPage(currentPage);request.setAttribute("pageBean",pageBean);request.setAttribute("list",list);//把查询出来的supplier对象放在request里returnmapping.findForward("supplierResult");}//把form表单里的东西转化为supplier对象publicSupplierchange(QueryFormqueryForm){Suppliersupplier=newSupplier();if(queryForm.getSupplierId()!=null&&!queryForm.getSupplierId().equals(""))supplier.setSupplierId(queryForm.getSupplierId());if(queryForm.getAddress()!=null&&!queryForm.getAddress().equals(""))supplier.setAddress(queryForm.getAddress());if(queryForm.getName()!=null&&!queryForm.getName().equals(""))supplier.setName(queryForm.getName());if(queryForm.getCredit()!=null&&!queryForm.getCredit().equals(""))supplier.setCredit(queryForm.getCredit());if(queryForm.getPhone()!=null&&!queryForm.getPhone().equals(""))supplier.setPhone(queryForm.getPhone());~~~ ~~if(queryForm.getRemark()!=null&&!queryForm.getRemark().equals(""))supplier.setRemark(queryForm.getRemark());returnsupplier;}}5.2.2供货商修改Actionimportjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importcom.javateam3.whmsys.common.pojo.Supplier;importcom.javateam3.whmsys.manager.basicinfo.supplyerinfo.form.ModifyForm;importcom.javateam3.whmsys.manager.basicinfo.supplyerinfo.service.SupplierService;publicclassModifyActionextendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){ModifyFormmodifyForm=(ModifyForm)form;Suppliersupplier=newSupplier();supplier.setAddress(modifyForm.getAddress());supplier.setCredit(modifyForm.getCredit());supplier.setName(modifyForm.getName());supplier.setPhone(modifyForm.getPhone());supplier.setRemark(modifyForm.getRemark());supplier.setSupplierId(modifyForm.getSupplierId());SupplierServicess=newSupplierService();try{ss.upDate(supplier);returnmapping.findForward("success");}catch(Exceptione){e.printStackTrace();returnmapping.findForward("error");}}}5.2.2供货商添加Actionimportjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;~~~ ~~importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importcom.javateam3.whmsys.common.pojo.Supplier;importcom.javateam3.whmsys.manager.basicinfo.supplyerinfo.form.AddForm;importcom.javateam3.whmsys.manager.basicinfo.supplyerinfo.service.SupplierService;publicclassAddActionextendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){AddFormaddForm=(AddForm)form;Suppliersupplier=newSupplier();supplier.setAddress(addForm.getAddress());supplier.setCredit(addForm.getCredit());supplier.setName(addForm.getName());supplier.setPhone(addForm.getPhone());supplier.setRemark(addForm.getRemark());supplier.setSupplierId(addForm.getSupplierId());SupplierServicess=newSupplierService();try{ss.insert(supplier);returnmapping.findForward("success");}catch(Exceptione){e.printStackTrace();//出现异常打印轨迹returnmapping.findForward("error");}}}5.2.3供货商DAOpackagecom.javateam3.whmsys.manager.basicinfo.supplyerinfo.dao;importjava.util.ArrayList;importjava.util.List;importorg.hibernate.Criteria;importorg.hibernate.LockMode;importorg.hibernate.Query;importorg.hibernate.Session;importorg.hibernate.Transaction;importorg.hibernate.criterion.Example;~~~ ~~importcom.javateam3.whmsys.common.dao.BaseHibernateDAO;importcom.javateam3.whmsys.common.pojo.Supplier;importcom.javateam3.whmsys.common.utils.UtilGetExample;publicclassSupplierDAOextendsBaseHibernateDAO{publicstaticfinalStringNAME="name";publicstaticfinalStringADDRESS="address";publicstaticfinalStringPHONE="phone";publicstaticfinalStringCREDIT="credit";publicstaticfinalStringREMARK="remark";publicstaticfinalStringSUPPLIERID="supplierId";publicvoidsave(SuppliertransientInstance){Transactiontransaction=null;try{Sessionsession=getSession();transaction=session.beginTransaction();session.save(transientInstance);transaction.commit();session.close();}catch(Exceptionre){}}publicvoidupDate(SuppliertransientInstance)throwsException{try{Sessionsession=getSession();Transactiontransaction=session.beginTransaction();session.update(transientInstance);transaction.commit();session.close();}catch(RuntimeExceptionre){throwre;}}publicSupplierfindById(java.lang.Stringid){try{Sessionsession=getSession();Transactiontransaction=session.beginTransaction();Supplierinstance=(Supplier)session.get("com.javateam3.whmsys.common.pojo.Supplier",id);session.close();returninstance;}catch(RuntimeExceptionre){throwre;}~~~ ~~}publicintgetCount(Supplierinstance)throwsException{if(instance.getSupplierId()!=null){Suppliersupplier=findById(instance.getSupplierId());if(supplier!=null){return1;}else{return0;}}else{Sessionsession=getSession();Transactiontransaction=session.beginTransaction();Criteriac=session.createCriteria("com.javateam3.whmsys.common.pojo.Supplier").add(Example.create(instance));inti=c.list().size();transaction.commit();session.close();returni;}}publicListfindByExample(Supplierinstance,intcurrentPage,intlineSize)throwsException{Listlist=null;Sessionsession=getSession();if(findByProperty(SUPPLIERID,instance.getSupplierId()).size()==0||findByProperty("supplierId",instance.getSupplierId())==null){Examplees=UtilGetExample.getExample(instance);Transactiontransaction=session.beginTransaction();Criteriac=session.createCriteria("com.javateam3.whmsys.common.pojo.Supplier").add(es);c.setFirstResult((currentPage-1)*lineSize);c.setMaxResults(lineSize);list=c.list();transaction.commit();getSession().close();if(list.size()==0||list==null){returnnull;~~~ ~~}returnlist;}else{returnfindByProperty("supplierId",instance.getSupplierId());}}}~~~ ~~第6章测试6.1登陆测试方案l输入空账号l输入不存在的账号密码l输入正确的账号和错误的密码l输入正确账号和空密码l没有登录直接访问页面6.2数据录入测试l录入一条空记录l录入一条以上全部数据项非空记录l录入一条以上只填必填数据项的记录l录入一条以上只填非必填数据项的记录l对具有外键关联的表录入一条以上检验外键约束的记录l录入一条以上正确的记录l录入一条以上检验其他自定义完整性约束的记录6.3查询测试l正常查询一条以上记录l查询各种查非所查的记录l查询各种不对应选项的查询6.4测试结论首先,我们要认识到测试是软件开发过程中一个非常重要的环节,一个好的软件必须经过无数次的测试,软件测试是保证软件质量的关键步骤。在经过对各模块的测试后,已经能够证实该软件各方面的能力都可以正常运行。该软件在各方面的综合能力都通过。~~~ ~~第7章使用说明7.1系统功能简介本系统角色包括两种,仓库主管和普通管理员,其中,仓库主管拥有整个系统的最高权限。仓库主管负责整个山口物流公司仓管部的日常运作和管理工作,除了具有普通管理员的权利,还具有以下权利和义务,主要包括:l基本信息管理:维护客户信息、供货商信息和仓管员信息,具体操作有添加、修改、删除和查询。l入库管理:查看入库单,并且具有审批的功能,以决定是否需要入库。如果没有通过审批,将不能入库。l出库管理:查看出库单,具有审批的功能,如果没有通过审批,将不能出库。l报表信息管理:打印、查看一些报表。l系统设置:修改个人信息,备份和还原数据。l在库管理:管理在库的物品,记录盘点信息,以及维护仓库。l退货信息管理:管理退货信息,包括客户向公司的退货,以及公司向供货商退货。仓管部管理人员:负责仓库的出入库管理,可以根据流向单实现出/入库操作;管理库内的产品,记录一些库检、盘点等信息,还可以修改个人信息等。具体权限有:l基本信息管理:只可以查询客户信息,供货商信息和仓管员的信息,不能对其做任何修改或删除操作。还可以查询仓库信息。l入库管理:添加入库单,然后提交给主管审批,如果通过审批,则可以入库。对于通过审批的入库单,不能再作修改,只能查询;对于没有通过审批的入库单,可以根据主管的批注作修改或删除的操作。l出库管理:添加出库单,然后提交给主管审批,如果通过审批,则可以出库。对于通过审批的出库单,不能再作修改,只能查询;对于没有通过审批的出库单,可以根据主管的批注作修改或删除的操作。l在库管理:查看库存信息、成品组装、在库移动、以及记录盘点信息。l退货信息管理:管理退货信息,包括客户向公司的退货,以及公司向供货商退货。l报表信息管理:打印、查看一些报表。l系统设置:修改个人信息。7.2运行环境简介硬件环境:服务器端:推荐配置为1G内存,CPU为1700MHZ以上配置,硬盘容量为80G的微机。通信网络:依托校园网,网络协议为HTTP、TCP/IP。软件环境:~~~ ~~服务器端:Ø操作系统:Windows2000/NT/XP/2003Ø数据库服务器:MySQLServer4.1ØWeb服务器:ApacheTomcat6.0Ø技术架构平台:SunJ2DK1.6客户端:Ø操作系统:Windows2000/XP/2003Ø浏览器:InternetExplore6.0或以上版本屏幕分辨率推荐为:1024*768或以上7.3系统运行与操作指南配置该项目,启动Tomcat服务器,打开InternetExplorer,在URL地址中输入http://localhost:8080/JT03EtpLgtWebProject03/login.jsp,进入登录页面,根据输入的用户,可以判定是主管或者是普通仓管员,用户名和密码都正确,即可登录到相应的主页面,进行相应的操作。7.4操作演示~~~ ~~~~~ ~~主登陆页面7.5特色介绍(1)本系统根据山口物流公司实际需求进行设计和开发的,切合实际,具有很强的实用性。(2)界面友好,功能完善,接口丰富,具有很好的可扩充性.(3)完善的后台管理,管理员不需要懂得任何操作就可以对前台进行控制。(4)采用Browser/Server三层体系结构,使系统具有很好的可维护性和可重用性。(5)Web服务器采用的是Apache的Tomcat应用服务器,它是一个比较完善的、开放的轻量级Web应用服务器,性能优良,配置和部署方便。它严格地遵循普遍流行的开放标准,在中小型开发过程中较为适用。(6)有警报设置功能,对于数量不足的产品或积压时间过长的产品,会自动提示,更加人性化。~~~ ~~第8章总结仓库管理是物流管理的核心内容之一,基于Internet的仓储管理系统,改变了繁重的手工操作带来的效率低,易出错的状况,解决了跨地域仓储的难题,提高了仓储服务水平,减少了企业仓储投资。系统从分析、设计开始,高标准要求,并且严格按照信息系统工程的方法,保证了系统在运行之后的稳定性。技术采用的J2EE、MVC模式、DAO模式等方法,提高了系统的模块化和结构化,使系统更易扩展、升级和维护。但是,本系统目前只是针对某些物流公司的业务情况开发的,有一定的通用性。由于每个公司的业务情况和管理方式都不一样,设计时并没考虑这些情况。另外,在数据仓库,深度数据挖掘技术以及仓储的智能化方面,没有做详细的考虑,有待今后逐步地进行完善。关于本系统,虽然对仓库管理进行了系统的创建,但我们不可忽略的是这个系统并不完美,我们也不能高枕无忧。我们要在以后的实践中去检验它的可用性,特别要考虑它的实时性和安全性,这才是我们最值得考虑的问题。一个系统好不好,要经过反复的使用才能知道,不光光是理论中分析和设计得出来的。由此我就想到了在做这个系统时,有的同学用了ACCESS,有的同学用了SQL等来建不同的数据库,这样就导致有的是系统自带的代码,而有的则是我们写进去的纯代码,当然也就出现了各种各样的问题。特别是关于系统的可移植性,有许多不足之处,这样我们就应该多查阅相关资料,反复地熟练应用,才能把系统设计的巧,设计的好。同学们之间的交流也十分重要,交流就是进步,有时进会带你走入一种柳暗花明的欣喜境界~~~ ~~参考文献[1]吴建,郑潮,汪杰.UML基础与Rose建模案例.北京:人民邮电出版社.2004年9月[2]黄晓东著.JAVA课程设计案例精编.河南:中国水利水电出版社.2004.7[3](美)BruceEckel著,陈昊鹏,饶若楠等译.JAVA编程思想.陕西:机械工业出版社.2005.6[4]陈玉峰.MySql数据库开发教程.北京:科学出版社.2004.4[5]PerryEdwards.SystemAnalysis&Design.MitchellMcgraw-Hill.2005.5[6]冀振燕.UML系统分析设计与应用案例.北京:人民邮电出版社.2005.6[7]TedHusted,CedricDumoulin,GeorgeFranciscus,DavidWinterfeldt.StrutsinAction[M].ManningPublicationsCompany.2003[8]冯燕奎,赵德奎等.JSP实用案例教程.北京:清华大学出版社.2004[9]BruceEckel.Thinkinginjava.pearsonEducation.2005.5[10]杨志波.DreamweaverMX2004标准教程.北京:中国宇航出版社.2004年第1版[11]孙卫琴.精通Struts基于MVC的JavaWeb设计与开发[M].北京:飞思科技产品研发中心.2006[12]R.M.Stair.PrincipleofInformationSystem.Boyd&FraserPublishingCompany.2004~~~ ~~致谢非常感谢我的导师曹来成老师给我的悉心关怀,让我顺利地完成了毕业论文,当然,也感谢母校辛勤培育之恩,各位领导、老师和同学的大力帮助之情,使我学到了许多新的知识,同是也更懂得了一些做学问的道理,这是一笔宝贵的财富。从选择毕业设计题目,到毕业设计规划,查找相关资料,设计模型,具体实施,结束论文,整个大致的流程中,我的导师都给予了我耐心的指导和默默的关心,设计为期之长,其间遇到了不少问题,也承蒙了老师的照顾,真的想对老师说一声:老师,辛苦了,谢谢您。除此之外,我还要致谢我的几位同学的得力相助,我希望我能向他们学习,发扬那种百折不挠、孜孜不倦的对知识求索精神,那种至高无上的敬业精神,马上我就要走向工作单位了,我相信我会时刻用他们的平凡而不简单来鞭策自已。最后,衷心祝愿我的老师和学友们永远幸福,快乐。~~~ ~~翻译资料原文OverviewofJSPTechnologyBenefitsofJSPJSPpagesaretranslatedintoservlets.So,fundamentally,anytaskJSPpagescanperformcouldalsobeaccomplishedbyservlets.However,thisunderlyingequivalencedoesnotmeanthatservletsandJSPpagesareequallyappropriateinallscenarios.Theissueisnotthepowerofthetechnology,itistheconvenience,productivity,andmaintainabilityofoneortheother.Afterall,anythingyoucandoonaparticularcomputerplatformintheJavaprogramminglanguageyoucouldalsodoinassemblylanguage.Butitstillmatterswhichyouchoose.JSPprovidesthefollowingbenefitsoverservletsalone:•ItiseasiertowriteandmaintaintheHTML.YourstaticcodeisordinaryHTML:noextrabackslashes,nodoublequotes,andnolurkingJavasyntax.•YoucanusestandardWeb-sitedevelopmenttools.EvenHTMLtoolsthatknownothingaboutJSPcanbeusedbecausetheysimplyignoretheJSPtags.•Youcandivideupyourdevelopmentteam.TheJavaprogrammerscanworkonthedynamiccode.TheWebdeveloperscanconcentrateonthepresentationlayer.Onlargeprojects,thisdivisionisveryimportant.Dependingonthesizeofyourteamandthecomplexityofyourproject,youcanenforceaweakerorstrongerseparationbetweenthestaticHTMLandthedynamiccontent.Now,thisdiscussionisnottosaythatyoushouldstopusingservletsanduseonlyJSPinstead.Bynomeans.Almostallprojectswilluseboth.Forsomerequestsinyourproject,youwilluseservlets.Forothers,youwilluseJSP.Forstillothers,youwillcombinethemwiththeMVCarchitecture.Youwanttheappropriatetoolforthejob,andservlets,bythemselves,donotcompleteyourtoolkit.AdvantagesofJSPOverCompetingTechnologiesAnumberofyearsago,Martywasinvitedtoattendasmall20-personindustryroundtablediscussiononsoftwaretechnology.SittingintheseatnexttoMartywasJamesGosling,inventoroftheJavaprogramminglanguage.Sittingseveralseatsawaywasahigh-levelmanagerfromaverylargesoftwarecompanyinRedmond,Washington.Duringthediscussion,themoderatorbroughtupthesubjectofJini,whichatthattimewasanewJavatechnology.Themoderatoraskedthemanager~~~ ~~whathethoughtofit,andthemanagerrespondedthatitwastooearlytotell,butthatitseemedtobeanexcellentidea.Hewentontosaythattheywouldkeepaneyeonit,andifitseemedtobecatchingon,theywouldfollowhiscompany"susual"embraceandextend"strategy.Atthispoint,Goslinglightheartedlyinterjected"Youmeandisgraceanddistend."Now,thegrievancethatGoslingwasairingwasthathefeltthatthiscompanywouldtaketechnologyfromothercompaniesandsubornitfortheirownpurposes.Butguesswhat?Theshoeisontheotherfoothere.TheJavacommunitydidnotinventtheideaofdesigningpagesasamixtureofstaticHTMLanddynamiccodemarkedwithspecialtags.Forexample,ColdFusiondidityearsearlier.EvenASP(aproductfromtheverysoftwarecompanyoftheaforementionedmanager)popularizedthisapproachbeforeJSPcamealonganddecidedtojumponthebandwagon.Infact,JSPnotonlyadoptedthegeneralidea,itevenusedmanyofthesamespecialtagsasASPdid.So,thequestionbecomes:whyuseJSPinsteadofoneoftheseothertechnologies?Ourfirstresponseisthatwearenotarguingthateveryoneshould.Severalofthoseothertechnologiesarequitegoodandarereasonableoptionsinsomesituations.Inothersituations,however,JSPisclearlybetter.Hereareafewofthereasons.Versus.NETandActiveServerPages(ASP).NETiswell-designedtechnologyfromMicrosoft.ASP.NETisthepartthatdirectlycompeteswithservletsandJSP.TheadvantagesofJSParetwofold.First,JSPisportabletomultipleoperatingsystemsandWebservers;youaren"tlockedintodeployingonWindowsandIIS.Althoughthecore.NETplatformrunsonafewnon-Windowsplatforms,theASPpartdoesnot.YoucannotexpecttodeployseriousASP.NETapplicationsonmultipleserversandoperatingsystems.Forsomeapplications,thisdifferencedoesnotmatter.Forothers,itmattersgreatly.Second,forsomeapplicationsthechoiceoftheunderlyinglanguagemattersgreatly.Forexample,although.NET"sC#languageisverywelldesignedandissimilartoJava,fewerprogrammersarefamiliarwitheitherthecoreC#syntaxorthemanyauxiliarylibraries.Inaddition,manydevelopersstillusetheoriginalversionofASP.Withthisversion,JSPhasaclearadvantageforthedynamiccode.WithJSP,thedynamicpartiswritteninJava,notVBScriptoranotherASP-specificlanguage,soJSPismorepowerfulandbettersuitedtocomplexapplicationsthatrequirereusablecomponents.YoucouldmakethesameargumentwhencomparingJSPtothepreviousversionofColdFusion;~~~ ~~withJSPyoucanuseJavaforthe"realcode"andarenottiedtoaparticularserverproduct.However,thecurrentreleaseofColdFusioniswithinthecontextofaJ2EEserver,allowingdeveloperstoeasilymixColdFusionandservlet/JSPcode.VersusPHPPHP(arecursiveacronymfor"PHP:HypertextPreprocessor")isafree,open-source,HTML-embeddedscriptinglanguagethatissomewhatsimilartobothASPandJSP.OneadvantageofJSPisthatthedynamicpartiswritteninJava,whichalreadyhasanextensiveAPIfornetworking,databaseaccess,distributedobjects,andthelike,whereasPHPrequireslearninganentirelynew,lesswidelyusedlanguage.AsecondadvantageisthatJSPismuchmorewidelysupportedbytoolandservervendorsthanisPHP.VersusPureServletsJSPdoesn"tprovideanycapabilitiesthatcouldn"t,inprinciple,beaccomplishedwithservlets.Infact,JSPdocumentsareautomaticallytranslatedintoservletsbehindthescenes.Butitismoreconvenienttowrite(andtomodify!)regularHTMLthantouseazillionprintlnstatementstogeneratetheHTML.Plus,byseparatingthepresentationfromthecontent,youcanputdifferentpeopleondifferenttasks:yourWebpagedesignexpertscanbuildtheHTMLbyusingfamiliartoolsandeitherleaveplacesforyourservletprogrammerstoinsertthedynamiccontentorinvokethedynamiccontentindirectlybymeansofXMLtags.DoesthismeanthatyoucanjustlearnJSPandforgetaboutservlets?Absolutelynot!JSPdevelopersneedtoknowservletsforfourreasons:1.JSPpagesgettranslatedintoservlets.Youcan"tunderstandhowJSPworkswithoutunderstandingservlets.2.JSPconsistsofstaticHTML,special-purposeJSPtags,andJavacode.WhatkindofJavacode?Servletcode!Youcan"twritethatcodeifyoudon"tunderstandservletprogramming.3.SometasksarebetteraccomplishedbyservletsthanbyJSP.JSPisgoodatgeneratingpagesthatconsistoflargesectionsoffairlywellstructuredHTMLorothercharacterdata.Servletsarebetterforgeneratingbinarydata,buildingpageswithhighlyvariablestructure,andperformingtasks(suchasredirection)thatinvolvelittleornooutput.4.SometasksarebetteraccomplishedbyacombinationofservletsandJSPthanbyeitherservletsorJSPalone.~~~ ~~VersusJavaScriptJavaScript,whichiscompletelydistinctfromtheJavaprogramminglanguage,isnormallyusedtodynamicallygenerateHTMLontheclient,buildingpartsoftheWebpageasthebrowserloadsthedocument.ThisisausefulcapabilityanddoesnotnormallyoverlapwiththecapabilitiesofJSP(whichrunsonlyontheserver).JSPpagesstillincludeSCRIPTtagsforJavaScript,justasnormalHTMLpagesdo.Infact,JSPcanevenbeusedtodynamicallygeneratetheJavaScriptthatwillbesenttotheclient.So,JavaScriptisnotacompetingtechnology;itisacomplementaryone.ItisalsopossibletouseJavaScriptontheserver,mostnotablyonSunONE(formerlyiPlanet),IIS,andBroadVisionservers.However,Javaismorepowerful,flexible,reliable,andportable.VersusWebMacroorVelocityJSPisbynomeansperfect.Manypeoplehavepointedoutfeaturesthatcouldbeimproved.Thisisagoodthing,andoneoftheadvantagesofJSPisthatthespecificationiscontrolledbyacommunitythatdrawsfrommanydifferentcompanies.So,thetechnologycanincorporateimprovementsinsuccessivereleases.However,somegroupshavedevelopedalternativeJava-basedtechnologiestotrytoaddressthesedeficiencies.This,inourjudgment,isamistake.Usingathird-partytoollikeApacheStrutsthataugmentsJSPandservlettechnologyisagoodideawhenthattooladdssufficientbenefittocompensatefortheadditionalcomplexity.ButusinganonstandardtoolthattriestoreplaceJSPisabadidea.Whenchoosingatechnology,youneedtoweighmanyfactors:standardization,portability,integration,industrysupport,andtechnicalfeatures.TheargumentsforJSPalternativeshavefocusedalmostexclusivelyonthetechnicalfeaturespart.Butportability,standardization,andintegrationarealsoveryimportant.Forexample,theservletandJSPspecificationsdefineastandarddirectorystructureforWebapplicationsandprovidestandardfiles(.warfiles)fordeployingWebapplications.AllJSP-compatibleserversmustsupportthesestandards.FilterscanbesetuptoapplytoanynumberofservletsorJSPpages,butnottononstandardresources.ThesamegoesforWebapplicationsecuritysettings.Besides,thetremendousindustrysupportforJSPandservlettechnologyresultsinimprovementsthatmitigatemanyofthecriticismsofJSP.Forexample,theJSPStandardTagLibraryandtheJSP2.0expressionlanguageaddresstwoofthemostwell-foundedcriticisms:thelackofgooditerationconstructsandthedifficultyofaccessingdynamicresultswithoutusingeitherexplicitJavacodeor~~~ ~~verbosejsp:useBeanelements.10.4MisconceptionsAboutJSPForgettingJSPIsServer-SideTechnologyHerearesometypicalquestionsMartyhasreceived(mostofthemrepeatedly).•OurserverisrunningJDK1.4.So,howdoIputaSwingcomponentinaJSPpage?•HowdoIputanimageintoaJSPpage?IdonotknowtheproperJavaI/Ocommandstoreadimagefiles.•SinceTomcatdoesnotsupportJavaScript,howdoImakeimagesthatarehighlightedwhentheusermovesthemouseoverthem?•OurclientsuseolderbrowsersthatdonotunderstandJSP.Whatshouldwedo?•Whenourclientsuse"ViewSource"inabrowser,howcanIpreventthemfromseeingtheJSPtags?Allofthesequestionsarebasedupontheassumptionthatbrowsersknowsomethingabouttheserver-sideprocess.Buttheydonot.Thus:•ForputtingappletswithSwingcomponentsintoWebpages,whatmattersisthebrowser"sJavaversion—theserver"sversionisirrelevant.IfthebrowsersupportstheJava2platform,youusethenormalAPPLET(orJavaplug-in)tagandwoulddosoevenifyouwereusingnon-Javatechnologyontheserver.•YoudonotneedJavaI/Otoreadimagefiles;youjustputtheimageinthedirectoryforWebresources(i.e.,twolevelsupfromWEB-INF/classes)andoutputanormalIMGtag.•Youcreateimagesthatchangeunderthemousebyusingclient-sideJavaScript,referencedwiththeSCRIPTtag;thisdoesnotchangejustbecausetheserverisusingJSP.•Browsersdonot"support"JSPatall—theymerelyseetheoutputoftheJSPpage.So,makesureyourJSPoutputsHTMLcompatiblewiththebrowser,justasyouwoulddowithstaticHTMLpages.•And,ofcourseyouneednotdoanythingtopreventclientsfromseeingJSPtags;thosetagsareprocessedontheserverandarenotpartoftheoutputthatissenttotheclient.ConfusingTranslationTimewithRequestTimeAJSPpageisconvertedintoaservlet.Theservletiscompiled,loadedintotheserver"smemory,initialized,andexecuted.Butwhichstephappenswhen?Toanswerthatquestion,remembertwo~~~ ~~points:•TheJSPpageistranslatedintoaservletandcompiledonlythefirsttimeitisaccessedafterhavingbeenmodified.•Loadingintomemory,initialization,andexecutionfollowthenormalrulesforservlets.Table1givessomecommonscenariosandtellswhetherornoteachstepoccursinthatscenario.Themostfrequentlymisunderstoodentriesarehighlighted.Whenreferringtothetable,notethatservletsresultingfromJSPpagesusethe_jspServicemethod(calledforbothGETandPOSTrequests),notdoGetordoPost.Also,forinitialization,theyusethejspInitmethod,nottheinitmethod.Table1.JSPOperationsinVariousScenarios JSPpagetranslatedintoservletServletcompiledServletloadedintoserver"smemoryjspInitcalled_jspServicecalledPagefirstwrittenRequest1YesYesYesYesYesRequest2NoNoNoNoYesServerrestartedRequest3NoNoYesYesYesRequest4NoNoNoNoYesPagemodifiedRequest5YesYesYesYesYesRequest6NoNoNoNoYes翻译资料译文JSP技术概述一、JSP的好处~~~ ~~JSP页面最终会转换成servler。因而,从根本上,JSP页面能够执行的任何任务都可以用servler来完成。然而,这种底层的等同性并不意味着servler和JSP页面对于所有的情况都等同适用。问题不在于技术的能力,而是二者在便利性、生产率和可维护性上的不同。毕竟,在特定平台上能够用Java编程语言完成的事情,同样可以用汇编语言来完成,但是选择哪种语言依旧十分重要。和单独使用servler相比,JSP提供下述好处:lJSP中HTML的编写与维护更为简单。JSP中可以使用常规的HTML:没有额外的反斜杠,没有额外的双引号,也没有暗含的Java语法。l能够使用标准的网站开发工具。即使对那些对JSP一无所知的HTML工具,我们也可以使用,因为它们会忽略JSP标签(JSPtags)。l可以对开发团队进行划分。Java程序员可以致力于动态代码。Web开发人员可以将经理集中在表示层(presentationlayer)上。对于大型的项目,这种划分极为重要。依据开发团队的大小,及项目的复杂程度,可以对静态HTML和动态内容进行弱分离(weakerseparation)和强分离(strongerseparation)。在此,这个讨论并不是让您停止使用servlets,只使用JSP。几乎所有的项目都会同时用到这两种技术。针对项目中的某些请求,您可能会在MVC构架下组合使用这两项技术。我们总是希望用适当的工具完成相对应的工作,仅仅是servlet并不能填满您的工具箱。二、JSP相对于竞争技术的优势许多年前,Marty受到邀请,参加一个有关软件技术的小型(20个人)研讨会.做在Marty旁边的人是JamesGosling---Java编程语言的发明者。隔几个位置,是来自华盛顿一家大型软件公司的高级经理。在讨论过程中,研讨会的主席提出了Jini的议题,这在当时是一项新的Java技术.主席向该经理询问他的想法.他继续说,他们会持续关注这项技术,如果这项技术变得流行起来,他们会遵循公司的“接受并扩充(embraceandextend)”的策略.此时,Gosling随意地插话说“你的意思其实就是不接受且不扩充(disgraceanddistend)。”在此,Gosling的抱怨显示出,他感到这个公司会从其他公司那里拿走技术,用于他们自己的目的.但你猜这次怎么样?这次鞋子穿在了另一只脚上。Java社团没有发明这一思想----将页面设计成由静态HTML和用特殊标签标记的动态代码混合组成.。ColdFusion多年前就已经这样做了。甚至ASP(来自于前述经理所在公司的一项产品)都在JSP出现之前推广了这种方式。实际上,JSP不只采用了这种通用概念,它甚至使用许多和ASP相同的特殊标签。~~~ ~~因此,问题变成:为什么使用JSP,而不使用其他技术呢?我们的第一反应是我们不是在争论所有的人应该做什么。其他这些技术中,有一些也很不错,在某些情况下也的确是合情合理的选择.然而,在其他情形中,JSP明显要更好一些。下面给出几个理由。与.NET和ActiveServerPages(ASP)相比.NET是Microsoft精心设计的一项技术。ASP.NET是与servlets和JSP直接竞争的技术。JSP的优势体现在两个方面。首先,JSP可以移植到多种操作系统和Web服务器,您不必仅仅局限于部署在Windows和IIS上尽管核心.NET平台可以在好几种非Windows平台上运行,但ASP这一部分不可以。您不能期望可以将重要的ASP.NET应用部署到多种服务器和操作系统。对于某些应用,这种差异没有什么影响。但有些应用,这种差异却非常重要。其次,对于某些应用,底层语言的选择至关重要。例如,尽管.NET的C#语言设计优良,且和Java类似,但熟悉核心C#语法和众多工具库的程序员很少。此外,许多开发者依旧使用最初版本的ASP。相对于这个版本,JSP在动态代码方面拥有明显的优势。使用JSP,动态部分是用Java编写的,而非VBScript过其他ASP专有的语言,因此JSP更为强劲,更适合于要求组件重用的复杂应用。当将JSP与之前版本的ColdFusion对比时,您可能会得到相同的结论。应用JSP,您可以使用Java编写“真正的代码”,不必依赖于特定的服务器产品。然而,当前版本的ColdFusion满足J2EE服务器的环境,允许开发者容易的混合使用ColdFusion和Servlet/JSP代码。与PHP相比PHP(“PHP:HypertextPreprocessor”的递归字母缩写词)是免费的、开放源代码的、HTML嵌入其中的脚本语言,与ASP和JSP都有某种程度的类似。JSP的一项优势是动态部分用Java编写,而Java已经在联网、数据库访问、分布式对象等方面拥有广泛的API,而PHP需要学习全新的、应用相对广泛的语言。JSP的第二项优势是,和PHP相比,JSP拥有极为广泛的工具和服务器提供商的支持。与纯Servlet相比原则上,JSP并没有提供Servlet不能完成的功能。实际上,JSP文档在后台被自动转换成Servlet。但是编写(和修改)常规的HTML,要比无数println语句生成HTML要方便得多。另外,通过将表示与内容分离,可以为不同的人分配不同的任务:网页设计人员使用熟悉的工具构建HTML,要么为Servlet程序员留出空间插入动态内容,要么通过XML标签间接调用动态内容。~~~ ~~这是否表示您只可以学习JSP,将Servlet丢到一边呢?当然不是!由于以下4种原因,JSP开发人员需要了解Servlet:(1)JSP页面会转换成Servlet。不了解Servlet就无法知道JSP如何工作。(2)JSP由静态HTML、专用的JSP标签和Java代码组成。哪种类型的Java代码呢?当然是Servlet代码!如果不了解Servlet编程,那么就无法编写这种代码。(3)一些任务用Servlet完成比用JSP来完成要好。JSP擅长生成由大量组织有序的结构化HTML或其他字符数据组成的页面。Servlet擅长生成二进制数据,构建结构多样的页面,以及执行输出很少或者没有输出的任务(比如重定向)。(4)有些任务更适合于组合使用Servlet和JSP来完成,而非单独使用Servlet或JSP。与JavaScript相比JavaScript和Java编程语言完全是两码事,前者一般用于在客户端动态生成HTML,在浏览器载入文档时构建网页的部分内容。这是一项有用的功能,一般与JSP的功能(只在服务器端运行)并不发生重叠。和常规HTML页面一样,JSP页面依旧可以包括用于JavaScript的SCRIPT标签。实际上,JSP甚至能够用来动态生成发送到客户端的JavaScript。因此,JavaScript不是一项竞争技术,它是一项补充技术。JavaScript也可以用在服务器端,最因人注意的是SUNONE(以前的iPlanet)、IIS和BroadVision服务器。然而,Java更为强大灵活、可靠且可移植。与WebMacro和Velocity相比JSP决非完美。许多人都曾指出过JSP中能够改进的功能。这是一件好事,JSP的优势之一是该规范由许多不同公司组成的社团控制。因此,在后续版本中,这项技术能够得到协调的改进。但是,一些组织已经开发出了基于Java的替代技术,试图弥补这些不足。据我们的判断,这样做是错误的。使用扩充JSP和Servlet技术的第三方工具,如ApacheStructs,是一种很好的思路,只要该工具带来的好处能够补偿工具带来的额外复杂性。但是,试图使用非标准的工具代替JSP则不理想。在选择一项技术时,需要权衡许多方面的因素:标准化、可移植性、集成性、行业支持和技术特性。对于JSP替代技术的争论几乎只是集中在技术特性上,而可移植性、标准化和集成性也十分重要。例如,Servlet和JSP规范为Web应用定义了一个标准的目录结构,并提供用于部署Web应用的标准文件(.war文件)。所有JSP兼容的服务器必须支持这些标准。我们可以建立过滤器作用到任意树木的Servlet和JSP页面上,但不能用于非标准资源。Web应用安全设置也同样如此。~~~ ~~此外,业界对JSP和Servlet技术的巨大支持使得这两项技术都有了巨大的进步,从而减轻了对JSP的许多批评。例如,JSP标准标签库和JSP2.0表达式语言解决了两种最广泛的批评:缺乏良好的迭代结构;不使用显式的Java代码或冗长的jsp:useBean元素难以访问动态结果。三、对JSP的误解忘记JSP技术是服务器端技术下面是Marty收到的一些典型问题(大部分问题不止一次的出现)。l我们的服务器正在运行JDK1.4。我如何将Swing组件用到JSP页面中呢?我如何将图像放到JSP页面中?我不知道读取图像文件应该使用哪些JavalI/O命令。Tomcat不支持JavaScript,当用户在图像上移动鼠标时,我如何使图像突出显示呢?ll我们的客户使用不理解JSP的旧浏览器。我应该怎么做?当我们的客户在浏览器中使用“ViewlSource”(查看源代码)时,如何阻止他们看到JSP标签?所有这些问题都基于浏览器对服务器端的过程在有所了解的假定之上。但事实上浏览器并不了解服务器端的过程。因此:l如果要将使用Swing组件的applet放到网页中,重要的是浏览器的Java版本,和服务器的Java版本无关。如果浏览器支持Java2平台,您可以使用正常的APPLET(或Java插件)标签,即使在服务器上使用了非Java技术也须如此。您不需要JavalI/O来读取图像文件,您只需将图像放在存储Web资源的目录中(即WEB-INF/classes向上两级的目录),并输出一个正常的IMG标签。l您应该用SCRIPT标签,使用客户端JavaScript创建在鼠标下会更改的图像,这不会由于服务器使用JSP而改变。l浏览器根本不“支持”JSP----它们看到的只是JSP页面的输出。因此,如同对待静态HTML页面一样,只需确保JSP输出的HTML与浏览器兼容。l当然,您不需要采取什么措施来阻止客户看到JSP标签,这些标签在服务器上进行处理,发送给客户的输出中并不出现。混淆转换期间和请求期间JSP页面需要转换成servlet。Servlet在编译后,载入到服务器的内容中,初始化并执行。但是每一步发生在什么时候呢?要回答这个问题,要记住以下两点:lJSP页面仅在修改后第一次被访问时,才会被转换成servlet并进行编译;l载入到内存中、初始化和执行遵循servlet的一般规则。~~~ ~~表1列出一些常见的情形,讲述在该种情况下每一步是否发生。最常被误解的项已经突出标示出来。在参考该表时,要注意,由JSP页面生成的servlet使用_jspService方法(GET和POST请求都调用该函数),不是doGet或doPost方法。同样,对于初始化,它们使用jspInit方法,而非init方法。表1各种情况下的JSP操作 将JSP页面转换成servlet编译Servlet 将Servlet载入到服务器内存中调用jspInit 调用_jspService页面初次创建请求1有有有有有请求2无无无无有服务器重启后请求3无无有有有请求4无无无无有页面修改后请求5有有有有有请求6无无无无有~~~