任务八  实现产品信息的发布

任务八 实现产品信息的发布

学习目标

➢ 理解MVC模式。

➢ 理解模型、视图和控制器的角色分工。

➢ 会根据任务需求创建模型。

➢ 会使用Servlet控制页面的跳转。

➢ 能为产品信息的发布设计相关的模型。

任务描述

本次任务要求完成绿吧旅游用品公司后台管理的产品发布,如图1-8-1所示。

978-7-111-44979-9-Chapter01-243.jpg

图1-8-1 产品发布页面效果图

任务四已经完成了一个新闻发布页面,如果继续按照新闻发布的方式来处理产品发布,那么需要设计一个HTML页面,包含填写产品信息的表单,设计一个Servlet或者是JSP用来处理表单的提交。但这种方式通常会让后台的Servlet或者是JSP承担太多的数据库操作代码,导致代码严重重复,而且使JSP中静态与动态代码混在一起维护,增加了维护的难度。所以本次任务,要求使用MVC模式来对网站的功能实施更加细致的分工。

任务分析与相关知识

1.MVC设计模式概

M——模型(model)。

V——视图(view)。

C——控制器(control)。

MVC的基本思路是将应用网站的数据表示、数据存储和业务控制分开来维护。将原来都由JSP一手包办的功能分成3个核心模块,各自负责不同的工作任务,如图1-8-2所示。

978-7-111-44979-9-Chapter01-244.jpg

图1-8-3 网站中使用MVC设计模式

以登录为例,如果使用MVC模式实现这个登录任务,角色分工如图1-8-4所示。

MVC处理网站请求的核心思想是分工,数据存储的功能交给实体bean(特定结构的Java类),业务逻辑交给业务处理的组件,数据库的访问交给数据访问层的专用类,与用户之间的交互交给界面(JSP文件),页面之间的逻辑控制交给Servlet来处理。

978-7-111-44979-9-Chapter01-245.jpg

图1-8-4 使用MVC设计模式实现登录

2.视图设计

视图通常是直接与用户交互的界面。在网站应用中,视图理所当然由JSP网页充当。

演示一 为登录模块设计视图。在Hello项目中,添加一个登录页面mvclogin.jsp,包含登录表单,用来接受用户输入的用户名和密码,其代码如下所示。

代码1-8-1 mvclogin.jsp

978-7-111-44979-9-Chapter01-246.jpg

978-7-111-44979-9-Chapter01-247.jpg

978-7-111-44979-9-Chapter01-248.jpg

978-7-111-44979-9-Chapter01-249.jpg

该页面要实现的功能是根据会话中记录的登录状态,来确定显示的内容,如果会话中存在login参数,说明当前状态是登录状态,显示用户专区的内容;如果会话中不存在login参数,说明当前还没有登录,就显示登录表单。

会话对象session也是JSP页面中的默认对象,这个对象是HttpSession类型的,可以直接使用。该对象常用方法见表1-8-1。

表1-8-1 HttpSession方法列表

978-7-111-44979-9-Chapter01-250.jpg

上述方法中,setAttribute和getAttribute是最常用的方法。例如代码1-8-1中的第124行和126行,都用到了session.getAttribute("login")方法,该方法就是在会话中取参数“login”,那么这个login参数是什么时候放入会话的呢?在后续的演示三中,读者会发现这个参数是在登录判断成功之后,用session.setAttribute方法把成功登录的用户对象存入了会话,并给这个参数取名为login。

3.模型设计

根据图1-8-2,我们发现在网站应用中模型的主要作用有两方面:

1)存储数据。控制器从用户那里得到的数据可以以模型的形式传递给后台逻辑层,同样从数据库获取的数据也可以以模型的形式传递给表示层;使用模型而不是零散的数据形式,更便于对数据进行管理。就如同在处理员工的工资信息的时候,一个员工的整个工资信息保存在一起,而不是零散的管理和访问。

2)访问数据库。JSP页面和Servlet中都可以直接连接数据库做查询并处理查询结果,但是这种做法分工不清晰。我们总是希望JSP页面能专注于数据的显示问题,Servlet专注于处理用户的请求,具体的业务应该交给专门的“业务员”去完成,这个业务员就是Java类文件。无论是JSP还是Servlet都可以调遣业务员去完成数据存取的具体操作,这样的分工更利于对程序的维护和管理。

无论是数据存储还是做“业务员”,在本质上都是根据用户的需求设计各种类,要存储的数据是类的属性,要完成的业务是类的方法。

下面以登录为例,介绍应该如何设计模型。

演示二 为登录页面设计模型。登录页面需要访问的数据表是admins,该表结构如图1-8-5所示。

978-7-111-44979-9-Chapter01-251.jpg

图1-8-5 admins表结构

1)根据页面要处理的数据表的表结构设计第一个模型MemeberBean,该类的核心作用是封装一个用户的完整信息。当需要在文件之间传递用户信息时,用这个类型的对象最为合适,因为它可以包含所需要的用户的所有信息,并提供访问这些信息的标准方法。

在Hello项目中按照图1-8-6所示添加一个Java类MemeberBean.java。

978-7-111-44979-9-Chapter01-252.jpg

图1-8-6 添加类文件步骤1

出现如图1-8-7所示的对话框。

978-7-111-44979-9-Chapter01-253.jpg

图1-8-7 添加类文件步骤2

注意 本教材中凡是在项目GreenBar中充当模型的类都放在models包中。

在MemberBean.java源文件中输入如下代码。

代码1-8-2 MemberBean.java

978-7-111-44979-9-Chapter01-254.jpg

