JSP开发Servlet技术与应用祥解.docx
- 文档编号:29356144
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:37
- 大小:332.50KB
JSP开发Servlet技术与应用祥解.docx
《JSP开发Servlet技术与应用祥解.docx》由会员分享,可在线阅读,更多相关《JSP开发Servlet技术与应用祥解.docx(37页珍藏版)》请在冰豆网上搜索。
JSP开发Servlet技术与应用祥解
第八章JSP中Servlet技术与应用
Servlet是在服务器端运行的Java应用程序,是JavaEE的重要技术之一。
JSP与Servlet有着密切的关系,在JSP出现之前Servlet技术已经很成熟,JSP的运行必须先编译转换为Servlet后,才能被Web浏览器解析执行,JSP实际上就是Servlet技术的发展。
本章主要内容如下:
✧Servlet简介;
✧Servlet与JSP的区别;
✧Servlet的部署;
✧Servlet的实际应用。
8.1Servlet简介
Servlet是用Java编写的运行在服务器端的小程序。
Servlet本身不能直接独立运行,只能运行于支持Servlet的服务器。
Servlet用于接收来自客户段端的请求,并将处理结果以动态网页形式返回课户端浏览器。
在JSP出现之前,Servlet技术就已经很成熟了。
Servlet的工作模式为请求/响应(Request/Response)模式,它可以接受来自客户端浏览器的http请求,并产生响应,然后将这个请求发送到客户端。
JSP文件的执行,首先必须由Java虚拟机编译转换为Servlet文件才能执行,Servlet充当了JSP文件被执行的中间过程。
可以这样说JSP是Servlet技术的延伸和扩展。
Servlet技术与在服务器端CGI等其他开发语言相比,具有以下特点。
(1)功能强大
在Servlet中,许多使用CGI程序难以完成任务可以轻松地完成。
Servlet接口非常精练,易于掌握,同时它又具有良好的扩展性。
(2)执行效率高
当JSP第一次运行时,服务器要将这些JSP程序转换为Servlet,因此速度较慢,而一旦转换完成,以后访问这些JSP网页的速度就很快。
相对于JSP程序,Servlet程序执行效率高、速度快。
(3)可移植性好
由于Servlet是用Java编写的应用程序,所以它很好地继承了Java跨平台的特点。
Servlet接口丰富,几乎所有Web应用服务器都可以直接或通过插件支持Servlet。
(4)开发难度底
相对于其他CGI程序,Servlet技术开发难度较小,可以完成较为轻松地开发复杂的Web应用程序。
8.2Servlet与JSP的区别
JSP网页是在Html脚本中嵌入Java代码,而Servlet是在Java代码中嵌入Html脚本。
虽然JSP是Servlet技术发展的结果,但二者存在着以下三几个方面的区别。
1.编程方式不同
Servlet是服务器端的Java程序,用于接受客户端的请求并返回响应。
Servlet可以简单理解为嵌有Html代码的Java程序,它更关注程序的逻辑而非页面的展现。
JSP是Servlet技术的扩展和延伸,可以用来设计带有少量逻辑的网页。
Servlet可以简单理解为嵌有Html代码的Java程序,而JSP可以理解为嵌有Java代码的Html程序,它更关注页面的展现而非程序的逻辑。
在JSP出现之前,Servlet技术是Web应用开发的重要技术,随着JSP的出现和应用,Servlet技术将逐渐被JSP技术代替,可以说JSP是Servlet技术发展的结果,它从根本上改变了Servlet的编程方式。
在Servlet中,业务逻辑和Html代码大量搀杂在一起,给程序的维护带来了不便,给大型Web项目的开发应用带来了困难。
JSP实现了实现了页面表现和商业逻辑的分离,比较容易上手,而且开发工具丰富,可以实现快速开发。
2.运行方式不同
Servlet必须在编译后才能运行,并且Servlet在每次修改代码后都必须进行编译才能执行。
JSP在执行前必须转换为Servlet,所以JSP的运行速度比Servlet要相对慢一些,而一旦编译转换完成,以后在执行JSP代码时,如果JSP文件没有改变,则速度就大为加快,如果JSP文件有所改变,则重新将JSP文件转换为Servlet,然后再提交给客户端用户。
3.应用范围不同
JSP和Servlet技术各有所长,实际应用中可以根据工程项目的特点有所取舍,比如,如果页面的显示逻辑多些就用JSP,如果处理的业务逻辑多些就用Servlet。
随着JSP的成熟和JavaEE应用的发展,Servlet技术的应用将越来越少,尽管如此,Servlet在JavaEE应用中仍然有它的用处,如处理小型的Web应用项目,或者用来作为现在比较流行的Web设计模式MVC(Model-View-Controller)中的控制器Controller。
【要点提示】
由于Servlet与JSP十分相似,其选用的原则在某种程度上也取决于个人的爱好。
JSP并没有增加任何本质上不能用Servlet实现的功能,但在JSP中编写静态Html更加方便,不必再用println语句逐行输出Html代码。
8.3Servlet的生命周期
Servlet生命周期可以分为三个阶段:
初始阶段、服务阶段和卸载阶段,这三个阶段分别对应至三个方法:
init()、service()和destroy()。
Servlet生命周期可以分为如下三个阶段。
1.Servlet的初始阶段
当Servlet接收到客户端请求时,首先会调用的init()方法初始化Servlet应用程序。
如果您想设置Servlet的初始化信息,只要改写init()方法即可。
只要Servlet未被卸载,同一个Servlet的初始化init()方法只能执行一次。
2.Servlet的服务阶段
Servlet仅在第一次载入Servlet时调用init()方法,如果以后接收到相同的Servlet处理请求,只会调用service()方法。
当Servlet接收到客户端的请求时,会调用Servlet的service()方法予以响应。
即应在service()方法内编写相应的程序代码,来处理客户端的请求。
以下是Servlet类所定义的service()方法原型:
Publicvoidservice(ServletRequestreq,ServletResponseres)
当Servlet调用service()方法时,会传入一个ServletRequest对象与一个ServletResponse对象。
可以从ServletRequest对象获取用户的请求内容,然后将Servlet的处理结果置于ServletResponse对象。
如果开发Servlet,在HttpServlet类所定义的service()方法原型:
Publicvoidservice(HttpServletRequestreq,HttpServletResponseres)
从HttpServletRequest对象获取用户的请求内容,然后将Servlet的处理结果置于HttpServletResponse对象。
3.Servlet的卸载阶段
当Servlet容器认定某个Servlet不再需要提供服务时,它会调用Servlet的destroy()方法卸载Servlet,并释放这个Servlet所占用的资源,此Servlet的生命周期也随之结束。
在上面的三个过程中,init()方法只被调用一次,即第一次被请求时被调用。
service()方法在每次Servlet被请求时都会被执行。
编写Servlet必须熟悉Servlet相关的类的方法。
下面的小节将介绍Servlet相关的类的方法。
8.4Servlet相关的类与方法
开发Servlet相关的程序包主要有两个,即javax.Servlet和javax.Servlet.http。
Servlet执行javax.Servlet接口,可以通过直接执行javax.Servlet接口开发Servlet,但这样通常没有必要,因为大多数Servlet是针对HTTP协议的Web服务器,这样开发javax.Servlet的办法是使用javax.Servlet.http.HttpServlet类。
对于基于HTTP协议的Web开发,只需要使用javax.Servlet.http包中的类开发即可。
当客户端请求Servlet时,服务器端将接收两个类的对象,一个是ServletRequest,描述客户端对服务器的请求,另一个是ServletResponse,描述服务器端对客户端的响应。
Servlet类一般从HttpServlet类扩展而来,并拥有一些基本的方法。
这些方法可以被处理HTTP请求的HttpServlet类中的service()方法自动地调用。
这些方法如下。
1.doGet()
用来处理HTTP的GET请求。
这个方法响应客户端请求数据时的GET方法。
该方法默认抛出ServletExecption和IOexecption异常,返回一个HTTP的READ_REQUEST错误。
doGet()方法的格式为:
protectedvoiddoGet(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
2.doPost()
用来处理HTTP的Post请求。
这个方法响应客户端请求数据时的Post方法。
该方法默认抛出ServletExecption和IOexecption异常,返回一个HTTP的READ_REQUEST错误。
doPost()方法的格式为:
protectedvoiddoPost(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
3.init()
init()方法用来完成页面的一些初始化工作,如设置变量值和连接数据库等。
当Servlet第一次被请求时,该方法会被调用,以后再次请求时则不会调用。
该方法默认抛出ServletExecption异常。
init()方法的格式为:
protectedvoidinit(ServletConfigconfig)throwsServletExecption,
IOexecption;
4.service()
service()用来处理各个客户端的请求。
该方法默认抛出ServletExecption和IOexecption异常。
service()方法的格式为:
protectedvoidservice(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
5.destroy()
destroy()继承自HttpServlet类。
destroy()方法的格式为:
destroy()
6.doPut()
doPut()方法用来处理HTTP的PUT请求。
该方法默认抛出ServletExecption和IOexecption异常。
doPut()方法的格式为:
protectedvoiddoPut(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
7.doDelete()
doDelete()方法用来处理HTTP的DELETE请求。
该方法默认抛出ServletExecption和IOexecption异常。
doDelete()方法的格式为:
protectedvoiddoDelete(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
8.doHead()
doHead()方法用来处理HTTP的READ请求。
该方法默认抛出ServletExecption和IOexecption异常。
doHead()方法的格式为:
protectedvoiddoHead(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
9.doOptions()
doOptions()方法用来处理HTTP的PUT请求。
该方法默认抛出ServletExecption和IOexecption异常。
doOptions()方法的格式为:
protectedvoiddoOptions(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
10.doTrace()
doTrace()方法用来处理HTTP的PUT请求。
该方法默认抛出ServletExecption和IOexecption异常。
doTrace()方法的格式为:
protectedvoiddoTrace(HttpServletRequestRequest,HttpServletResponseResponse)throwsServletExecption,IOexecption;
8.5Servlet如何处理HTTP请求
当一个HTTP请求到来时,Web服务器会将请求对象封状在一个类型为HttpServletRequest的对象中,同时创建一个类型为HttpServletRequestHttpServletResponse的对象,提供给Servlet来输出响应信息,然后服务器就会调用被请求的doXXX()方法,并将这个对象作为参数输入。
每当客户浏览器的HTTP请求到来时,该HttpServlet对象的service()方法就会被自动调用,而不是直接调用doXXX()方法。
在HttpServlet中已经存在service()方法,其缺省的功能是调用与HTTP请求的doXXX()方法。
我们在实际编程时,一般只要覆盖响应的doXXX()方法即可,而不需要编写service()方法。
8.6Servlet的应用特性
虽然Servlet也可以用于生成动态网页,但随着JSP的出现,Servlet的这个功能逐渐让位给JSP了。
但Servlet依然具有JSP所不具备的功能和特性,主要体现在以下几个方面。
1.自动启动
JSP只有在客户端调用后,才能进行编译和初始化,而Servlet可以通过web.xml文件的项进行配置,使其在Web容器启动时自动初始化。
可以使用Servlet的这个特性完成Web应用程序的初始化工作,如下载数据字典、初始化配置信息等。
2.路径匹配影射
Servlet可以通过web.xml文件中的项配置路径匹配影射,对多个匹配的URL进行响应,而JSP只能通过一个具体的URL调用。
这个特性可以使你在请求进入某个具体的页面前截获并处理它,许多Web应用框架,如Struts、Spring都利用了Servlet的这个特性,在此基础上创建构架。
3.Servlet过滤器
Servlet过滤器继承自javax.servlet.http并实现javax.servlet.Filter的类,在请求到达服务器前和响应发往客户端前进行处理。
如可以利用Servlet的这个特性,实现以下功能。
●字符编码转换:
在JSP开发应用中,经常会遇到中文字符乱码现象。
在实际应用中,处理中文字符编码转换更是频繁和麻烦,因此,可以使用Servlet编写一个字符编码转换类来解决这一问题。
●网页添加统一的标题或注脚:
很多网页需要统一的标题或脚注,可以通过Servlet过滤器在响应返回到客户端前给网页添加统一的标题或脚注。
●进行安全控制:
用户登录系统后,一般都会将用户信息保存到会话session中,可以通过过滤器在请求进入JSP或Servlet之前判断session中是否有用户信息,如果有说明用户已经登录系统,否则,说明用户还没有登录,将请求重新登录到重定向到用户登录页面。
4.Servlet监听器
Servlet监听器是继承自javax.servlet.http并实现这些事件监听借接口的类。
如果Web应用服务器对某个Web容器的事件感兴趣,就可以构造一个实现该事件监听接口的Servlet,以便在该事件发生时实现某些功能。
在Web应用开发中灵活地使用Servlet监听器,可以使原来一些很难实现的操作变的容易和快捷。
【要点提示】
如果一个动态网页的页面逻辑少而业务逻辑多,那么使用Servlet比使用JSP更为合适,否则使用JSP比使用Servlet更为合适。
8.7创建简单的Servlet
下面通过一个简单的Servlet应用介绍一下如何创建Servlet。
Eclipse提供了一个向导,可以轻松地创建一个Servlet应用程序。
关于Eclipse开发工具的应用将在第十章详细介绍。
(1)首先在Eclipse中创建工程ServletTest。
(2)在工程ServletTest中创建名为SampleServlet的Servlet。
打开File|New|Other,在New对话框的Web项下选择Servlet,点击Next按钮,弹出CreateServlet对话框,如图8-1所示。
图8-1“OblectGallery”对话框(选择StandardServlet)
(3)在CreateServlet对话框中,Javapackage填写包的名字com,Classname填写Servlet的名字SampleServlet,SupperclassServlet填写默认的javax.servlet.http.HttpServlet,单击【Finish】按钮,完成Servlet创建。
如图8-2所示。
图8-2Eclipse向导自动生成的Servlet
(4)修改Eclipse自动生成Servlet代码为如下代码。
具体代码如例程8-1所示。
【例程8-1】SampleServlet.java
packagecom;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.io.*;
publicclassSampleServletextendsHttpServlet{
publicvoidinit()throwsServletException{
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=GB2312");
PrintWriterout=response.getWriter();
out.println("");
out.println("
out.println("
");out.println("
这是一个简单的Servlet
");out.println("");
out.println("");
out.close();
}
}
这段代码解释如下:
●packagecom:
指明Servlet所在的包;
●importjavax.servlet.*和importjavax.servlet.http.*:
指明Servlet所需要的基本包。
所有的Servlet都必须使用javax.servlet.http接口,通常将直接继承类HttpServlet,HttpServlet封装了编写基于HTTP协议Servlet的大部分功能。
如果编写的Servlet与HTTP协议无关,那么就必须继承GenericServlet类。
●publicclassSampleServletextendsHttpServlet:
声明了SampleServle类。
通过覆盖doGet方法来响应处理HTTP的GET请求。
doGet方法有两个参数request和response,他们的类型分别是HttpServletRequest和HttpServletResponse。
HttpServletRequest、HttpServletResponse和PrintWriter都是Servlet中应用最为广泛的对象。
●response.setContentType("text/html;charset=GB2312"):
该语句调用HttpServletResponse对象的setContentType()方法来设置中文网页字符编码。
●PrintWriterout=response.getWriter():
该语句调用HttpServletResponse对象的getWriter()方法,返回字符流对象out。
●out.println():
该语句使用out对象的println()方法将Html脚本输出,这是编写Servlet最为常用的方法。
本例运行结果如图8-3所示。
图8-3简单的Servlet
8.8部署Servlet程序
部署Servlet程序的方法有两种,一种是部署后所有的应用程序都可以使用,可以把编译后的class文件拷贝到安装目录的classes子目录下;另一种是在部署后仅在当前应用中有效,可以把class文件拷贝到当前应用的WEB-INF/classes子目录下。
部署Servlet程序要编写web.xml文件。
一个规范的Web应用程序,在WEB-INF目录下应该有一个web.xml文件,用于对Web应用程序的属性进行设置。
在web.xml文件中,可以定义以下内容:
●Web应用项目的名称和说明。
●环境参数的初始化。
●Servlet的名称和映射。
●TagLibrary的配置。
●JSP网页的相关配置。
●MIMETYE的配置。
●错误处理。
●JNDI的配置。
这里着重介绍一下Servlet的名称和映射关系。
web.xml文件中Servlet的一般语法如下。
xmlversion="1.0"encoding="ASCII"?
>
xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns="xmlns: web="xsi: schemaLocation="version="2.5">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JSP 开发 Servlet 技术 应用