第8章 JSP MVC编程电子课件_第1页
第8章 JSP MVC编程电子课件_第2页
第8章 JSP MVC编程电子课件_第3页
第8章 JSP MVC编程电子课件_第4页
第8章 JSP MVC编程电子课件_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

JSP开发案例教程第8章JSP

MVC编程本章内容概述:MVC编程模式简介案例ch8.2_goods:商品管理系统8.18.2小结与练习8.4练习案例:商品分类管理、用户管理8.3PARTONE8.1MVC编程模式简介8.1.1MVC编程模式概述4MVC编程模式,即Model-View-Controller(模型-视图-控制器)模式,用于应用程序的分层开发,其运行模式如图8-1所示。模型Model,代表数据对象和业务规则,它通常带有业务逻辑,在数据变化时能通知视图进行更新。视图View,代表模型所包含数据的可视化。控制器Controller,作用于模型和视图,它接收视图提交的请求,将数据流向模型对象,并在数据变化时可选择相应视图。它使视图与模型实现了代码分离。概念图8-1MVC的运行模式目的:将M和V实现代码分离,从而使同一个程序可以使用不同的表现形式。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。8.1.2MVC编程模式的优点5快速的部署MVC分层简化了分组开发,不同的开发人员可分别开发视图、控制器和业务逻辑,也让应用程序的测试更加容易。低耦合性视图层和业务层分离,允许只更改视图层代码而不用重新编译模型和控制器代码;更改一个应用的业务流程或者业务规则,通常只需改变MVC的模型层即可。123456高重用性和可适用性采用不同的方式来访问应用程序。较低的生命周期成本MVC使开发和维护用户接口的技术含量降低。可维护性分离视图层和业务逻辑层使Web应用更易于维护和升级。有利于软件工程化管理由于不同的层、不同的文件各司其职,每一层中不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。8.1.3MVC编程在JSP中的体现6JSP编程中的MVC,可简单理解成模型M对应JavaBean,视图V对应JSP页面,控制器C对应Servlet,三者间的层次关系如图8-2所示。图8-2MVC中的层次关系Model通常由JavaBean来充当,实体类、业务逻辑、数据操作等都在Model中实现。JSP页面作为视图层,即表现层,负责收集用户请求,将应用的处理结果、消息等呈现给用户。Servlet可充当控制器角色,它的作用类似于调度员:将用户请求发送给Servlet,Servlet调用Model来处理用户请求,并交由JSP页来呈现结果。PARTTWO8.2案例ch8.2_goods:商品管理系统8.2案例ch8.2_goods8工作流程图

在MySQLWorkbench中创建数据库db_goods包和文件夹的功能说明样式文件JSP标准标签库JSTL简介页头header.jsp和页脚footer.jsp用户登录商品平铺式列表页商品列表页商品图片管理页商品详情页商品详情–商品图片管理页新添商品的输入页新添商品的执行修改商品的输入页修改商品的执行删除商品主要内容:8.2.1工作流程图9图8-3商品管理系统的工作流程图商品管理系统的主要功能有用户登录、用户管理、商品管理、分类管理等。系统的工作流程图如图8-3所示。角色独特功能通用功能管理员admin全部管理功能在登录之后都能注销登录、查看和修改用户自己的个人信息普通用户user商品管理

和分类管理访客guest10项目的文件列表如图8-4至8-6所示。可以看到,分类type、用户user的相关文件与商品goods的相应文件类似。图8-4项目文件列表图8-5包src/main/java中的文件列表图8-6JSP等文件列表8.2.1工作流程图8.2.2在MySQLWorkbench中

创建数据库db_goods11商品管理系统数据库数据表db_goodstb_usertb_typetb_goods12表tb_user的字段和数据,与案例ch7.2_student(学生管理系统)中的tb_user表一致,只是密码password字段的值采用的是MD5“加密”后的值(为32个字符)。字段名数据类型字段说明userIdINT(11)用户ID。主键,非空,自增长usernameVARCHAR(45)用户名。值唯一passwordVARCHAR(45)密码。32位的MD5值realNameVARCHAR(45)真实姓名roleVARCHAR(5)用户角色。管理员admin,普通用户user,注册用户guesttimeRenewDATETIME更新时间。默认值为当前系统时间CURRENT_TIMESTAMP,即now()8.2.2在MySQLWorkbench中

创建数据库db_goods13表tb_type的字段和数据情况如表8-1以及如图8-7、8-8所示。字段名数据类型字段说明typeIdINT(11)分类ID。主键,非空,自增长typeNameVARCHAR(45)分类名称。值唯一noteVARCHAR(2000)备注timeRenewDATETIME更新时间。默认值为当前系统时间CURRENT_TIMESTAMP,即now()表8-1数据表tb_type的字段图8-7商品分类表tb_user的字段图8-8商品分类表tb_user中的数据8.2.2在MySQLWorkbench中

