任务四  实现纯文本新闻的发布

任务四 实现纯文本新闻的发布

学习目标

了解绿吧企业新闻发布的业务需求。

理解Servlet在JSP网站中的作用和地位。

知道Servlet中请求与响应对象的常用方法。

会创建、部署和运行Servlet。

会使用请求对象获取表单的数据。

会使用响应对象实现页面的跳转。

会使用Servlet处理新闻表单的数据提交请求。

任务描述

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

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

图1-4-1 纯文本新闻发布页面效果图

任务分析与相关知识

1.Servlet概述

JSP网站项目必须要部署在Web服务器上才能运行,并面向客户端浏览器提供服务,Servlet实际上是工作在服务器的类文件。从功能上看,Servlet可以处理用户的请求,根据用户的需求处理数据,并将结果以一定的形式反馈给用户。下面以登录为例,如图1-4-2所示。

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

图1-4-2 Servlet处理登录过程

客户端通过浏览器访问登录页面,并填写登录表单。提交之后,用户输入的用户名和密码通过HTTP数据包发送到服务器端,服务器端驻留的Servlet小程序利用内置的对象,可以轻松提取HTTP数据包中的数据,也可以轻松实现对客户端浏览器的“指引”。例如,如果通过检测发现传递过来的用户名和密码错误,Servlet可以让客户端跳转到其他页面,或者输出错误提示。

其实,前面讲的JSP脚本和Servlet并没有太大的不同,因为JSP中的Java脚本部分都会被服务器自动地转换成为Servlet文件,驻留在服务器的内部来处理用户的请求。虽然这两种技术形式本质上相同,但分工不同,在设计网站的时候,应该尽量让JSP页面专注于完成表示层的任务,如数据的展示,而把一些后台数据的处理功能分离出来交给Servlet做。

Servlet从本质上看就是Java类文件,只不过这个类有很多的格式上的限制,否则服务器就无法识别到它的身份了。这种限制是靠继承来实现的。也就是说,自定义的Servlet类都必须符合Servlet的基本框架。Servlet的基本框架分3个层次,分别是最顶级的javax.servlet.Servlet、次级的javax.servlet.GenericServlet和一般用于Web网站规范中的javax.servlet.http.HttpServlet,如图1-4-3所示。

所有用户自定义的Servlet必须继承来自父类的规范,这些规范在javax.servlet包和javax.servlet.http包中定义,所以定义的Servlet类必须导入这两个包。

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

图1-4-3 Servlet实现框架

2.Servlet的基本结构

自定义的Servlet之所以不同于一般的类,就在于他的特定规范,这些特定规范是以方法的形式体现的。例如,要设计处理Web请求的Servlet,必须定义一个类,它继承至HttpServlet类。HttpServlet类是专门处理HTML表单数据的,它的基本结构见表1-4-1。

表1-4-1 HttpServlet类的基本结构

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

(续)

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

在上述类结构中,service方法是核心方法,该方法还有两个衍生的方法:doGet方法和doPost方法,它们分别对应于表单的两种提交方式。学过HTML的读者应该熟悉form表单在定义的时候,有一个method属性,该属性可以选择get或者是post,如下所示。

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

如果method设置为get,表单中的数据会附在URL之后(就是把数据放置在HTTP协议头中),以“?”分割URL和传输数据,多个参数用“&”连接,例如“login.action?name=hyddd&password=idontknow&verify=%E4%BD%AO%E5%A5%BD”。如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出如“%E4%BD%AO%E5%A5%BD”所示的内容,其中,%XX中的XX为该符号以16进制表示的ASCII。

如果method设置为post,则是把提交的数据放置在HTTP包的包体中,也就意味着地址栏的URL中是看不到要提交的数据的。

因此,HttpServlet提供两个方法doGet和doPost分别单独处理不同的请求类型。

下面是一个自定义的Servlet类的基本结构。

代码1-4-1 自定义的Servlet类

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

3.定义、部署和运行Servlet

在MyEclipse中创建Web项目和Servlet,它会自动帮助我们生成Web目录并自动完成Servlet的基本配置。现在通过一个案例来学习Servlet的定义、部署和运行步骤。

演示一 使用Servlet向客户端浏览器输出问候语句。

1)使用MyEclipse打开之前的项目Hello,然后采用如图1-4-4所示的方式,在Hello下创建一个Servlet文件HelloServlet。

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

图1-4-4 添加Servlet步骤1

在图1-4-4中选择“Servlet”命令后,进入图1-4-5所示的配置窗口,该窗口主要是配置Servlet的名字。其中“Package”项需要输入包名(即要创建的Servlet会被放到什么文件夹中);“Name”项需要输入创建的Servlet的名称。其他项采用默认值即可。

单击“Next”按钮进入下一个对话框,如图1-4-6所示。其中“Servlet/JSPName”用来配置Servlet的别名,一般设置为类名的小写形式;“Servlet/JSPMappingURL”用来设定该Servlet的访问路径,一般设置为“/别名”。

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

图1-4-5 添加Servlet步骤2

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

图1-4-6 添加Servlet步骤3

完成上面配置后,在项目目录中的src文件夹下,出现了一个新的文件夹servlets,该文件夹下出现一个新的文件HelloServlet.java,目录结构如图1-4-7所示。