2)设计一个处理会员事务的“业务员”——Members.java。目前需要这个业务员处理的业务只有一件:登录的判断。登录判断需要访问数据库,而且一般的业务处理几乎都要与数据库进行“沟通”,所以把常见的数据通用操作定义在一个通用的数据操作类DB中。Members类的核心作用是设计数据访问的逻辑,而DB类的核心作用是连接数据库,执行由Members类确定好的数据访问逻辑。

在Hello项目中添加一个通用数据操作类DB,该类位于包models中,该类源代码如下所示。

代码1-8-3 DB.java

978-7-111-44979-9-Chapter01-255.jpg

978-7-111-44979-9-Chapter01-256.jpg

在Hello项目中添加一个业务逻辑类Members,该类位于包models中,该类源代码如下所示。

代码1-8-4 Members.java

978-7-111-44979-9-Chapter01-257.jpg

978-7-111-44979-9-Chapter01-258.jpg

4.控制器设计

Servlet天生具备request和response对象,用来接受用户的请求并做出响应,所以非常适合作控制器。控制器的作用就是获取用户的需求(request对象完成),调度模型处理数据,再根据数据处理的结果,决定最终向用户呈现什么东西(response对象完成)。

Servlet可以使用request对象获取用户提交的数据和其他需求,可以调用创建好的模型来处理数据,可以使用response对象实现页面的跳转。由于Servlet本身驻留在服务器端,这些处理对于用户来说是透明的,用户是看不到的,而且用户也不需要看到,他们关心的只是结果。所以,通常使用Servlet作控制器。

演示三 为登录模块设计控制器。

在Hello项目下创建一个Servlet文件LoginController。为这个Servlet配置的包名是servlets,别名是loginc,路径映射为/loginc。这个Servlet文件的源代码如下所示。

代码1-8-5 LoginController.java

978-7-111-44979-9-Chapter01-259.jpg

978-7-111-44979-9-Chapter01-260.jpg

运行Hello项目,测试mvclogin.jsp,出现如图1-8-8所示的登录窗口。如果输入错误的用户名和密码,还是跳回登录页面;如果输入正确的用户名和密码,出现如图1-8-9所示的视图。

978-7-111-44979-9-Chapter01-261.jpg

图1-8-8 登录前的视图

978-7-111-44979-9-Chapter01-262.jpg

图1-8-9 成功登录后的视图

任务实施

1.任务单

本次任务的任务清单见表1-8-2。

表1-8-2 任务八的任务清单

978-7-111-44979-9-Chapter01-263.jpg

2.实施步骤

步骤一 在任务二代码1-2-5创建的文件greenbardb.sql的结尾,添加如下代码。

代码1-8-6 greenbardb.sql增加的SQL语句

978-7-111-44979-9-Chapter01-264.jpg

978-7-111-44979-9-Chapter01-265.jpg

【操作提示】

1)完成6~10行代码,向表Producttypes中插入多条测试数据。

2)完成25~30行代码,向表products中插入多条测试数据。

在MySQL数据库管理工具中重新执行文件greanbardb.sql,创建Producttypes和products两个表。

步骤二 在GreenBar项目根目录下的src文件夹下创建一个新的文件夹models,把Hello中创建的DB类复制到这个文件夹下。

步骤三 在GreenBar项目中创建一个新的HTML文件bk_product_upload.html。该网页的执行效果要求如图1-8-10所示,该网页在设计产品发布表单时特别重要,将表单的action的值设定为productupload(请读者自行完成)。

步骤四 在GreenBar项目中models包下面创建一个新的类文件ProductBean.java,代码如下所示。

代码1-8-7 ProductBean.java

978-7-111-44979-9-Chapter01-266.jpg

【操作提示】

请查阅相关资料,实现在MyEclipse中自动生成ProductBean的get/set属性操作方法和构造方法。

步骤五 在GreenBar项目中models包下面创建一个新的类文件Products.java,代码如下所示。

代码1-8-8 Products.java

978-7-111-44979-9-Chapter01-267.jpg

步骤六 在GreenBar项目中创建一个Servlet类ProductsUpload.java,配置包名是servlets,别名是productupload,路径是/productupload,代码如下所示。

代码1-8-9 ProductsUpload.java

978-7-111-44979-9-Chapter01-268.jpg

978-7-111-44979-9-Chapter01-269.jpg

【操作提示】

1)请模仿代码1-8-5的第13~15行代码的写法,完成第16~34行的代码。

2)请查阅相关资料,根据代码1-8-7中ProductBean带参数构造函数的写法,完成第35~36行的代码。

运行GreenBar项目,测试bk_product_upload.html网页,效果如图1-8-10所示,单击“资料提交”按钮,如果成功提交数据,效果如图1-8-11所示。

978-7-111-44979-9-Chapter01-270.jpg

图1-8-10 填写要发布的产品信息截图

978-7-111-44979-9-Chapter01-271.jpg

图1-8-11 发布成功提示信息截图

自我评价

978-7-111-44979-9-Chapter01-272.jpg

思考与练习

一、简答题

1.总结Servlet处理用户请求的一般步骤。

2.根据模型的功能,可以把模型分为哪几种类型,它们在MVC模式的Web应用中分有什么作用?

3.使用了MVC设计模式之后,原来项目中的JSP文件在代码的长度、代码中所包含类型和代码的调试等方面发生了什么变化?

二、连线题

978-7-111-44979-9-Chapter01-273.jpg

三、操作题

1.实现演示一中的“退出”功能。

2.完成商品维护功能,效果如图1-8-12所示。

978-7-111-44979-9-Chapter01-274.jpg

图1-8-12 商品维护界面效果图