创建数据库db_goods14表tb_goods中的字段和数据情况如表8-2以及如图8-9、8-10所示。其中字段typeId和typeName的值源自于表tb_type。表8-1数据表tb_goods的字段图8-9商品表tb_goods的字段图8-10商品表tb_goods中的数据字段名数据类型字段说明goodsIdINT(11)商品ID。主键,非空,自增长goodsNoVARCHAR(45)商品编码。值唯一goodsNameVARCHAR(45)商品名称typeIdINT分类IDtypeNameVARCHAR(45)分类名称priceFLOAT价格stockINT库存数量timeSaleDATETIME开始销售时间imageVARCHAR(45)商品图片的文件名detailVARCHAR(10000)商品简介timeRenewDATETIME更新时间。默认值为当前时间CURRENT_TIMESTAMP8.2.2在MySQLWorkbench中

创建数据库db_goods8.2.3包和文件夹的功能说明15导入素材Web项目ch8.2_goods_Ex。项目的包src/main/java中有10个子包:bean、dao、service、servlet_*(6个)和util,这些包按照用途用于存放相应JavaBean类或Servlet类的Java文件,如图8-5所示。这些包的用途和所包含的类如表8-3所示。图8-5包src/main/java中的文件列表16包名类的用途包含的类及功能说明bean实体类3个实体类Goods、Type和User,在DAO层、Service层、Servlet层和JSP页面中有应用dao数据访问层实现数据的增、删、改、查操作(1)数据操作类Db,响应DAO层的调用,对数据库中的数据执行查询和更新操作,返回操作结果给DAO层(2)数据访问类GoodsDao、TypeDao和UserDao,响应Service层的请求,调用Db类中的方法,实现数据记录的增删改查操作,返回结果给Service层service业务逻辑层实现业务处理业务处理类GoodsImageService、GoodsService、LoginService、TypeService和UserService,对Servlet层传递来的表单数据或URL参数进行获取和校验,调用DAO层的方法实现数据的处理,完成业务处理后将实体类对象存入request,将结果反馈给Servlet层servlet_*控制器层转发页面请求给业务逻辑层,根据反馈进行页面跳转servlet_*包总共有6个,每个包中有若干Servlet类(1)servlet_goods、servlet_type和servlet_user中的Servlet类,先进行用户权限验证,然后将页面请求转发给Service层,根据Service层处理的结果重定向或转发到相应JSP页面(2)servlet_image中的Servlet类,调用GoodsImageService中的方法实现商品图片的显示、上传或删除(3)servlet_login中的Servlet类,调用LoginService中的方法,实现登录验证和注销登录(4)servlet_verifyCode中的Servlet类,直接生成图片验证码util权限检查,

MD5“加密”(1)类LoginCheck中的静态方法检查用户是否登录,查验用户的角色级别是否足够(2)类MD5中的静态方法getMd5(),根据请求的字符串参数,生成32位摘要值(32个字符)并返回表8-3包src/main/java中的包8.2.3包和文件夹的功能说明17文件夹src/main/webapp的及其子文件夹按照用途存放相应页面的*.jsp文件和其他辅助文件,这些子文件夹的用途和所包含的文件如表8-4所示。文件夹子文件说明子文件列表根目录系统基础功能的相关页面首页index.jsp、登录页login.jsp、用户功能页main.jsp、页头header.jsp和页脚footer.jspgoods商品管理的相关页面文件列表list、详情show、新添add和修改edit商品图片上传页goodsImageUpload.jsp平铺式商品列表页goodsListLayout.jsp能管理商品图片的商品详情页goodsShowImageRenew.jsptype分类管理的相关页面文件列表list、详情show、新添add和修改edituser用户管理的相关页面文件列表list、详情show、新添add和修改edit用户注册页register.jspcss页面的外部样式文件css.css用于常规页面cssGoodsListLayout.css用于平铺式列表页goodsListLayout.jspcssHeaderFooter.css用于页头header.jsp、页脚footer.jspfileUpload上传的文件fileUpload/goodsImage存放上传的商品图片image图片文件页面logo图片,详情和修改链接的图标UEditor一种由百度推出的开源的富文本编辑器包含一些*.js、*.html、*.css和图片等文件,在新添商品的输入页goodsAdd.jsp和编辑的输入页goodsEditor.jsp中有应用data_数据导入导出导入数据库的SQL脚本导入、导出数据库的说明db_goods.txt导入导出数据.txtWEB-INF/libjar库文件文件上传组件,JDBC驱动程序,JSTL标签库表8-4src/main/webapp中的子文件夹8.2.3包和文件夹的功能说明8.2.4样式文件18样式文件css/css.css与案例ch7.2_student(学生管理系统)中的文件css/css.css所定义的样式基本相同,本章案例增加了2个样式,增加的样式代码如下。本案例中的常规页面都引用了此样式文件。样式文件css/cssHeaderFooter.css样式文件css/cssGoodsListLayout.css只应用于页头从文件head.jsp和页脚从文件footer.jsp。只应用于商品平铺式列表页goodsListLayout.jsp。8.2.5JSP标准标签库JSTL简介19JSTL标签库,即JSP标准标签库(Javaserverpagesstandardedtaglibrary),是由JCP(JavaCommunityProcess)所制定的标准规范,它主要提供给JavaWeb开发人员一个标准通用的标签库,开发人员可以利用这些标签取代JSP页面上一些简单常用的Java代码,使Java代码与HTML代码实现分离,让网页开发更符合MVC设计理念,从而提高程序的可读性,降低程序的维护难度。概念在Web项目中需要使用JSTL标签库时,需手动将taglibs-standard-impl-1.2.5.jar和

