• 1.82 MB
  • 2022-04-22 13:43:47 发布

基于Web的信息系统毕业论文.doc

  • 43页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'基于Web的信息系统毕业论文目录目录1摘要1前言3第一章绪论41.1研究背景41.2设计目标41.3本文结构5第二章系统开发环境与技术62.1系统开发环境62.1.1MyEclipse插件介绍62.1.2Tomcat服务器介绍62.2系统开发技术72.2.1JSP与Servlet技术72.2.2JavaScript简介102.2.3MVC模式112.2.4Struts框架112.2.5Spring框架132.2.6Hibernate框架15第三章系统需求分析与前台设计173.1需求分析173.1.1系统前台简要设计概述173.1.2系统用例图183.2系统设计183.2.1系统层次划分183.2.2数据库设计193.2.3成本管理模块时序图22第四章系统详细设计与功能实现274.1系统项目的文件夹结构274.2成本管理模块的具体实现2843 4.2.1查询成本信息列表功能的实现284.2.2添加成本信息功能的实现334.2.3修改成本信息功能的实现364.2.4删除成本信息功能的实现394.2.5查看成本明细信息功能的实现41第五章总结与展望435.1课题总结435.2进一步开发的展望43参考文献44致谢45第一章绪论1.1研究背景当今时代信息技术飞速发展,人们已经处于数字化的生存空间之中。Internet构造了无限的信息资源,它的普遍使用已经从根本上改变了人们的生活方式和工作方式,也改变了企业的经营方式和服务方式。传统的人为管理模式已经远远无法满足现在的企业,那么企业对于企业管理系统的需求是必然的。通过管理系统,能够大大提高企业的各个方面效率,同时方便了企业与职工之间的交流,便于满足将来的业务需求。网络技术的迅猛发展使得基于Web的各类信息系统成为目前信息系统中最为流行的展现形式之一。基于Web的信息系统具有如下一些特点:(1)有利于信息的及时更新和发布;(2)便于操作和管理;(3)拥有良好的用户界面和接口;(4)灵活性和可扩展性;(5)系统功能的通用性;正是在这样的社会大背景下,我们开始进行“服饰生产企业生产状况联络表——成本管理”的课题研究,其目的在于通过网站的形式实现基于Web的信息系统的上述优点和特点,以展现该类信息系统在全球信息网——Internet网中快速、便捷、准确地发布信息,提供资源共享的强大功能和作用。43 成本管理可以帮助企业实现对成本更好的控制,透明的各项成本支出,长期积累下来的数据可以帮助企业对成本进行分析,以达到节约成本的目的。系统中的成本信息与负责人相关联,以达到可追溯的目的,使得企业对于成本管理做到可监控。1.2设计目标开发设计本系统的任务是管理该公司的成本信息,通过该系统能够让用户对成本信息查询、新增、修改和删除。开发系统的目标是对成本信息及其明细信息进行管理,满足的要求具体可包括如下几个方面:(1)网页风格符合企业员工的特点,简单实用。(2)能够实现对于成本信息的符合实际企业需求的管理。(3)网站运行安全稳定。1.3本文结构本文的章节安排如下:第一章绪论部分,说明本文的研究背景和设计目标。为接下来的系统后台的分析与设计做基础准备。第二章背景技术,简单介绍系统实现所用到的平台与技术。如MyEclipse、Tomcat服务器、JSP与Servlet原理、JavaScript、SSH(Struts-Spring-Hibernate)框架等。第三章系统分析与设计,对企业的门户网站的后台进行需求分析,根据需求分析设计相应的功能与表结构。第四章系统实现,给出系统后台的具体实现,包括实现效果和核心代码说明。第五章总结与展望,对本文所做的工作进行总结,并针对目前工作中的不足对未来工作的展望。43 第二章系统开发环境与技术2.1系统开发环境企业订单管理系统以Eclipse为开发平台,使用MyEclipse作为Eclipse的插件,并由Tomcat6.0充当Web服务器来开发实现的。2.1.1MyEclipse插件介绍MyEclipse是一个商业软件(商业插件)、基于Java和Eclipse的可扩展开发平台(比如MSVisualStudio开发平台中的VC、VB等。Borland公司的Delphi、Borland、C++、Builder)。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。虽然大多数用户很乐于将MyEclipse当做JavaIDE(IntegratedDevelopmentEnvironment)来使用,但MyEclipse的目标并不仅限于此。MyEclipse还包括插件开发环境(Plug-inDevelopmentEnvironment-PDE),当然,这个功能的实现主要是Eclipse,这个组件主要针对希望扩展Eclipse核心的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于Java开发工具。尽管Eclipse是使用Java语言开发的,但它的用途并不限于Java语言。例如:支持诸如C/C++、COBOL和Eiffel及Perl等编程语言的插件。MyEclipse是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试及除错。程序功能包括:HTML智能编辑器、Struts、JSF、CSS、JavaScript、SQL、Hibernate、Spring等,带有自动完成与语法高亮显示功能的J2EE编辑器。在Eclipse中安装这个插件可以大大提高开发J2EE的效率。2.1.2Tomcat服务器介绍Tomcat是一个免费开源的Servlet容器,它是Apache软件基金会(ApacheSoftwareFoundation)Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat7支持最新的Servlet3.0和JSP2.2规范。Tomcat不仅是一个Servlet容器,它也具有传统的Web服务器的功能,如处理HTML页面,简单的域名管理,配置JNDI等。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java43 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行Tomcat时,它实际上作为一个与Apache独立的进程单独运行的。这里的诀窍是,当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。2.2系统开发技术服饰企业生产状况联络表系统的开发技术是基于J2EE架构的SSH组合技术。开发平台是Eclipse,以MyEclipse作为插件,Tomcat6.0作为服务器,JDK1.6.0_13作为工具包。2.2.1JSP与Servlet技术JSP技术是建立在Servlet技术之上的。先有Servlet技术,后推出的JSP技术。JSP最终要编译为Servlet运行。进行Web应用开发的时候,结合Servlet和JSP能够使开发的分工和层次更加清晰。JSP注重于页面的呈现,处理逻辑应该尽量减少,这样方便网页设计人员在美工上多下功夫:Servlet程序则侧重于对逻辑的控制,根据需要对JSP页面进行导航。Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。Servlet位于Web服务器内部,由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。JSP(JavaServerPages)是一种动态网页技术标准,是基于JavaServlet和整个Java体系的Web开发技术。它在动态网页的建设中有着强大而特别的功能,它的以下优点使很多人认为它将是最有发展前途的动态网页技术[3]。(1)将内容的生成和显示进行分离用JSP技术,Web页面开发人员可以使用HTML或者XML43 标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容。Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的生成。(1)采用标识Web页面开发人员不会都是熟悉脚本语言的编程人员。JSP技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。JSP的执行流程是这样的:第一个用户请求JSP文件的时候,JSP容器(如Tomcat)把JSP文件转换成Java文件(Servlet类文件),然后编译成class文件,常驻内存;当有客户请求的时候,直接开一个线程,无须重新编译,直接执行第一次已经编译好的class文件,速度比每次都要重新编译JSP文件要快的多。2.2.1.1JSP的工作原理JSP页面以扩展名为JSP的纯文本文件的形式存在服务器上,当服务器接收到客户端对某个JSP页面的请求时,如果这是对该页面创建或修改后的第一次请求时,那么JSP引擎就把该JSP页面内容转换成一个纯Java语言的Servlet源码,然后将其编译成Servlet字节代码,最后将Servlet的执行结果返回至浏览器。JSP页面被编译成Servlet之后,其执行代码以独立线程的形式一直存在服务器的内存中,以后对该JSP页面提出请求时,不需要重新编译,直到该页面被修改或WEB应用程序重新启动。其工作原理如图2-2所示。图2-2JSP的工作原理2.2.1.2JSP技术语法(1)常用JSP命令:43 1)page---页面指令,主要用来指定当前JSP页面的属性。2)---允许包含其他动态和静态文件。3)---将一个JSP文件传给另一个JSP文件。4)---可以通过Java插件在浏览器中运行JavaApplet。5)---标记是用来访问JavaBean的动作标记。当JSP页面使用标记时,表示将引用一个JavaBean的实例。JavaBean标记的语法格式如下:。(1)JSP内置对象[6]:为了方便Web页面的开发,JSP提供了一些内置的对象。这些内置对象可以不经显式声明而在程序中直接使用,JSP的几个主要内置对象有Request、Response、Session、Out。通过这些内置对象,可以实现页面的一些基本的请求输入、输出功能,且可实现数据在页面之间的交互。本系统主要用到的有以下几个对象[4]:1)Request对象:主要功能是接受客户端以HTTP方式传送的数据,使服务器端的应用程序可以根据这些数据做进一步的信息处理,实现与客户进行交互的功能。一般常用的是它的getParameter(Stringname)这个方法来获取传递的参数。其接口为javax.servlet.http.HttpServletRequest。2)Response对象:主要功能是用来对客户的请求做出响应,与Request对象对应的就是Response对象。Response对象用于将服务器的数据发送到客户端,输出的数据可以是各种数据类型,甚至是文件。一般经常用到的是它的sendRedirect(URLurl)这个方法来重定向当前用户访问的url。Response对象的接口为javax.servlet.http.HttpServletResponse。3)Session对象:主要功能用来保存每个用户在会话期间的数据信息,这样就方便了会话处理工作。当用户登录网站时,系统将为其生成一个独一无二的session对象,用以记录该用户的个人信息,一旦该用户退出网站,那么这个session对象将会注销。Session对象可以绑定若干个人信息或Java对象。Session对象的接口为javax.servlet.http.HttpServletSession。4)Out对象:主要功能是用于动态地向客户端输出数据信息,其主要作用是在Web浏览器内输出信息。这个对象使用比较频繁,在数据的输出方面经常用到它的println(parameter)这个方法。同时,它也是进行纠错处理时一个比较有效的输出方法。2.2.2JavaScript简介JavaScript43 是适应动态网页制作的需要而诞生的一种新的编程语言,如今越来越广泛地使用于Internet网页制作上。JavaScript是由Netscape公司开发的一种脚本语言(scriptinglanguage),或者称为描述语言。在HTML基础上,使用JavaScript可以开发交互式Web网页。JavaScript的出现使得网页和用户之间实现了一种实时性的、动态的、交互性的关系,使网页包含更多活跃的元素和更加精彩的内容。JavaScript短小精悍,又是在客户机上执行的,大大提高了网页的浏览速度和交互能力。同时它又是专门为制作Web网页而量身定做的一种简单的编程语言。JavaScript加入网页有两种办法[7]:1.直接加入HTML文档这是最常用的方法,大部分含有JavaScript的网页都采用这种方法,如:用来告诉浏览器这是用JavaScript编写的程序,需要调动相应的解释程序进行解释。HTML的注释标签:用来去掉浏览器所不能识别的JavaScript源代码的,这对不支持Javascript语言的浏览器来说是很有用的。//-Javascript结束:双斜杠表示JavaScript的注释部分,即从//开始到行尾的字符都被忽略。的位置并不是固定的,可以包含在或中的任何地方。2.引用方式:如果已经存在一个JavaScript源文件(以js为扩展名),则可以采用这种引用的方式,以提高程序代码的利用率。其基本格式如下:其中的url就是程序文件的地址。同样的,这样的语句可以放在HTML文档头部或主体的任何部分。如果要实现“直接插入方式”中所举例子的效果,可以首先创建一个JavaScript源代码文件“Script.js”,其内容如下:document.writeln("这是Javascript!采用直接插入的方法!")。在网页中可以这样调用程序:2.2.3MVC模式43 MVC即Model-View-Controller,M代表业务逻辑,V代表视图,C代表控制层。通过使用MVC模式就把软件层次分为三个层:模型层、视图层、控制层[1]。模型(Model)层:也就是软件业务的实现部分。一个软件有什么功能,它如何实现功能,这些功能之间的联系都是在模型层进行处理的。可以这样说,模型层是一个软件的核心,软件功能的好坏、软件功能是否完善,业务层起到了决定性的作用。视图(View)层:就是用户能看到的并与之交互的界面。在J2EE技术中,常用的表示层技术主要由JSP、JSF、Freemarker等组成。视图向用户显示相关的数据,并能接受用户的输入数据,但是它不能进行任何实际的业务处理。视图还可以接受模型发出来的数据更新事件,从而对用户界面进行同步更新。控制(Controller)层:Struts中的控制层和Servlet的功能功能一模一样,就是调用业务层,然后进行视图的切换。控制层几乎不做任何与业务有关的事情,比如登录验证这些。所以在软件的分层结构设计中,控制层的代码量几乎是最少的,但它的作用也是非常重要的。通过将模型、视图与控制层的分离,各个层之间的联系非常少,但这样做的好处是,控制层可以随意的切换到自己想要展示的页面,然后控制层调用业务逻辑层和持久化保存数据层,来实现软件的功能,再转回到控制层,最后将最终的结果显示到视图层,这实际上是一种模型的变化——传播机制。模型、视图、控制层三者之间的关系和各自的主要功能如图2-1所示。模型封装应用程序状态响应状态查询应用程序功能通知视图改变图2-1MVC组件关系和功能2.2.4Struts框架Struts已经提供了一个非常好的MVC框架,利用Struts开发MVC系统时可以大大加快开发速度。在开发时可以采用的开发流程如下。(1)收集和定义应用需求。43 (1)基于数据采集和显示的原则定义和开发用户界面的需求。(2)为每一个用户界面JSP文件定义访问路径。(3)定义ActionMapping建立应用业务逻辑之间的联系。(4)开发满足用户界面需求的所有支持对象。(5)基于每一个用户界面需求提供的数据属性来创建对应的ActionForm对象。(6)开发被ActionMapping调用的Action对象。(7)开发应用业务逻辑对象(Bean、EJB等)。(8)对应ActionMapping设计的流程创建JSP页面。(9)建立合适的配置文件struts-config.xml、web.xml。(10)开发/测试/部署。利用Sruts开发MVC流程,如图2-2所示。图2-2Struts框架MVC流程图在使用Struts框架时,对应各个部分的具体开发工作主要包括一下部分。Model部分:采用JavaBean或EJB组件或Spring的Bean,设计和实现系统的业务逻辑。根据不同的请求从Action派生具体Action处理对象。完成“做什么”的任务来调用由Bean构成的业务组件。创建由ActionForm的派生类实现对客户端表单数据的封装及简单的校验。Controller部分:Struts为我们提供了核心控制部分的实现。只需要配置ActionMapping对象即可完成URI地址的映射及匹配用户界面表单和ActionForm类的对应关系。View部分:为了使用Model中的ActionForm对象,必须用Struts提供的自定义标记创建HTML表单。利用Struts提供的自定义标记库编写用户界面,把应用逻辑和显示逻辑分离。Struts框架通过这些自定义标记建立了View和Model之间的联系。Struts的自定义标记还提供了很多定制页面的功能。同时,需要编辑两个配置文件:web.xml和struts-config.xml。通过它们配置Struts系统中的各个模块之间的交互。图2-2描述了一个Struts应用程序的简要执行流程。(1)客户端浏览器发出请求。43 (1)服务器端的Struts中心类ActionServlet找到struts-config.xml文件,并放入到内存,将文件中的内容作为请求路径映射。(2)ActionServlet类在struts-config.xml文件中找到相关的请求路径映射后填充ActionForm类,将前台传进来的表单域打包成Bean。(3)然后转到Action类进行业务逻辑功能的实现,比如增、删、改、查数据库中的数据。(4)再通过struts-config.xml文件的映射,找到功能逻辑处理结束后显示给客户端用户看到的页面,转发功能通过ActionForward对象实现。由图2-2“Struts框架MVC流程图”结构来看,Struts框架可以将软件的功能进行分层化,这样可以将精通不同技术的人员工作模块化、分工化。比如精通UI用户界面设计的可以只管View视图层,而精通Java程序设计的程序员可以开发Model层的代码。2.2.5Spring框架Spring框架是一个开放源代码的轻量级Java框架。主要作用是为了解决企业应用程序维护的复杂性而创建的。Spring框架的解决办法就是用分层架构,分层架构允许程序员选择使用哪一个组件,同时为J2EE应用程序开发提供集成的容器。Spring框架就是实现了AOP功能的IOC容器。在IOC容器的基础上加入AOP不仅可以做到松耦合开发,还具有面向切面编程的功能。Spring2.0七大模块的架构,如图2-3所示。图2-3Spring架构组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:SpringCore:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。SpringContext:SpringContext是一个配置文件,向Spring框架提供上下文信息。SpringContext包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。SpringAOP:通过配置管理特性,SpringAOP43 模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。SpringAOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用SpringAOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。SpringDAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。SpringDAO的面向JDBC的异常遵从通用的DAO异常层次结构。SpringORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQLMap。所有这些都遵从Spring的通用事务和DAO异常层次结构。SpringWeb模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与JakartaStruts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。SpringWebMVC:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring框架中是IOC容器)负责将这些联系在一起。在典型的IOC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了IOC的一个实现模式。类型1服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如,需要的附加服务)类型2通过JavaBean的属性(例如setter方法)分配依赖性类型3依赖性以构造函数的形式提供,不以JavaBean属性的形式公开Spring框架的IOC容器采用类型2和类型3实现。面向方面的编程,即AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。43 AOP和IOC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和Java类中才能实现日志功能。在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用SpringAOP编写的应用程序代码是松散耦合的。AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。Spring设计的核心是org.springframework.beans包,它的设计目标是与JavaBean组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是BeanFactory接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory也可以管理对象之间的关系。BeanFactory支持两个对象模型。(1)单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton是默认的也是最常用的对象模型。对于无状态服务对象很理想。(2)原型模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。bean工厂的概念是Spring作为IOC容器的基础。IOC将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring框架使用JavaBean属性和配置数据来指出必须设置的依赖关系。2.2.6Hibernate框架Hibernate是目前最流行的ORM框架,其采用非常优雅的方式将SQL操作完全包装成对象化的操作。其作者GavinKing在持久层设计上极富经验,采用非常少的代码实现了整个框架,同时完全开放源代码,即使偶尔遇到无法理解的情况,也可以参照源代码来理解其在持久层上灵巧而智能的设计。目前Hibernate在国内的开发人员相当多,Hibernate的文档也非常丰富,这些都为学习Hibernate铺平了道路,因而Hibernate的学习相对简单一些。下面通过对比来了解Hibernate和传统JDBC操作数据库持久层之间的差异。当前的软件开发语言已经全面转向面向对象,而数据库系统仍停留在关系数据库阶段。面对复杂的企业环境,同时使用面向对象语言和关系数据库是相当麻烦的,不但中间的过度难以理解,而且其开发周期也相当长。Hibernate是一个面向Java环境的对象/关系数据库映射工具(Object/RelationalMapping),用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。43 Hibernate的目标是:释放开发者通常的数据持久化相关的变成任务的95%。对于以数据为中心的程序而言,往往在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案。但对于那些基于Java的中间件应用中,设计采用面向对象的业务模型和商业逻辑时,Hibernate是最有用的。不管怎样,Hibernate能消除那些针对特定数据库厂商的SQL代码,并且把结果集由表格式的形式转换成值对象的形式。Hibernate不仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度地减少在开发时人工使用SQL和JDBC处理数据的时间。Hibernate能在众多的ORM框架中脱颖而出,因为Hibernate与其他ORM框架对比具有如下优势。(1)开源和免费的License,方便需要是研究源代码、改写源代码并进行功能定制。(2)轻量级封装,避免引入过多复杂的问题,调试容易,减轻程序员负担。(3)具有可扩展性,API开放。功能不够用时,可以自己编码进行扩展。(4)开发者活跃,产品有稳定的发展保障。43 第三章系统需求分析与前台设计3.1需求分析根据软件开发过程的要求,在技术实现可行性确定的基础上,我们首先要进行的是系统流程的分析。需求分析就是描述系统的需求情况。结合用户的需求,本模块是用于服装企业的成本管理,对成本信息进行添加,删除,修改以及查询等一系列的操作。本系统主要应有如下要求:l网页风格符合企业员工的特点,简单实用。l符合企业实际的成本管理方式。l要求完成成本信息相关的所有基本操作,包括添加、删除、修改以及查询等操作。l要求能够上传与成本相关的文件,方便以后的查找管理。3.1.1系统前台简要设计概述该成本管理系统主要是针对服装企业的,其成本管理模块的前台主要能完成以下功能:(1)在用户登录之后,选择成本管理中的成本明细维护,能够看到自己权限范围内的所有成本信息。(2)用户可以使用多字段,查询自己需要查询的成本信息,并可以点击查看该成本信息的详细内容(3)除了查询功能外,用户还必须能够对已有的成本信息进行修改。(4)用户可以添加新的成本信息。(5)对于添加错误的成本信息,可以进行对其进行删除操作,但删除操作可以不单独列出一个界面,直接从显示列表和数据库中删除即可。图3-1表示前台页面主菜单结构图:图3-1前台页面主菜单43 3.1.2系统用例图图3-2成本管理模块用例图3.2系统设计3.2.1系统层次划分该系统模块中,模块系统共分为五层,分别为表现层、控制层、业务逻辑层、数据访问层,数据层,如图3-2所示。图3-3网站模块分层表现层中,系统主要采用了JSP技术,将Action传递过来的数据封装在ActionForm中,进行一定的处理之后,再反馈给前台页面。控制层主要是为了控制协调系统中各模块的执行流程,在控制层中,Struts中的ActionServlet控制系统流程转向。43 业务逻辑层,主要采用Javabean,来实现具体系统的业务逻辑处理。数据访问层,主要是采用Hibernate持久层方案,通过Hibernate封装对数据层的操作,方便于在不同的数据库系统间移植。Hibernate也采用了面向对象的思想来操作数据库。数据层存放系统中的数据,本系统采用MySQL数据库。3.2.2数据库设计数据库就是存放数据的仓库,即数据按照一定的规律存放在计算机中,是信息系统的核心和基础,是信息系统开发和建设的重要组成部分,把信息系统中大量的数据按一定的模型组织起来,提供存储、维护、检索数据的功能,使信息系统可以方便、及时、准确地从数据库中获得所需的信息。数据库设计是信息资源管理最有效的手段,数据库设计就是根据具体的应用环境,构造合理数据库模式,建立数据库逻辑结构,有效存储数据,满足用户实际需求和系统应用处理要求。在动态网站设计中数据库的重要性不言而喻。合理地设计数据库结构可以提高系统运行的效率。如果设计不当,查询起来就非常吃力,程序的性能也会受到影响[2]。数据库的设计一般主要包括两个部分:l对网站系统的设计进行需求分析,确定所需要在数据库中保存的信息。l确定每个表的字段属性等数据库信息。根据系统设计和业务逻辑分析,与我所做模块连接比较紧密的数据表有:lUSER表lSINGLE_MATERIAL_BILL表lSINGLE_MATERIAL_BILL_ITEM表lSTYLE_COMPONENT表如表3-1所示,该表为USER表结构,用于保存登录用户的信息。表3-1USER表序号列名数据类型长度标识主键允许空说明1user_idbigint20是是否自增长2COMP_IDbigint20是3emailvarchar255是电子邮箱4faxvarchar255是传真5moblie_phonevarchar255是手机6cnamevarchar255是中文名7name_engvarchar255是8phonevarchar255是电话9remarkvarchar255是备注43 10statusvarchar255是状态11user_personal_idvarchar255是12user_pwdvarchar255是密码13employeevarchar255是是否为雇员14user_namevarchar255是登录名15createbybigint20是创建人ID16createDatedatetime是创建日期17expireDatedatetime是到期日期18effectiveDatedatetime是有效日期19addressvarchar255是地址20dept_idbigint20是部门ID21canEditPlanvarchar1否如表3-2所示,该表为SINGLE_MATERIAL_BILL表结构,用于保存成本明细信息,不包括各成本子项明细信息。表3-2SINGLE_MATERIAL_BILL表序号列名数据类型长度主键允许空说明1single_material_bill_idbigint20是否自增长2approve_by_idbigint20是审拟人1ID3approve_datedatetime是审拟日期4contact_idbigint20是合同ID5contact_billvarchar255是6createby_idbigint20是创建人ID7create_datedatetime是创建日期8due_datedatetime是交货日期9nation_idbigint20是外销地区ID10single_material_bill_novarchar255是编号11numberdouble是数量12style_idbigint20是款号13update_datedatetime是修改日期14specification_from_idbigint20是15specification_to_idbigint20是16amountdouble是总额17styleNamevarchar500是款式18imgvarchar100是上传文件路径19specification_term1varchar100是规格项120specification_term2varchar100是规格项221specification_term3varchar100是规格项343 22specification_term4varchar100是规格项423approve_by_id2bigint20是审拟人2ID24issimplevarchar255是是否为简单成本管理标记25bar_codevarchar255是26comments_shvarchar255是27componentvarchar255是28grammevarchar255是如表3-3所示,该表为SINGLE_MATERIAL_BILL_ITEM表结构,用于保存各成本子项明细信息。表3-3SINGLE_MATERIAL_BILL_ITEM表序号列名数据类型长度小数位主键允许空说明1single_material_bill_item_idbigint20是否自增长2cloth_component_idbigint20是3material_idbigint20是材料ID4quantity_per_clothdouble是用料5materialpricedouble是单价6materialamountdouble是金额7materialunitvarchar255是单位8isamountvarchar255是9single_material_bill_idbigint20是10item_indexbigint20是11FK_ONEbigint20是12embroiderdouble153是利润率13stardatedate是时间14sequencevarchar5是序号15colorgongjiaodouble153是16fullindexvarchar40是17isGongJiaovarchar45是是否为工缴18supplymaterialvarchar45是供货19spoilvarchar45是损耗20widthvarchar45是门幅21remarkvarchar100是备注43 如表3-4所示,该表为STYLE_COMPONENT表结构,用于保存各成本子项配置信息。表3-4STYLE_COMPONENT表序号列名数据类型长度标识主键允许空说明1style_component_idbigint20是是否自增长2createby_idbigint20是创建人3create_datedatetime是创建日期4descriptionvarchar255是描述5style_component_namevarchar255是成本子项名称6style_component_novarchar255是成本子项NO7update_datedatetime是更新日期8accessoryvarchar255是9build_invarchar255是10remark_textvarchar4是是否显示备注3.2.3成本管理模块时序图3.2.3.1查询成本信息列表时序图如图3-4所示,该图为查询成本信息列表时序图。图3-4查询成本信息列表时序图具体步骤如下:1.用户单击成本维护界面右侧的查询按钮时,Struts的ActionForward通过struts-config.xml的配置转发至Cost_Ma.jsp页面。2.43 用户填完新的成本信息后单击提交按钮时,Struts会通过struts-config.xml的配置调用CostDetailAction类的queryMa()方法。1.CostDetailAction类的queryMa()调用SingleMaterialProcessImpl类的getSingleMaterialBillsByTerm()方法。2.调用SingleMaterialBillDAOImplHibernate类的findSingleMaterialBillByTerm()方法。3.调用HibernateTemplate类的find()方法。4.返回成本信息列表。3.2.3.2添加成本信息时序图如图3-5所示,该图为添加成本信息时序图。图3-5添加成本信息时序图具体步骤如下:1.用户单击成本维护界面右侧的添加按钮时,Struts的ActionForward通过struts-config.xml的配置转发至Cost_Add.jsp页面。2.用户填完新的成本信息后单击提交按钮时,Struts会通过struts-config.xml的配置调用CostDetailAction类的submitSingleMaterialBill()方法。3.CostDetailAction类的submitSingleMaterialBill()调用SingleMaterialProcessImpl类的createSingleMaterialBill()方法。4.调用SingleMaterialBillDAOImplHibernate类的saveSingleMaterialBill()方法。5.调用HibernateTemplate类的save()方法。6.返回“添加成功”信息。43 3.2.3.3修改成本信息列表时序图如图3-6所示,该图为修改成本明细信息时序图。图3-6修改成本明细信息时序图具体步骤如下:1.用户单击成本信息列表右侧的编辑按钮时,Struts的ActionForward通过struts-config.xml的配置转发至Cost_Add.jsp页面。2.用户将成本信息修改完成后单击提交按钮时,Struts会通过struts-config.xml的配置调用CostDetailAction类的submitSingleMaterialBill()方法。3.CostDetailAction类的submitSingleMaterialBill()首先调用SingleMaterialProcessImpl类的dellSingleMaterialBill()方法删除原先的成本数据。4.调用SingleMaterialBillDAOImplHibernate类的delSingleMaterialBill()方法。5.调用HibernateTemplate类的delete()方法。6.返回至CostDetailAction类的submitSingleMaterialBill()方法。7.CostDetailAction类的submitSingleMaterialBill()然后调用SingleMaterialProcessImpl类的createSingleMaterialBill()方法添加修改后的成本数据。8.调用SingleMaterialBillDAOImplHibernate类的saveSingleMaterialBill()方法。9.调用HibernateTemplate类的save()方法。10.返回“修改成功”信息。43 3.2.3.4删除成本信息时序图如图3-7所示,该图为删除成本信息时序图。图3-7删除成本信息时序图具体步骤如下:1.用户单击成本维护界面右侧的删除按钮时,Struts的ActionForward通过struts-config.xml的配置转发至Cost_Ma.jsp页面。2.Struts会通过struts-config.xml的配置调用CostDetailAction类的dell()方法。3.CostDetailAction类的submitSingleMaterialBill()调用SingleMaterialProcessImpl类的dellSingleMaterialBill()方法。4.调用SingleMaterialBillDAOImplHibernate类的delSingleMaterialBill()方法。5.调用HibernateTemplate类的delete()方法。6.返回“删除成功”信息。3.2.3.5查看成本明细信息列表时序图如图3-8所示,该图为查看成本明细信息时序图。43 图3-8查看成本明细信息时序图具体步骤如下:1.用户单击成本信息列表上的编号超链接时,Struts的ActionForward通过struts-config.xml的配置转发至Cost_View.jsp页面。2.Struts会通过struts-config.xml的配置调用CostDetailAction类的toView()方法。3.CostDetailAction类的toView()方法调用SingleMaterialProcessImpl类的getSingleMaterialBillById()方法。4.调用SingleMaterialBillDAOImplHibernate类的getSingleMaterialBillById()方法。5.调用HibernateTemplate类的find()方法。6.查询数据库,返回成本明细信息。43 第四章系统详细设计与功能实现4.1系统项目的文件夹结构在编写代码之前,通常先将框架所需要的文件夹先创建出来(例如:创建各个框架层次用到的代码文件分开存放,如bean、dao等),这样不但可以方便以后的开发工作,也可以实现框架的规范化。在服饰企业生产状况联络表系统中,设计了如图4.1所示的文件夹结构图。图4-1文件夹的架构几个重要的文件夹:(1)bean:用于存放各数据表所对应的类文件。(2)dao:用于存放各种操作数据库的类及接口文件。(3)exception:存放各种异常文件。(4)resources:存放几种资源文件便于国际化。(5)service:存放解决业务逻辑的类及接口文件。(6)struts:存放控制类Action和ActionForm类文件。(7)util:存放常用的bean文件,便于引用(8)WEB-INF43 :该目录用来存储与Web应用程序相关的元信息。这些资源可以被Web应用程序中的Servlet和JSP页面访问到。在该目录下一般存放下面这些内容:1)classes目录:用来存放Java类文件,包括被编译后的Servlet文件等。此外,还可以存放一些配置文件,该目录是Web应用程序的上下文类路径。Java程序在寻找自身引用的其他类文件时,会搜索该目录下的Java文件。2)lib目录:该目录用来存放Web应用程序中需要引用的库文件,这些库文件打包为jar文件。该目录也是Web应用程序的上下文类路径。Java程序在寻找自身引用的其他类文件时也会搜索该目录。3)web.xml文件:该文件称为Web应用程序部署描述符,是Web应用程序的配置文件,用于在应用程序开发人员、部署人员和集成人员之间传递配置信息。Web容器启动的时候,会使用该文件中的配置内容来加载应用程序。该文件中可以进行如下配置:会话配置、Servlet声明、Servlet映射、过滤器定义与映射、错误页、标记库映射等。4.2成本管理模块的具体实现4.2.1查询成本信息列表功能的实现当用户登录之后,点击成本管理->成本明细维护,自动查询出该登录用户曾经添加过的所有成本明细信息列表,分页显示每页显示50条记录,如图4-2所示。图4-2成本明细维护界面用户可以输入编号、合同号、外销地区、款号、审拟人以及交货日期这六个查询条件进行查询。例如输入交货日期为2011-05-13,单击右边的查询按钮,可以查询出符合条件的成本信息列表。如图4-3所示。43 图4-3查询成本信息列表具体实现流程如下:登录到服饰企业生产状况联络表系统后,点击成本管理à成本明细维护超链接,其地址为http://localhost:8080/haofeng/costDetailAction.do?method=queryMa,由此,Tomcat会到struts-config.xml配置文件中查找path=”/costDetailAction”的Action。由type=”org.springframework.web.struts.DelegatingActionProxy”可见此处Struts使用了Spring的代理模式。要想查找到对应的Action,则必须通过到Spring的配置文件ApplicationContext.xml中查找,我们将成本管理相关的配置文件写到config/Cost.xml中,然后在ApplicationContext.xml通过引用文件。在Cost.xml中加入配置文件。上段配置文件中,我们可以看到,bean下有三个property分别为purchaseBo、singleMaterialProcess、orderProcess。CostDetailAction类中有三个属性变量purchaseBo、singleMaterialProcess、orderProcess,通过bean标签的子标签property来对这三个属性变量进行注入。注入的值来源于property标签的ref属性,ref属性中的值是applicationContext.xml配置文件中的bean的id值,以singleMaterialProcess为例,ref中的值关联如下bean。43 PROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIRED在IOC容器的帮助下,就可以实现松耦合,并且模块之间是分离的,互相可以共享的。CostDetailAction类中可以直接使用这三个接口,而不需要实例化他们的实现类,再去使用它们。CostDetailAction类中,queryMa()方法用于显示成本信息列表,核心代码如下:publicfinalActionForwardqueryMa(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){try{Userps=(User)request.getSession().getAttribute("USER");request.getSession().removeAttribute("consttoQuery");CostDetailFormsingleMaterialBillForm=(CostDetailForm)form;HashMapmap=newHashMap();map.put("singleMaterialBillNo",singleMaterialBillForm.getSingleMaterialBillNo());map.put("nation",singleMaterialBillForm.getNation());map.put("contactNo",singleMaterialBillForm.getContactNo());map.put("dueDate",singleMaterialBillForm.getDueDate());map.put("approveByName",singleMaterialBillForm.getApproveByName());map.put("createByName",""+ps.getId());map.put("styleNo",singleMaterialBillForm.getStyleNo());MyPaginatedListmyPaginatedList=newMyPaginatedList(50,request,0,null);myPaginatedList=singleMaterialProcess.getSingleMaterialBillsByTerm(myPaginatedList,map);request.setAttribute("myPaginatedList",myPaginatedList);}catch(Exceptione){}returnmapping.findForward("toMa");}首先获取当前登录用户43 的User对象,使用getId()方法获取ID,作为筛选依据,使得查询出来的结果为当前用户所创建。将用户输入的查询条件等信息存入到CostDetailForm的对象singleMaterialBillForm中,通过其get()方法获取查询条件。新建一个HashMap对象map,将查询条件存入到map中,用于从数据库中筛选数据。查询数据时调用了singleMaterialProcess的getSingleMaterialBillsByTerm()方法,核心代码如下:publicMyPaginatedListgetSingleMaterialBillsByTerm(MyPaginatedListmyPaginatedList,HashMapmap)throwsObjectNotFoundException,DataBaseException{Listl=null;l=singleMaterialBillDAO.findSingleMaterialBillByTerm(map,(myPaginatedList.getPageNumber()-1)*myPaginatedList.getObjectsPerPage(),myPaginatedList.getObjectsPerPage());intfullSize=singleMaterialBillDAO.findSingleMaterialBillNumByTerm(map);myPaginatedList.setList(l);myPaginatedList.setFullListSize(fullSize);returnmyPaginatedList;}该函数主要调用了两个方法完成分页显示功能,其中之一是singleMaterialBillDAO的findSingleMaterialBillByTerm()用来显示请求页的成本信息列表。核心代码如下:publicListfindSingleMaterialBillByTerm(Mapmap,finalintfirstResult,finalintmaxResults)throwsObjectNotFoundException,DataBaseException{Listl=null;finalStringBufferhql=newStringBuffer(512);hql.append("fromSingleMaterialBillassingleMaterialBill");hql.append("leftjoinfetchsingleMaterialBill.nationn");hql.append("leftjoinfetchsingleMaterialBill.stylestyle");hql.append("leftjoinfetchsingleMaterialBill.approveByapproveBy");hql.append("leftjoinfetchsingleMaterialBill.createBycreateBy");hql.append(getFindTerm(map));l=getHibernateTemplate().executeFind(newHibernateCallback(){publicObjectdoInHibernate(Sessions)throwsHibernateException,SQLException{Queryquery=s.createQuery(hql.toString());query.setFirstResult(firstResult);query.setMaxResults(maxResults);Listlist=query.list();returnlist;}43 });returnl;}编写HQL语句,对数据库进行查询,调用getHibernateTemplate()的executeFind()方法返回成本信息List。函数中调用了getFindTerm(map)方法,用于增加Where查询条件,返回Where子句,部分核心代码如下:privateStringgetFindTerm(Mapmap){finalStringBufferfindTerm=newStringBuffer(512);findTerm.append("");if(null!=map.get("no")&&!"".equals(map.get("no").toString()))findTerm.append("singleMaterialBill.no=""+map.get("no").toString()+""");if(null!=map.get("contactNo")&&!"".equals(map.get("contactNo").toString())){if(!"".equals(findTerm.toString())){findTerm.append("and");}findTerm.append("singleMaterialBill.contact.scNolike"%"+map.get("contactNo")+"%"");}if(!"".equals(findTerm.toString())){findTerm.insert(0,"where");}returnfindTerm.toString();}用于完成分页显示功能的另外一个方法是singleMaterialBillDAO的findSingleMaterialBillNumByTerm()用来获取成本信息的总条数。代码如下:publicintfindSingleMaterialBillNumByTerm(Mapmap)throwsObjectNotFoundException,DataBaseException{finalStringBufferhql=newStringBuffer(512);hql.append("selectcount(*)fromSingleMaterialBillassingleMaterialBill");hql.append(getFindTerm(map));try{Listl=getHibernateTemplate().find(hql.toString());if(l.size()==0){thrownewObjectNotFoundException("donotfindanysingleMaterialBillacordingtotheterm");}43 Objecto=(Object)l.get(0);returnInteger.parseInt(o.toString());}catch(DataAccessExceptione){thrownewDataBaseException("ErrorincreateanewsingleMaterialBillintablesingle_material_bill");}}将查询出来的结果放到myPaginatedList分页列表里,使用request.setAttribute()进行保存,用于前台显示查询结果。显示列表使用的是分页列表控件,代码如下:4.2.2添加成本信息功能的实现进入成本明细维护界面,用户单击成本维护界面右侧的添加按钮,进入增加成本界面。如图4-4所示。图4-4增加成本界面用户将各项成本明细项填写完成后,单击提交按钮,提示“增加成功”信息,如图4-5所示。图4-5“增加成功”提示信息具体实现流程如下:43 增加成本的信息分为三个部分:位于增加成本信息窗口的最上面一栏的基础信息,如编号、合同号、外销地区、规格、款号、款式、数量、交货日期以及上传的文件等。核心代码如下:CostDetailFormsingleMaterialBillForm=(CostDetailForm)form;SingleMaterialBillsingleMaterialBill=newSingleMaterialBill();singleMaterialBill.setStyleName(singleMaterialBillForm.getStyleName());if(null!=singleMaterialBillForm.getContactId()&&!singleMaterialBillForm.getContactId().equals(""))singleMaterialBill.setContact(orderProcess.queryOrders(singleMaterialBillForm.getContactId()));singleMaterialBill.setPicturePath(singleMaterialBillForm.getImg());singleMaterialBill.setDueDate(DateUtil.dateParseslanting(singleMaterialBillForm.getDueDate()));singleMaterialBill.setNumber(StringUtil.parseLong(singleMaterialBillForm.getNumber()));if(null!=singleMaterialBillForm.getApproveById()&&!singleMaterialBillForm.getApproveById().equals(""))singleMaterialBill.setApproveBy(orderProcess.findIdUser(singleMaterialBillForm.getApproveById()));使用singleMaterialBill的set()方法将成本明细信息中的编号、合同号等内容保存到singleMaterialBill的属性中。位于增加成本信息中间一栏的为使用的材料信息,包括类别、供货、名称、单位、利润率。用料、门幅、损耗、单价可以分次记录,最多可以分4次记录,系统可自动计算每次记录的金额。核心代码如下:for(inti=0;i