图1-4-6的别名和路径配置实际上是在配置web.xml文件。该文件位于网站目录下WEB-INF文件夹下,该文件中与Servlet相关的配置信息如图1-4-8所示。

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

图1-4-7 Servlet的存储路径

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

图1-4-8 web.xml文件

2)在HelloServlet.java文件中输入如下代码。

代码1-4-2 HelloServlet.java

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

运行Hello网站项目,测试HelloServlet,效果如图1-4-9所示。

图1-4-6完成的路径映射配置决定了Servlet的访问方式,例如HelloServlet的路径映射为/hello,那么就意味着,Hello网站服务器启动之后,应该使用“http://服务器名或者ip地址:端口号/Hello/hello”来访问对应的Servlet。

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

图1-4-9 HelloServlet运行结果

4.使用Servlet处理表单的请求

Servlet经常用来处理表单的请求,在处理请求的过程中最常用到的两个对象是请求对象(HttpServletRequest)和响应对象(HttpServletResponse)。

1)HttpServletRequest类型的对象request,也就是JSP网页中使用的默认对象request,用来处理请求的数据,该对象中的常用方法见表1-4-2。

表1-4-2 HttpServletRequest的方法列表

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

2)HttpServletResponse类型的对象response,也就是JSP网页中使用的默认对象response,用来处理对用户的响应,该对象中的常用方法见表1-4-3。

表1-4-3 HttpServletResponse的方法列表

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

所以Servlet可以使用request对象的getParameter方法获取请求中的参数——表单中的各种数据,也可以使用response对象提供的方法向客户发送数据或者是实现页面的跳转。

下面通过演示二,了解Servlet如何处理表单数据。

演示二 完成绿吧企业门户网站后台登录功能。

在任务二编写的greenbardb.sql基础之上,添加如下SQL脚本。

代码1-4-3 greenbardb.sql添加的部分

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

在MySQL中重新运行greenbardb.sql,在原有的GreenBar数据库中添加了一个数据表admins,并在该表中插入了两条测试数据。

使用MyEclipse打开之前的项目GreenBar,在网站根目录下添加一个文件夹styles,并在该文件夹下添加一个CSS文件bk.css。

代码1-4-4 bk.css

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

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

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

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

在网站根目录下添加一个HTML文件bk_login.html。

代码1-4-5 bk_login.html

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

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

测试bk_login.html的效果,如图1-4-10所示。

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

图1-4-10 后台登录页面效果图

在网站根目录下添加一个JSP文件bk_msg.jsp。

代码1-4-6 bk_msg.jsp

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

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

运行GreenBar项目,在地址栏输入“http://localhost:8080/GreenBar/bk_msg.jsp?msg=test”,效果如图1-4-11所示。

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

图1-4-11 消息提示页面效果图

在GreenBar项目中添加一个Servlet文件LoginServlet,在Servlet的配置向导中,设置包名为servlets,并将LoginServlet的别名设置为login,路径映射设置为/login。该文件代码如下所示。

代码1-4-7 LoginServlet.java

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

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

运行GreenBar项目,在地址栏输入“http://localhost:8080/GreenBar/bk_login.html”,在出现的登录表单中输入正确的用户名和密码,单击“登录”按钮,会看到如图1-4-12所示效果;如果输入错误的用户名和密码,会看到如图1-4-13所示的效果;如果数据库连接错误,会出现如图1-4-14所示的效果。

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

图1-4-12 登录正确网页效果图

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

图1-4-13 登录错误网页效果图

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

图1-4-14 数据库连接错误效果图

任务实施

1.任务单

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

表1-4-4 任务四的任务清单

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

2.实施步骤

步骤一 在项目GreenBar下添加一个HTML文件bk_news_upload.html,代码如下所示。

代码1-4-8 bk_news_upload.html

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

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

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

步骤二 在项目GreenBar下添加一个Servlet类——NewsUploadServlet,该类位于包servlets中,别名为newsupload,路径映射为“/newsupload”,该类代码如下所示。

代码1-4-9 NewsUploadServlet.java

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

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

【操作提示】

1)从表1-4-2中挑选合适的方法完成第20~32行的代码。

2)根据JDBC技术要点完成第39~58行的代码。

3)从表1-4-3中挑选合适的方法完成第71行的代码。

运行GreenBar项目,在地址栏中输入“http://localhost:8080/GreenBar/bk_news_upload.html”,在出现的表单中输入如图1-4-15所示的内容,单击“新闻提交”按钮会看到如图1-4-16所示效果。查看MySQL数据库,可以检测到最新添加的数据行。

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

图1-4-15 填写新闻表单效果图

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

图1-4-16 新闻发布正确效果图

自我评价

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

思考与练习

一、简答题

1.你认为Servlet是什么?

2.你认为Servlet和JSP是什么关系?

3.doPost和doGet方法有什么异同?

4.利用request如何取表单中的参数?

5.利用response如何实现页面的跳转?

6.配置Servlet的路径映射有何作用?

二、代码改错题

1.下面web.xml文件对Servlet的配置错在哪里?

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

2.如下Servlet中连接数据库的代码有5处错误,请指出这些错误。

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

三、操作题

模仿本次任务的实施步骤,为后台管理功能添加一个产品发布页面(填写产品信息的页面效果图参考图1-4-17),并设计Servlet实现产品信息的数据库存储。

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

图1-4-17 产品发布页面效果图