任务四 实现纯文本新闻的发布
学习目标
了解绿吧企业新闻发布的业务需求。
理解Servlet在JSP网站中的作用和地位。
知道Servlet中请求与响应对象的常用方法。
会创建、部署和运行Servlet。
会使用请求对象获取表单的数据。
会使用响应对象实现页面的跳转。
会使用Servlet处理新闻表单的数据提交请求。
任务描述
本次任务要求完成绿吧旅游用品公司后台管理的新闻发布,如图1-4-1所示。
图1-4-1 纯文本新闻发布页面效果图
任务分析与相关知识
1.Servlet概述
JSP网站项目必须要部署在Web服务器上才能运行,并面向客户端浏览器提供服务,Servlet实际上是工作在服务器的类文件。从功能上看,Servlet可以处理用户的请求,根据用户的需求处理数据,并将结果以一定的形式反馈给用户。下面以登录为例,如图1-4-2所示。
图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类必须导入这两个包。
图1-4-3 Servlet实现框架
2.Servlet的基本结构
自定义的Servlet之所以不同于一般的类,就在于他的特定规范,这些特定规范是以方法的形式体现的。例如,要设计处理Web请求的Servlet,必须定义一个类,它继承至HttpServlet类。HttpServlet类是专门处理HTML表单数据的,它的基本结构见表1-4-1。
表1-4-1 HttpServlet类的基本结构
(续)
在上述类结构中,service方法是核心方法,该方法还有两个衍生的方法:doGet方法和doPost方法,它们分别对应于表单的两种提交方式。学过HTML的读者应该熟悉form表单在定义的时候,有一个method属性,该属性可以选择get或者是post,如下所示。
如果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类
3.定义、部署和运行Servlet
在MyEclipse中创建Web项目和Servlet,它会自动帮助我们生成Web目录并自动完成Servlet的基本配置。现在通过一个案例来学习Servlet的定义、部署和运行步骤。
演示一 使用Servlet向客户端浏览器输出问候语句。
1)使用MyEclipse打开之前的项目Hello,然后采用如图1-4-4所示的方式,在Hello下创建一个Servlet文件HelloServlet。
图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的访问路径,一般设置为“/别名”。
图1-4-5 添加Servlet步骤2
图1-4-6 添加Servlet步骤3
完成上面配置后,在项目目录中的src文件夹下,出现了一个新的文件夹servlets,该文件夹下出现一个新的文件HelloServlet.java,目录结构如图1-4-7所示。
图1-4-6的别名和路径配置实际上是在配置web.xml文件。该文件位于网站目录下WEB-INF文件夹下,该文件中与Servlet相关的配置信息如图1-4-8所示。
图1-4-7 Servlet的存储路径
图1-4-8 web.xml文件
2)在HelloServlet.java文件中输入如下代码。
代码1-4-2 HelloServlet.java
运行Hello网站项目,测试HelloServlet,效果如图1-4-9所示。
图1-4-6完成的路径映射配置决定了Servlet的访问方式,例如HelloServlet的路径映射为/hello,那么就意味着,Hello网站服务器启动之后,应该使用“http://服务器名或者ip地址:端口号/Hello/hello”来访问对应的Servlet。
图1-4-9 HelloServlet运行结果
4.使用Servlet处理表单的请求
Servlet经常用来处理表单的请求,在处理请求的过程中最常用到的两个对象是请求对象(HttpServletRequest)和响应对象(HttpServletResponse)。
1)HttpServletRequest类型的对象request,也就是JSP网页中使用的默认对象request,用来处理请求的数据,该对象中的常用方法见表1-4-2。
表1-4-2 HttpServletRequest的方法列表
2)HttpServletResponse类型的对象response,也就是JSP网页中使用的默认对象response,用来处理对用户的响应,该对象中的常用方法见表1-4-3。
表1-4-3 HttpServletResponse的方法列表
所以Servlet可以使用request对象的getParameter方法获取请求中的参数——表单中的各种数据,也可以使用response对象提供的方法向客户发送数据或者是实现页面的跳转。
下面通过演示二,了解Servlet如何处理表单数据。
演示二 完成绿吧企业门户网站后台登录功能。
在任务二编写的greenbardb.sql基础之上,添加如下SQL脚本。
代码1-4-3 greenbardb.sql添加的部分
在MySQL中重新运行greenbardb.sql,在原有的GreenBar数据库中添加了一个数据表admins,并在该表中插入了两条测试数据。
使用MyEclipse打开之前的项目GreenBar,在网站根目录下添加一个文件夹styles,并在该文件夹下添加一个CSS文件bk.css。
代码1-4-4 bk.css
在网站根目录下添加一个HTML文件bk_login.html。
代码1-4-5 bk_login.html
测试bk_login.html的效果,如图1-4-10所示。
图1-4-10 后台登录页面效果图
在网站根目录下添加一个JSP文件bk_msg.jsp。
代码1-4-6 bk_msg.jsp
运行GreenBar项目,在地址栏输入“http://localhost:8080/GreenBar/bk_msg.jsp?msg=test”,效果如图1-4-11所示。
图1-4-11 消息提示页面效果图
在GreenBar项目中添加一个Servlet文件LoginServlet,在Servlet的配置向导中,设置包名为servlets,并将LoginServlet的别名设置为login,路径映射设置为/login。该文件代码如下所示。
代码1-4-7 LoginServlet.java
运行GreenBar项目,在地址栏输入“http://localhost:8080/GreenBar/bk_login.html”,在出现的登录表单中输入正确的用户名和密码,单击“登录”按钮,会看到如图1-4-12所示效果;如果输入错误的用户名和密码,会看到如图1-4-13所示的效果;如果数据库连接错误,会出现如图1-4-14所示的效果。
图1-4-12 登录正确网页效果图
图1-4-13 登录错误网页效果图
图1-4-14 数据库连接错误效果图
任务实施
1.任务单
本次任务的任务清单见表1-4-4。
表1-4-4 任务四的任务清单
2.实施步骤
步骤一 在项目GreenBar下添加一个HTML文件bk_news_upload.html,代码如下所示。
代码1-4-8 bk_news_upload.html
步骤二 在项目GreenBar下添加一个Servlet类——NewsUploadServlet,该类位于包servlets中,别名为newsupload,路径映射为“/newsupload”,该类代码如下所示。
代码1-4-9 NewsUploadServlet.java
【操作提示】
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数据库,可以检测到最新添加的数据行。
图1-4-15 填写新闻表单效果图
图1-4-16 新闻发布正确效果图
自我评价
思考与练习
一、简答题
1.你认为Servlet是什么?
2.你认为Servlet和JSP是什么关系?
3.doPost和doGet方法有什么异同?
4.利用request如何取表单中的参数?
5.利用response如何实现页面的跳转?
6.配置Servlet的路径映射有何作用?
二、代码改错题
1.下面web.xml文件对Servlet的配置错在哪里?
2.如下Servlet中连接数据库的代码有5处错误,请指出这些错误。
三、操作题
模仿本次任务的实施步骤,为后台管理功能添加一个产品发布页面(填写产品信息的页面效果图参考图1-4-17),并设计Servlet实现产品信息的数据库存储。
图1-4-17 产品发布页面效果图