J2EE技术实验报告基于SSH的轿车信息管理系统

上传人:无*** 文档编号:141499407 上传时间:2022-08-24 格式:DOC 页数:48 大小:1.67MB
返回 下载 相关 举报
J2EE技术实验报告基于SSH的轿车信息管理系统_第1页
第1页 / 共48页
J2EE技术实验报告基于SSH的轿车信息管理系统_第2页
第2页 / 共48页
J2EE技术实验报告基于SSH的轿车信息管理系统_第3页
第3页 / 共48页
点击查看更多>>
资源描述
J2EE技术实验报告项目题目: 基于SSH的轿车信息管理系统 学 院: 计算机学院 指 导 教 师: 项 目 成 员: 专 业: 软件工程 班 级: 软件0901 完 成 时 间: 2012-06-02 目 录1引言12核心技术简介22.1MVC模式简介22.2Struts2框架简介32.2.1Struts2架构42.2.2Struts2基本处理流程52.2.3Struts2的优点62.3Hibernate框架简介62.3.1Hibernate架构62.3.2Hibernate核心接口72.3.3Hibernate基本处理流程72.3.4Hibernate的优点72.4Spring框架简介82.4.1Spring架构82.4.2Spring特点93轿车信息管理系统需求分析103.1任务概述103.2用户特点103.3功能需求103.4界面需求113.5操作需求113.6输入输出需求114轿车信息管理系统概要设计124.1设计思想124.2总体设计124.3系统层次结构图134.4接口设计134.5数据库设计134.6出错处理设计145轿车信息管理系统详细设计165.1数据库详细设计165.1.1数据库关系模型设计165.1.2数据库物理结构设计165.2轿车管理系统模块详细设计175.2.1用户登陆模块175.2.2用户首页面模块185.2.3添加汽车模块185.2.4删除汽车模块195.2.5查询汽车模块205.2.6修改汽车模块205.2.7出售汽车模块215.2.8总销售查询模块225.2.9按时间查询模块226轿车信息管理系统具体实现246.1开发与运行环境246.2开发环境的搭建246.3数据库系统实现306.4DAO层实现346.5Manager层实现356.6Action层实现366.7汽车信息查询模块实现366.1按时间查询模块实现386.2系统其它模块的实现417总结448参考文献451 引言近年来随着人均收入水平的提高,人们购车的能力也逐步提升。为了方便轿车销售企业对己方轿车管理,轿车销售管理系统成了轿车市场一个不可或缺的管理软件。一个好的管理软件能提高企业的管理效率,减轻企业统计人员的工作量。同时随着近年来企业Java的发展,使得开发一个针对企业需求的软件系统变得简单。因此使用企业Java来开发一个轿车信息管理系统,是行之有效的。2 核心技术简介Struts2,Spring,Hibernate是三个相互独立的框架。但三个框架一起整合起来使用,能使软件系统开发更轻松、更灵活、更容易扩展。三者都是“半成品”框架,使得我们在开发时不需要从头做起。三者之间的关系如图2-1:图2-1 Struts2,Spring,Hibernate关系图121.1 MVC模式简介MVC全称Model View Controller,它使得应用程序的输入、处理和输出分开,使程序的耦合度降低。其每个层次说明如下: Model(模型):模型表示业务相关的数据与业务的处理方法。能直接访问数据。 View(视图):视图用于对数据的显示。在这一层上,通常没有逻辑。为了更新视图,视图需要访问它监视的模型,因此视图通常事先在被监视的数据那进行注册。 Controller(控制器):顾名思义,控制器起到控制作用,用于控制应用程序的流程。它处理事件并作出响应,调用相关的模型去处理事件请求,确定哪个视图返回请求。图2-2 MVC各层关系图图2-2显示的MVC各层之间的关系。由于它具有这些结构使得多个视图可以共有一个模型,同时对一层上的修改不会影响到其他层。1.2 Struts2框架简介Struts2是一个在WebWork的基础上转化而来的基于MVC的框架。采用拦截器的机制来处理用户请求,使得业务逻辑控制器与Servlet API实现分离。122.12.21.1.1 Struts2架构图2-3 Struts2架构图2-3 展示了Struts2的整体架构,其各模块说明如下: FilterDispatcher:它是Strut2的核心控制器。它根据ActionMapper的结果来决定对请求的处理和响应。 ActionMapper:它是一个接口,并提供了HTTP请求与Action之间的映射关系。如果用户的请求与ActionMapper中提供的方法相匹配,就继续调用ActionProxy。 ActionProxy:它会依据ActionMapper生成的URI以及配置管理器来找到响应用户请求的Action对象。然后创建ActionInvocation对象来执行相应的Action方法。 ActionInvocation:它会在调用Action处理方法的前后,还要调用各种拦截器。 Result:它会根据相关视图将用户请求的处理结果反馈给用户。 struts.xml:是Struts2的配置文件,负责配置每个Action的返回结果所对应的跳转页面。 Interceptor:拦截器是Struts2的重要组件,其设计思想来源于AOP(面向切面编程)。通常用于处理某些通用的处理,它会在每个Action的外部执行。 Action:用于处理用户请求并封装业务数据。其执行后通常会返回一个String类型的量,struts.xml根据这个量来决定跳转页面。 Templates:页面模板。 Tag Subsystem:Struts2的标签库,用于页面的设置。1.1.2 Struts2基本处理流程图2-4 Struts2基本处理流程图2-4展示了Struts2基本处理流程,用户请求在经过一系列拦截器(拦截器会对用户请求进行相应的处理,如增加某些功能)后,就会交由Action处理,然后Action返回响应的结果(默认为“input”),最后通过匹配结果来选择跳转视图页面。1.1.3 Struts2的优点 “半成品”框架:使得开发不需要从头做起,而且在框架中很多地方都有默认值设置,减少了冗余的设置,提高了开发效率。 轻量级:资源消耗少,运行速度快。 搭建简单:只需在Myeclipse中将需要的包拷贝入项目中,再进行配置。 标签强大:Struts2提供了一系列的自己编写的标签用于页面布置,减少了页面代码。 Action测试简单:不需要模拟HTTP对象,就可以直接测试。 错误报告明了:便于迅速找出错误并修改。1.3 Hibernate框架简介Hibernate是一个开放源码的对象关系映射框架,采用ORM机制,通常用于持久层的开发。它对JDBC进行了轻量级的封装,使得我们在开发过程中可以使用面向对象的方式来操纵数据库。1.1.1 Hibernate架构图2-5 Hibernate架构1.1.2 Hibernate核心接口Hibernate核心接口一共有6个: Session接口:该接口用于持久化对象的增、查、删、该,属于非线程安全。 SessionFactory接口:该接口用于初始化Hibernate,充当数据存储源的代理,并创建Session对象。 Configuration接口:该接口在Hibernate的启动时,首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口:用于事务操作。 Query和Criteria接口:使用HQL或SQL语句查询数据库。其中Criteria接口更靠近面向对象;Query接口则提供了使用原生SQL语句的方法。1.1.3 Hibernate基本处理流程1. 创建Configuration实例,读取项目路径根目录下的配置文件信息。2. 创建SessionFactory实例,将Configuration中的配置信息复制到SessionFactory中。3. 调用SessionFactory来创建Session4. 打开Session,并创建事务Transaction5. 进行持久化操作6. 提交事务7. 关闭Session8. 关闭SessionFactory1.1.4 Hibernate的优点 它使得数据库中的每一张表都映射为一个Java类,让我们在开发过程中可以使用面向对象的方式来操作数据库。 自动配置,我们只需在数据库中建立表,然后通过Myeclipse自带的工具就能完成映射。 它封装了对各种数据库的操作 轻量级框架,映射灵活,数据库表、配置文件、映射类我们只需要完成其中任何一部分就能依靠工具完成三者的关系映射。1.4 Spring框架简介Spring框架致力于J2EE应用各层的解决方案,贯穿表现层、业务层、持久层。同时它是一个轻量级的框架,没有侵入性,不会改变原有框架的类容。使用它的目的不是去修改原有框架,而是使用它来管理,使得原有的框架工作得更好。1.1.1 Spring架构图2-6 Spring架构图2-6为Spring的架构,每个模块功能如下: 核心容器:提供Spring框架的基本功能。其主要组件是BeanFactory,采用IOC(控制反转)将应用程序的配置与依赖性代码分开。 Spring上下文:是一个配置文件,用于提供上下文信息。 Spring AOP:该模块直接将面向方面的编程功能集成到了Spring 框架中。支持声明式的事务管理。 Spring DAO:该模块用于管理异常处理和不同数据库供应商抛出的错误消息。 Spring ORM:提供了如Hibernate这类ORM 的对象关系工具。 Spring Web:为基于 Web 的应用程序提供了上下文,简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC框架:该框架中融入了大量视图技术。1.1.2 Spring特点 轻量级框架:占用资源少,非侵入性。 控制反转(IOC):使得本来需要我们(应用程序)在执行前要进行的new操作,交由Spring的IOC容器来管理,在容器中进行配置,再由容器来将new好的对象注入应用程序,从而松散了耦合度。 面向切面(AOP):通常我们的编程思路是至上而下的,Spring的AOP使得我们能横向考虑问题,例如事务与日志记录。3 轿车信息管理系统需求分析1.1 任务概述轿车信息管理系统用户企业管理轿车的销售情况,除了基本的查询、添加功能外,还应有统计功能。同时操作方面应尽量简单。1.2 用户特点1) 系统管理员:该用户拥有最高权限,可以对轿车的信息修改,查看销售情况。2) 前台销售员:该用户仅用查看轿车基本信息(不包括成本价),以及成功出售一辆轿车后的出售操作1.3 功能需求除了基本的查询、添加功能外,还应有统计销售功能,以及分段查询功能。功能需求图如下图3-1所示:图3-1 系统功能需求各模块具体说明如下:1) 用户登陆:用户输入合法的用户名和密码完成登陆,如果用户名或密码错误,应输出提示。2) 登陆页面:显示当前用户的权限,以及相关功能连接。3) 车辆管理:提供基本的车辆增、查、删、改功能,以及出售车辆操作。同时增加相应错误判断。4) 业务管理:提供总销售统计查询,以及根据时间段的查询。同时提供相应的错误判断。1.4 界面需求界面简洁美观。1.5 操作需求操作简洁,符合人们通常使用习惯。1.6 输入输出需求要求输入数据合法,如果非法会跳出出错提示。4 轿车信息管理系统概要设计1.1 设计思想该轿车管理系统用于轿车基本的增、查、删、改、出售以及统计功能。能够方便企业对自己的轿车进行管理,它将具有以下特点: 运行速度快 占用资源少 界面简洁 操作简单1.2 总体设计1) 以用户登陆后的界面为平台,将各模块功能放于该页面2) 采用SSH框架3) 灵活性要求:视图与业务逻辑分开,低耦合。采取接口方式编程便于系统的维护以及移植。4) 输入输出要求:要求输入数据合法,如果非法会跳出出错提示。1.3 系统层次结构图图4-1 系统层次结构图1.4 接口设计用户接口:通过鼠标与键盘操作。内部接口:使用数据流提供的接口操作各个模块。1.5 数据库设计概念结构设计是指将需求分析得到的用户需求抽象为信息结构。描述概念模型的有力工具是E-R模型。本系统E-R图如下图所示:图4-2 用户E-R图图4-3 轿车销售E-R图1.6 出错处理设计1) 以下列出了可能的错误情况及其对应的错误信息:2) 用户名或密码有误,提示:您输入的用户名或密码有误,请重新输入。3) 新增车辆在数据库中已经存在,提示:您录入的车名-型号,在数据库中已经存在,如果要修改,请到修改页面。4) 新增车辆的售价小于成本,提示:您输入的售价小于成本。5) 出售数量大于库存数量,提示:您出售的车名-型号,出售数量大于库存数量6) 按时间查询时起始日期大于截止日期,提示:您输入的起始日期大于截止日期5 轿车信息管理系统详细设计本报告将对轿车系统的数据库与各模块进行详细设计。1.1 数据库详细设计1.1.1 数据库关系模型设计E-R图向关系模型转换:一个实体型转换为一个关系模式,实体的属性即为关系模式的属性,实体的标识符即为关系模式的键。根据图4-2与图4-3,本系统的关系模型为:1) 用户(用户ID,用户名,密码,权限);2) 轿车(轿车ID,车名,型号,数量,售价,成本);3) 销售表(销售ID,轿车ID,销售日期,销售数量)。1.1.2 数据库物理结构设计数据库的物理设计是将一个给定逻辑结构实施到具体的环境中,逻辑数据模型要选取一个具体的工作环境,这个工作环境提供了数据存储结构与存取方法。经过分析设计给出了各主要表的物理结构:users表,用于存取用户信息,其设计如下:类型长度是否允许空值主键/外键user_idint8NO主键usernamevarchar20NOpasswordvarchar20NOlevelint1NO表5-1car表,用于存取轿车基本信息,其设计如下:列名类型长度是否允许空值主键/外键car_idint8NO主键carnamevarchar20NOcartypevarchar20NOamountint8NOin_priceint8NOsell_priceint8NO表5-2sell表,用于存取销售情况,其设计如下:列名类型长度是否允许空值主键/外键sell_idint8NO主键car_idint8NO外键sell_amountint8NOsell_datedate-NO表5-31.2 轿车管理系统模块详细设计1.1.1 用户登陆模块模块功能:用户输入正确的用户名密码后跳转到相应页面,若用户名或密码有误,输出提示流程图:图5-11.1.2 用户首页面模块模块功能:显示当前用户权限,展示相应功能连接流程图:图5-21.1.3 添加汽车模块模块功能:将用户输入的轿车信息保存到数据库中。流程图:图5-31.1.4 删除汽车模块模块功能:通过下拉框选择汽车的型号与名字,点击删除按钮对汽车删除。流程图:图5-41.1.5 查询汽车模块模块功能:通过下拉框选择汽车的型号与名字,点击查询按钮查询轿车信息。流程图:图5-51.1.6 修改汽车模块模块功能:依据输入的汽车信息修改相应汽车的信息流程图:图5-61.1.7 出售汽车模块模块功能:用户选择要出售的汽车,输入出售数量,提交出售,如果出售数量大于库存数量,输出错误提示流程图:图5-71.1.8 总销售查询模块模块功能:输出总的销售结果流程图:图5-81.1.9 按时间查询模块模块功能:依据用户选择的时间段来查询该段时间的销售情况流程图:图5-96 轿车信息管理系统具体实现6.1 开发与运行环境 操作系统:Win7 内存:2G 硬盘空间:500G 开发软件:Myeclipse 10,Microsoft Sql Server 2008,Java 6.0 ,Tomcat6.0 框架版本:Struts 2.1,Hibernate 3.0,Spring 3.06.2 开发环境的搭建新建一个Web项目名为CIMS(Car Infomation Management System),选择使用Java6.0,如图6-1:图6-1添加Struts2相关支持包,如图6-2图6-2在Meclipse的数据库视图中增加cardb配置,如图6-3:图6-3添加Spring相关包,除了默认的包以外,还应选上Spring Web Liberaies 3.0,如图6-4:图6-4添加Hibernate支持包,除了原有包外,将最后4个包也加入,如图6-5图6-5Hibernate Configuration选择Spring Configuration file,因为三大框架整合之后由Spring来管理所有的Bean,所以Hibernate的配置文件也由Spring的applicationContext.xml文件来管理,点击下一步;选择Existing Spring Configuration file,点击下一步;选择数据库为cardb,注意方言为SQL Server;不建立SessionFactory,完成;在web.xml中添加如下代码; contextConfigLocation/WEB-INF/classes/applicationContext.xml org.springframework.web.context.ContextLoaderListener struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter encodingUTF-8 struts2 /* 6.3 数据库系统实现users表car表sell表其中sell表中的外键请安如下方式添加:数据库映射到项目中,注意ID的生成方式选择native最后的项目中将会有如下映射类:6.4 DAO层实现DAO(Data Access Object)是用于访问数据的对象,在使用时,我们在DAO中定义访问其对应数据对象的接口方法,业务层通过DAO操作数据,这样避免了直接在业务层使用持久层的技术。DAO以及DAO实现的项目结构如下图所示:在使用前,需要在Spring的配置文件中添加如下配置:org.hibernate.dialect.SQLServerDialectcom/cims/domain/Users.hbm.xmlcom/cims/domain/Sell.hbm.xmlcom/cims/domain/Car.hbm.xml在本系统中绝大多数DAO实现使用getHibernateTemplate()模板来操作数据库,因为该模板是线程安全的。例子:Overridepublic Car findCarByNameAndType(String carname, String cartype) List l= getHibernateTemplate().find(from Car +where car_name=+carname+ and car_type=+cartype+);if(l.size()=1)return (Car)l.get(0);return null; 从中可以看出Hibernate处理数据库的优势,它使用了对象的方式来对数据库的表操作。而且我们不需要编写最底层的SQL语句,而是直接使用它提供的方法。但Hibernate的模板提供的方法似乎不支持一些数据库中的默认函数,因此本系统一些地方还使用了Session来使用原生SQL语句。例子:Overridepublic List findCarName() return getSession().createSQLQuery(select +distinct car_name from Car).list();该方法主要是用于得到数据库中的汽车名字,并且过滤掉重复的部分。6.5 Manager层实现在Action中通过Manager对DAO接口进行调用,首先将需要对用到的DAO实例化,采用Spring的依赖注入方式将实例化的DAO注入到Action中。具体调用示例如下:Overridepublic void saveSell(Car car, int sellamount) Calendar c=Calendar.getInstance();car.setAmount(car.getAmount()-sellamount);Sell sell=new Sell();sell.setCar(car);sell.setSellAmount(sellamount);sell.setSellDate(c.getTime().toLocaleString();sellDAO.saveSell(sell);carDAO.update(car);前后省略了sellDAO,carDAO的定义以及set方法。该方法用于保存一条销售信息。在Spring的配置文件中需要添加如下代码:可以理解为我们以前在Action执行的CarDAO cardio=new CarDAOImpl();语句。不过由于Spring的控制反转与依赖注入,使得我们将这个工作交给了Spring框架来完成6.6 Action层实现Action用于返回一个Stirng类型字符串,来选择跳转页面。其主要的配置在struts.xml这个文件中,例子如下:/pages/sellManager/sellCarResult.jsp/pages/sellManager/willSellCarInfo.jsp6.7 汽车信息查询模块实现该模块实现界面如下:首先会根据数据库中汽车信息生成一个查询选择页面;用户选择好查询车辆后,显示查询结果;下面是该模块的具体实现过程:查询页面用到了一个Struts2的标签该标签有2个主要参数list对应第一个下拉选框,它的值由数据库中的汽车名称决定;doubleList对应第二个下拉选框,它的值对应第一个选框中的汽车名称所对应的型号;其生成Action的主要代码如下:public String execute() throws Exception nameTotype=carManager.carNameToType();carname=new ArrayList();carname.add(所有);carname.addAll(carManager.carName();return SUCCESS;public List getCartype() ValueStack stack = ServletActionContext.getValueStack( ServletActionContext.getRequest() );Object name = stack.findValue( top );if( name!=null & name instanceof String ) return nameTotype.get( (String)name );return Collections.EMPTY_LIST;execute()方法中的carname是一个List对象,用于存放所有的汽车名称,对应中的list。nameTotype是个MapString,List类型对象,用来存放汽车名称与型号的对应。getCartype()方法依据栈顶元素来选择对应的汽车型号的list。它的返回值对应于中的doubleList。在Spring的配置文件中需要注入carManager1.1 按时间查询模块实现该模块的具体实现页面如下:首先生成一个选择查询时间的页面,其中年份会依据数据库中的所有年份来生成选择时间段都输出查询统计结果如果选择的起始时间大于截止时间会报错具体实现过程如下:Action中主要方法如下Overridepublic String execute() throws Exception if(beginYear=-1)sellList=sellManager.findAllSellInfo();else if(beginYearendYear)setMsg(您选择的起始年份:+beginYear+,大于截止年份:+endYear);return INPUT;else if(beginYear=endYear)if(beginMonthendMonth)setMsg(您选择的起始月份:+beginMonth+,小于截止月份:+endMonth);return INPUT;sellList=sellManager.findSellInfoByDate(beginYear, beginMonth, endYear, endMonth);elsesellList=sellManager.findSellInfoByDate(beginYear, beginMonth, endYear, endMonth);setMsg();profit=sellManager.totalProfit(sellList);totalSell=sellManager.totalSells(sellList);beginYear=-1;return SUCCESS;其中默认给beginYear赋值为-1,用于处理用户选择总销售情况时的查询。其余情况下如果时间合法则调用sellManager中的相关方法来获取销售的信息。需要在Spring的配置文件中添加如下代码:findSellInfoByDate()方法会根据输入的4个参数来生成查询sell表的SQL语句,其中用了很的判断来处理输入时间。分别判断了如下条件:1) 起止年份相同2) 起始年份小于截止年份其主要代码如下:public List findSellInfoByDate(int beginYear, int beginMonth,int endYear, int endMonth) List sellList=new ArrayList();String date=null;for(int i=beginYear;i=endYear;i+)if(i=endYear&i=beginYear)for(int j=beginMonth;j=endMonth;j+)date=+i+-%+j+-%;sellList.addAll(sellDAO.findSellInfoByDate(date);else if(i!=endYear)for(int j=beginMonth;j=12;j+)date=+i+-%+j+-%;sellList.addAll(sellDAO.findSellInfoByDate(date);elsefor(int j=1;j=endMonth;j+)date=+i+-%+j+-%;sellList.addAll(sellDAO.findSellInfoByDate(date);for(int i=0;isellList.size();i+)Car car=carDAO.get(sellList.get(i).getCar().getCarId();sellList.get(i).setCar(car);return sellList;1.2 系统其它模块的实现系统其它模块的实现比较简单,在这里不再赘述。需要注意的是在Spring的配置文件中我添加了如下的事务代理代码:创建一个事务管理器,它需要依赖注入sessionFactory对象PROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIRED创建事务拦截器,需要依赖注入事务管理器,其中第一了事务的传播属性。由于get开头的方法用于查看数据,因此给了它readOnly的属性。userManagercarManagersellManagertransactionInterceptor为userManager,carManager,sellManager创建事务代理。由于有些操作涉及多表,比如我的sell保存操作,一方面它保存了一条记录到sell表中,另一方面它更新了car表中的amount列的数据。如果不用事务来处理,可能会出现sell表中有数据了,但car表中数据却没更新,使得数据库中的数据域实际数据不相符合。7 总结这个轿车信息管理系统虽然比较简单,但在完成这个系统后,让我对SSH这套框架有了更深入的了解。下面总结下我对这套框架的学习体会:首先这三个框架都是“半成品”框架,使得我在开发的时候不需要从头开始,一定程度上减少了开发工作量。对于Struts2,这个框架,他具有很强大的标签功能,在开发页面时,非常轻松,并且也使得页面代码比较简洁。但它的标签页有不足的地方,比如我在使用标签时,如果我的中的其他表格超过了2列,整个中的结构就会错位。去查了它的源代码后,发现Struts2在前后默认添加了,这使得在页面上使用时它会独立一行,并且无法设置合并列的属性。对于Hibernate,它对数据库的映射确实很强大。经过它的映射,所有的表都成为了一个Java对象。并且使用它自带的模板来对数据库处理也非常方便,我不需要再去编写底层的SQL语言,而且模板还是线程安全的。但它的模板也有点缺点,模板不能很好的支持数据库自带一些函数,要使用带函数的sql只能使用session。对于Spring,其实整个系统,可以不用Spring,也能完成需求。但为什么我还是加入了Spring,因为用它来管理Bean与Action,能让其它的2个框架跟好的工作起来。通过它的IOC与依赖注入机制,很好地实现了系统的松耦合。以上是我对SSH这套框架的认识。8 参考文献Eclipse,Struts,Hibernate,Spring集成开发宝典 电子工业出版社 成天河等编著
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!