taglibs-standard-spec-1.2.5.jar这两个库文件添加到文件夹src/main/webapp/WEB-INF/lib,这两个类库文件在Apache官方网站能下载到。在网页中使用JSTL标签库时,需在页面开头位置应用taglib标签库指令<%@taglibprefix="c"uri="/jsp/jstl/core"%>声明标签库,标签库的前缀prefix通常声明为c,并需指明标签库的格式规范uri。在网页代码中使用的JSTL标签是类似<c:*>…</c:*>的标签,常见的标签有判断语句<c:if>、循环语句<c:forEach>和赋值语句<c:set>等。8.2.6页头header.jsp和页脚footer.jsp20打开页头文件header.jsp,修改代码,代码如下。打开页脚文件footer.jsp,其代码可无需修改。页头、页脚在用户登录页面中的预览效果如图8-11所示。8.2.7用户登录21商品管理系统中用户登录页面使用了图片验证码、AJAX技术和使用JavaScript代码进行网页跳转,登录页的预览效果如图8-11所示。图8-11用户登录页以MVC分层开发模式实现用户登录功能,涉及以下7个类和2个网页,其中字体红色的类和网页需修改:servlet_verifyCode.VerifyCodeNumCharutil.Md5bean.Userdao.Dbdao.UserDaoservice.LoginServiceservlet_login.LoginDologin.jspmain.jsp22操作2:备好字符“加密”类Md5在包util中创建类Md5.java,其主要代码如下。代码中的“加密”方法getMd5(Stringstr)能根据传入的字符串参数str,“加密”后返回32位(有些MD5方法返回16位)的字符。此MD5类在用户登录验证、新添用户和修改用户密码时都有使用。注:平常我们说应用MD5加密某些字符或文件,并不是真正的加密,其实是使用MD5摘要算法获取其32位的摘要字符串,“加密”后是无法还原的。而普通的加密软件对内容进行加密后,是可以还原的。MD5算法在编程开发中通常用于校验输入的密码是否与原来的一致。操作1:备好图片验证码Servlet类VerifyCodeNumChar此Servlet类与本书6.5.5小节所创建的类相同,能直接生成由数字和大写字母组成的4位验证码图片。8.2.7用户登录23操作3:修改登录页面login.jsp在网站根目录中打开用户登录页login.jsp,修改代码,其主要代码如下。代码中的第20行引入了页头从文件header.jsp。代码第43行引入了页脚从文件footer.jsp。在代码第37行,使用EL表达式${msg}输出在request中保存的消息msg,在注销登录时有应用。在代码第8行,引入了jQuery框架的js文件。图8-11用户登录页8.2.7用户登录24操作4:修改用户功能页main.jsp用户成功登录后将打开用户功能页main.jsp,该网页根据在session中保存的对象myUser中的用户角色级别role,显示不同的功能链接,打开main.jsp,修改代码,其代码如下。图8-12管理员的用户功能页8.2.7用户登录25操作5:备好数据操作类Db类文件Db.java存放在包dao中,此文件与本书第7章所应用的类文件Db.java几乎相同,只是代码第9行的数据库名改成了db_goods。该数据操作类能根据参数中的SQL语句和其他参数值,对数据表中记录实现增删改查操作。操作6:备好用户实体类User用户数据在MVC各层之间传输时,是以用户对象user或用户对象列表userList的形式传输的,所以要实现用户登录和用户管理等功能,需要用到用户实体类User。打开商品实体类文件bean/Goods.java,其主要代码如下。8.2.7用户登录26操作7:修改用户数据访问类UserDao登录验证时,需要根据输入的用户名和“加密”后的密码去查询tb_user表,即需要用到用户数据访问层的JavaBean类UserDao,调用UserDao中的查询数据的方法queryByUsernameAndPassword(),以判断所输入的用户名和密码是否正确。打开dao/UserDao.java,修改代码,其部分主要代码如下。用户数据访问类UserDao能响应用户登录业务处理类LoginService的请求,调用数据操作类Db中的方法完成数据的查询操作,并将生成的User对象user反馈给LoginService。如果登录失败,则返回的user对象为null,并且将相关提示信息保存到request对象。如果登录成功,则读取tb_user表中userId和role字段的值,并给user对象的userId、username和role属性赋值,最后返回user对象。8.2.7用户登录27操作8:修改用户登录业务处理类LoginService用户登录业务处理类LoginService能响应控制层Servlet类LoginDo的请求,进行业务处理和向UserDao发起数据访问的请求,并将业务处理的执行结果反馈给Servlet类LoginDo。打开service/LoginService.java,修改代码,其主要代码如下。在代码第18~37行,获取输入的值并对值进行数据校验。在代码第39~50行,判断输入的验证码是否与生成图片验证码时保存在session中的值相同。在代码第52~66行,先调用Md5类中的方法getMd5(username+password+salt)生成“新”的密码,然后调用UserDao类中的方法判断所输入的用户名和密码是否正确。如果user对象不为null,则表示通过登录验证,将user对象存入session,并返回true给Servlet类LoginDo。8.2.7用户登录28操作9:修改用户登录控制层Servlet类LoginDo打开servlet_login/LoginDo.java,修改代码,其主要代码如下。控制层的登录验证Servlet类LoginDo能响应浏览器的请求,调用业务处理类LoginService中的方法

loginDo(),最后根据返回的boolean值,决定返回给登录页login.jsp是要在页面显示的消息(登录失败时),还是含网页跳转URL的信息(登录成功时)。至此,用户登录功能所涉及的2个页面(login.jsp、main.jsp),和7个类(VerifyCodeNumChar、Md5、bean.User、Db、UserDao、LoginService、LoginDo)都已准备完成,可测试用户登录功能,登录成功后将跳转到用户功能页main.jsp,如图8-12所示。8.2.7用户登录29操作10:备好用户退出登录Servlet类Logout包servlet_login中的Servlet类Logout,用于用户退出登录,其主要代码如下。操作11:备好用户权限检查的类LoginCheck包util中的JavaBean类LoginCheck中的3个方法分别用于检查用户是否登录,判断用户是否为管理员admin或user角色用户,以及判断是否为管理员或用户自己(查看、修改用户信息时),其主要代码如下。8.2.7用户登录8.2.8商品平铺式列表页30要实现商品平铺式列表功能,涉及以下8个类和1个网页,其中字体红色的类和网页需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservice.TypeServiceservlet_goods.GoodsListLayoutgoods/goodsListLayout.jsp图8-13商品平铺式列表商品平铺式列表的测试效果如图8-13所示。31操作1:备好商品实体类Goods打开商品实体类文件bean/Goods.java,其主要代码如下。操作2:修改商品数据访问类GoodsDao打开商品实体类文件bean/GoodsDao.java,修改代码,其部分主要代码如下。8.2.8商品平铺式列表页32操作3:修改商品业务处理类GoodsService打开类文件service/GoodsService.java,修改代码,其部分主要代码如下。第29~35行的代码是有关批量删除记录的。在代码的第148~152行,如果session中有消息msg,则与request中的消息msg合并,删除session中的消息msg,最后将合并后的msg保存到request对象。当在商品详情页删除商品时,会将消息msg保存到session,然后以重定向的形式跳转到商品平铺式列表页。由于是重定向,所以需通过session临时传递一下消息。方法queryAll()的业务逻辑是:根据控制层Servlet类GoodsListLayout的搜索请求或分页请求,调用goodsDao.queryCount()获得记录总数并生成页码链接,接着调用goodsDao.queryAll()获取该页的记录列表,最后将消息msg、搜索内容search、已显示的记录数countShowed、页码链接page和商品对象列表goodsList都存入request对象,用于在商品平铺式列表页goodsListLayout.jsp以EL表达式方式显示出来。由方法queryAll()的代码可知,其业务逻辑的实现代码,与案例ch7.2_student(学生管理系统)的学生管理页studentAdmin.jsp中的Java代码类似。8.2.8商品平铺式列表页33操作4:修改商品平铺式列表的控制层Servlet类GoodsListLayout打开Servlet类文件servlet_goods/GoodsListLayout.java,修改代码,其主要代码如下。第30~31行的代码用于获取商品分类对象列表,用于在页面显示在分类下拉列表控件的选项中。此时先将这两行代码注释掉,在操作6~操作9中再来实现商品分类下拉列表控件。在代码第27~28行,创建商品业务处理对象goodsService,调用其queryAll(request)方法生成商品对象列表等信息,然后以转发形式跳转到网页goods/goodsListLayout.jsp,以在页面显示商品列表。8.2.8商品平铺式列表页34操作5:修改商品平铺式列表页goodsListLayout.jsp打开网页goods/goodsListLayout.jsp,修改代码,其代码如下。代码的第19~26行,用JSTL循环标签<c:forEach>生成了分类下拉列表的选项,由于JSTL标签的友好特性,此循环不注释掉,即使typeList对象列表在request对象中尚不存在,程序也不会报错,只是此循环不会执行。在代码第38行和第70行使用了类似于if语句的JSTL条件标签<c:if>,在代码第43行和第61行使用了类似于foreach遍历循环语句的JSTL循环标签<c:forEach>。在代码第48行,应用img的onerror事件,当图片加载失败时,例如图片不存在,则更改为显示“无图片”图片noImage.png。在代码第50行,类样式goodsName能在商品名称字符过多时,隐藏后面的字符并以三个点表示。8.2.8商品平铺式列表页35操作6:备好商品分类实体类Type打开商品分类实体类文件bean/Type.java,其主要代码如下。8.2.8商品平铺式列表页36操作7:备好商品分类数据访问类TypeDao打开商品分类数据访问类文件dao/TypeDao.java,其部分主要代码如下。8.2.8商品平铺式列表页37操作8:修改商品分类业务处理类TypeService打开商品分类业务处理类文件service/TypeService.java,修改代码,其代码如下。第23行的代码中,最后两个参数分别代表开始读取的记录的序号和读取的记录总数,分别设为0和9999,即读取前9999条记录,由于表tb_type中没有9999条记录,就相当于读取了所有的记录。8.2.8商品平铺式列表页38操作9:实现商品分类下拉列表修改商品平铺式列表页goodsListLayout.jsp的代码,实现商品分类下拉列表。浏览商品平铺式列表页的网址是http://localhost:8080/ch8.2_goods/GoodsListLayout,是由Servlet类GoodsListLayout在调用GoodsService中的方法之后,以转发方式应用goodsListLayout.jsp页来显示商品列表。如果直接预览商品平铺式列表页goodsListLayout.jsp,由于在request对象或session对象中并无商品对象列表goodsList、页码等信息,所以,页面中并不会显示商品列表、页码等信息,且由于路径问题也未能成功应用CSS样式文件和显示logo图片,但由于在页面代码中应用的是JSTL标签和EL表达式,所以也不会报代码错误,如图8-14所示。图8-14直接预览商品平铺式列表页goodsListLayout.jsp图8-13商品平铺式列表8.2.8商品平铺式列表页398.2.9商品列表页商品平铺式列表页主要是方便游客或注册用户(guest角色)浏览、购买商品用的,当角色为admin或user级别的用户在登录系统后,在用户功能页点击“商品列表”链接,在打开的商品列表页中,将能对商品进行新添、修改和删除的操作,预览效果如图8-15所示。图8-15商品列表页要实现商品列表功能,主要涉及以下8个类和1个网页,其中字体红色的类和网页需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservice.TypeServiceservlet_goods.GoodsListgoods/goodsList.jsp40操作1:修改商品列表的控制层Servlet类GoodsList打开servlet_goods/GoodsList.java,修改代码,其主要代码如下。8.2.9商品列表页41操作2:修改商品列表页goodsList.jsp打开网页goods/goodsList.jsp,修改代码,其代码如下。代码修改完后,可以测试商品列表中的商品浏览功能了。操作3:修改商品数据访问类GoodsDao打开类文件dao/GoodsDao.java,修改代码,其主要代码如下。8.2.9商品列表页42操作4:修改商品业务处理类GoodsService在商品业务处理类GoodsService中,与商品批量删除有关的代码有两部分。在queryAll()方法中,如果第29~35行的判断语句代码被注释掉了,则将注释取消,让其能执行。这段代码的业务逻辑是:如果在请求request中监测到用户按下了删除按钮,则获取所勾选的商品记录复选框的值,得到goodsId数组,然后调用本类中621~692行的deleteByGoodsIdLot()方法,实现商品记录的批量删除。修改deleteByGoodsIdLot()方法的代码,其代码如下。至此,可以测试商品列表中的批量删除功能了。8.2.9商品列表页438.2.10商品图片管理页要实现商品图片的管理功能,主要涉及到的类和网页主要有:包service中的类GoodsImageService,包servlet_image中的类GoodsImageUpload、GoodsImageUploadDo、GoodsImageDeleteDo,以及网页goods/goodsImageUpload.jsp。(1)包service中的业务逻辑层类GoodsImageService有5个方法方法getImageTag()能生成商品图片的图片标签“<img>”和图片链接,便于在图片上传页goodsImageUpload.jsp中显示图片和链接。方法getImageTagAndLink()能生成商品图片的图片标签“<img>”、图片链接和管理链接,便于在图片上传页显示图片和管理链接。该方法名对应有2个重载的方法。方法imageUploadDo()实现了上传图片和调用goodsDao.editImage()方法更新表tb_goods中字段image的值。方法imageDeleteDo()实现了删除图片和调用goodsDao.editImage()方法更新表tb_goods中字段image的值。44(2)包servlet_image中有3个控制层的Servlet类类GoodsImageUpload中的业务流程是:先进行用户权限判断,调用GoodsImageService类中的getImageTagAndLink()方法生成图片标签和图片链接,最后以转发形式跳转到网页goods/goodsImageUpload.jsp。类GoodsImageUploadDo中的业务流程是:先进行用户权限判断,调用GoodsImageService类中的imageUploadDo()方法实现上传图片和更新数据库,最后以转发形式跳转到网页goods/goodsImageUpload.jsp。类GoodsImageDeleteDo中的业务流程是:先进行用户权限判断,调用GoodsImageService类中的imageDeleteDo()方法实现删除图片和更新数据库,最后以重定向形式跳转到图片上传页GoodsImageUpload。8.2.10商品图片管理页45(3)在商品图片管理页goods/goodsImageUpload.jsp上有商品图片、管理链接、文件域和提交按钮等内容,能对商品图片进行上传、更换和删除的管理操作。图8-16商品图片管理页(在内联框架中)8.2.10商品图片管理页468.2.11商品详情页商品详情页的大致业务流程是:根据goodsId到商品表tb_goods中查询该商品记录,然后将数据在商品详情网页goodsShow.jsp中显示出来,商品详情页的测试效果如图8-17所示。图8-17商品详情页要实现商品详情功能,涉及以下5个类和1个网页,其中字体红色的类和网页需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServiceservlet_goods.GoodsShowgoods/goodsShow.jsp47操作1:修改商品数据访问类GoodsDao打开类文件dao/GoodsDao.java,修改方法queryByGoodsId()的代码,其代码如下。8.2.11商品详情页48操作2:修改商品业务处理类GoodsService打开类文件service/GoodsService.java,修改方法queryByGoodsId()的代码,其代码如下。代码的业务流程是,首先从request对象中获取由地址栏参数传递的goodsId,对goodsId进行有效性验证,然后调用GoodsDao中的方法queryByGoodsId()获得Goods对象goods,最后将对象goods保存到request对象。在代码的第196~200行,如果session中有消息msg,则将此msg与request中的消息msg合并,删除session中的消息msg,最后将合并后的msg保存到request对象。当新添商品和修改商品成功时,会将消息msg保存到session,然后以重定向的形式跳转到商品详情页。由于是重定向,所以需通过session临时传递一下消息。8.2.11商品详情页49操作3:修改商品详情的控制层Servlet类GoodsShow代码的业务流程是,先检查用户权限,接着创建对象goodsService,调用其queryByGoodsId()方法,最后以转发形式跳转到网页goods/goodsShow.jsp,以在网页中显示商品详情。代码第32~45行的业务流程是,将对象goods的image属性值,以参数形式传入方法getImageTag(),得到商品图片的“<img>”标签等信息,然后将信息赋值给对象goods的image属性,最后将对象goods存入request对象,用于在商品详情页显示商品图片。其实就是将image的值按一定的要求做了下处理。本来此业务处理应该放在业务层GoodsService中,但考虑到方法goodsService.queryByGoodsId()还被其他的Servlet类调用,也为了简便(不再另外创建一个方法或给方法添加一个参数),就将该业务流程放在了以上代码中。打开类文件servlet_goods/GoodsShow.java,修改代码,其主要代码如下。8.2.11商品详情页50操作4:修改商品详情页goodsShow.jsp打开网页goods/goodsShow.jsp,修改代码,其主要代码如下。代码修改完之后可测试商品详情功能。图8-17商品详情页8.2.11商品详情页518.2.12商品详情-商品图片管理页操作1:修改控制层Servlet类GoodsShowImageRenew打开类文件servlet_goods/GoodsShowImageRenew.java,修改代码,其主要代码如下。图8-18商品详情–商品图片管理页52操作2:创建商品详情–商品图片管理页goodsShowImageRenew.jsp在goods文件夹中打开goodsShow.jsp,将其另存为goodsShowImageRenew.jsp,其需要修改的代码如下。8.2.12商品详情-商品图片管理页8.2.13新添商品的输入页53新添商品的输入页goodsAdd.jsp与商品详情页goodsShow.jsp的页面结构类似,但不需要显示商品数据,增加了文本框、隐藏域、提交按钮等表单控件,需要有商品分类对象列表typeList以显示在分类下拉列表控件中,内嵌了商品图片管理页以上传商品图片,引入了富文本编辑器UEditor以输入商品的简介内容,增加了JavaScript代码以实现AJAX技术。新添商品的输入页的测试效果如图8-19所示。图8-19新添商品的输入页要实现新添的输入页功能,主要涉及以下5个类和1个网页,其中字体红色的类和网页需修改:bean.Typedao.Dbdao.TypeDaoservice.TypeServiceservlet_goods.GoodsAddgoods/goodsAdd.jsp54操作1:修改新添商品输入的Servlet类GoodsAdd打开servlet_goods/GoodsAdd.java,修改代码,其主要代码如下。UUID(UniversallyUniqueIdentifier)称为通用唯一识别码,或通用唯一标识。推出UUID的目的是让分布式系统中的元素都能有唯一的识别信息,例如为数据库中的每条记录做唯一标识。UUID是基于当前时间、计数器和硬件标识(通常为网卡的MAC地址)等数据计算生成的。UUID是由一组32位数的16进制数字所构成,理论上有32的16次方个不同的值,可视作不会重复的字符串。一个UUID值的例子是:54cdfe94-d256-42ea-a0bf-0bc5c9ace9ef8.2.13新添商品的输入页55操作2:修改新添商品的输入页goodsAdd.jsp打开goods/goodsAdd.jsp,修改代码,其主要代码如下。代码第39~41行,应用JSTL循环标签<c:forEach>在下拉列表中显示商品分类的选择项。在代码第71~72行,应用iframe内联框架将商品管理页嵌入到网页中。iframe的src中的参数goodsId的值是临时的商品ID(goodsUUID)。图片文件上传时是以商品ID为文件名保存在服务器中的,而新添商品时,还没有商品记录,也就没有商品ID,所以新添商品时在商品管理页中上传图片时,就用这个临时的商品ID(goodsUUID)作为图片的文件名。代码第73行的隐藏域的值也是临时的商品ID(goodsUUID)。商品记录新添到数据库后,需要将已上传的图片文件的文件名由临时的商品ID重命名为新记录的商品ID。在代码第79行和第134~142行,应用了富文本编辑器UEditor来输入商品简介的内容。UEditor最早是百度公司推出的,后贡献给了开源组织,它能让用户像使用Word一样进行比较复杂的图文排版。在代码第134行和第135行,分别引入了UEditor所需的JavaScript配置文件和源代码文件。第137~141行的代码创建UE对象ue,对id为“detail”的控件(在代码第79行)进行初始化并在页面显示富文本编辑器。在代码第107行使用ue.getContent()来获取在富文本编辑器中所输入的内容。8.2.13新添商品的输入页56要在富文本编辑器中插入图片,可以在其他的浏览器选项卡或窗口中复制所需图片,然后在富文本编辑器中使用快捷键Ctrl+V进行粘贴,图片就会显示在编辑器中,之后还可以调整图片的大小、位置等。也可以单击富文本编辑器左上角的“HTML”按钮,将编辑器的输入框切换成源代码形式,然后修改或设置图片的地址、大小等,这样就可以将图片地址更改为本网站根目录src/main/webapp子文件夹中的图片地址。如图8-20中的富文本编辑器将显示两张logo图片,第一张是直接复制加粘贴后的,得到的是图片的绝对路径;第二张是将粘贴之后的网址修改成了“image/logoGoods1.png”,得到的图片路径是本网站中的相对路径。图8-20富文本编辑器中的图片路径8.2.13新添商品的输入页8.2.14新添商品的执行57在新添商品的输入页输入商品信息,单击“提交”按钮,将商品信息新添到数据库,新添商品成功后跳转到该商品的详情页,并在页面下边显示新添记录成功的消息,测试效果如图8-21所示。图8-21新添商品成功要实现新添商品的执行功能,主要涉及以下7个类,其中字体红色的类需修改或创建:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservlet_goods.GoodsAddDo58操作1:修改商品数据访问类GoodsDao打开dao/GoodsDao.java,修改代码,其要修改的代码如下。方法addGoods()将商品数据新添到表tb_goods中并返回新记录的ID。方法existByGoodsNo()判断在表tb_goods中是否已经存在所输入的商品编码的记录。8.2.14新添商品的执行59操作2:修改商品业务处理类GoodsServiceaddGoods(),实现了新添商品信息,其业务流程是:获取所输入的商品信息并进行有效性验证;调用方法goodsDao.existByGoodsNo()判断在商品记录中是否已存在所输入的商品编码;调用方法typeDao.queryByTypeId()判断所选择的分类在分类记录中是否存在,如果存在,则获取所返回的分类对象type的typeName的属性值;根据输入的商品信息创建商品对象goods;调用方法goodsDao.addGoods()将所对象goods的数据新添到数据表tb_goods,并得到新记录的goodsId;然后将已上传的商品图片用新的goodsId重命名,更新数据表中该商品对应记录的字段image的值;如果以上操作全部成功,则将消息msg存入session,此消息将在商品详情页中显示;最后返回goodsId。打开service/GoodsService.java,修改代码,其要修改的代码如下。8.2.14新添商品的执行60操作3:创建新添商品的执行Servlet类GoodsAddDo在包servlet_goods中新建新添商品执行Servlet类GoodsAddDo,其代码与Servlet类GoodsList.java中的代码比较接近,可复制过来稍加修改,其最后的主要代码如下。图8-17商品详情页8.2.14新添商品的执行8.2.15修改商品的输入页61修改商品的输入页goodsEdit.jsp与新添商品的输入页goodsAdd.jsp的非常类似,但需要在页面显示商品的信息。修改商品输入的测试效果如图8-22所示。图8-22修改商品的输入页要实现商品的修改输入页列表功能,主要涉及以下8个类和1个网页,其中字体红色的类和网页需创建:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservice.TypeServiceservlet_goods.GoodsEditgoods/goodsEdit.jsp62操作1:创建修改商品输入的Servlet类GoodsEdit在包servlet_goods中新建修改商品输入的Servlet类GoodsEdit,其代码与Servlet类servlet_goods.GoodsAdd中的代码非常类似,可复制过来稍加修改,其最后的主要代码如下。主要业务逻辑是:根据goodsId查询该商品的记录生成对象goods,同时也生成分类对象列表typeList,这些数据将显示在页面goodsEdit.jsp中。8.2.15修改商品的输入页63操作2:创建修改商品的输入页goodsEdit.jsp在代码第15行和第100行,添加了JSTL标签<c:if>。在代码第142~47行,添加了在下拉列表中选中某选项的代码。在代码第80行的位置,没有隐藏域控件。在代码第118行的位置,没有获取隐藏域控件的值的代码。在代码第121行,url的值有变化。在代码第125行的位置,没有goodsUUID键值对。在文件夹webapp/goods中,将goodsAdd.jsp另存为goodsEdit.jsp,还可以参考goodsShow.jsp中的代码,稍作修改,goodsEdit.jsp最后的主要代码如下。图8-22修改商品的输入页8.2.15修改商品的输入页61修改商品的执行与新添商品的执行在实现逻辑方面非常类似,可以借用部分代码。修改商品输入的测试效果如图8-22所示。图8-22修改商品的输入页要实现修改商品的执行功能,主要涉及以下7个类,其中字体红色的类需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServicebean.Typedao.TypeDaoservlet_goods.GoodsEditDo8.2.16修改商品的执行64操作1:修改商品数据访问类GoodsDao方法editGoods()实现了将修改后的商品数据更新到表tb_goods,并将更新记录的条数count返回打开dao/GoodsDao.java,修改代码,修改后的部分代码如下。继续修改GoodsDao.java的代码,修改后的部分代码如下。方法existByGoodsNoExptId()的业务逻辑是检查是否存在商品编码相同而与ID不同的商品记录,是为了确保修改后的商品编码与已有的其他商品的编码都不相同。8.2.16修改商品的执行65操作2:修改商品业务处理类GoodsService更新商品信息的方法editGoods()的业务逻辑是:获取商品ID并进行校验,获取表单输入值并进行数据校验,检查当前商品记录是否还存在,检查所输入的商品编码是否与已存在商品记录的商品编码相同,检查所选择的分类记录是否还存在,然后创建商品对象goods并给其属性赋值,然后调用类GoodsDao当中的editGoods()方法执行记录更新,根据返回值count将是否修改成功的布尔值返回。如果修改成功,还将消息msg存入session,此消息将在商品详情页中显示出来。打开dao/GoodsService.java,修改代码,修改后的部分代码如下。8.2.16修改商品的执行66操作3:创建修改商品执行的Servlet类GoodsEditDo在包servlet_goods中创建Servlet类GoodsEditDo.java,其绝大部分代码与GoodsAddDo.java中的代码相同。GoodsEditDo.java最后的主要代码如下。8.2.16修改商品的执行8.2.17删除商品67批量删除商品记录的功能在商品列表页中已经实现。这里所要实现的删除商品功能,是指在商品详情页goodsShow.jsp中点击“删除”链接,删除该商品记录,然后跳转到商品列表Servlet地址GoodsList,并在页面的下方显示“删除记录成功。”的消息,测试效果如图8-23所示。图8-23删除商品成功要实现商品的删除功能,主要涉及以下5个类,其中字体红色的类需修改:bean.Goodsdao.Dbdao.GoodsDaoservice.GoodsServiceservlet_goods.GoodsDeleteDo68操作1:修改商品数据访问类GoodsDao打开dao/GoodsDao.java,修改代码,修改后的部分代码如下。8.2.17删除商品69操作2:修改商品业务处理类GoodsService打开dao/GoodsService.java,修改代码,修改后的部分代码如下。方法deleteByGoodsId()的业务逻辑是:获取商品ID并进行校验,获取表单输入值并进行输入数据校验,调用方法goodsDao.queryByGoodsId()检查当前商品记录是否还存在,调用方法goodsDao.queryByGoodsId()删除该商品记录,并将是否删除成功的boolean值返回,同时将消息msg存入session对象。8.2.17删除商品70操作3:创建删除商品执行的Servlet类GoodsDeleteDo在包servlet_goods中创建Servlet类GoodsDeleteDo.java,其绝大部分代码与其他的Servlet

温馨提示

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

评论

0/150

提交评论