1.Servlet功能
(1)简介
JavaServlet是与平台无关的服务器端组件,运行在Servlet容器中
Servlet容器负责Servlet和客户的通信以及调用Servlet的方法
Servlet和客户的通信采用“请求/相应”模式
(2)功能
——创建并返回基于客户请求的动态HTML页面
——创建可嵌入到现有HTML页面中的部分HTML页面
——与其他服务器资源(数据库、基于Java的应用程序)进行通信
2.Servlet生命周期
Servlet框架的核心是:javax.servlet.Servlet接口。所有的Servlet都必须实现这一接口
Servlet接口中定义了五个方法,其中三个方法代表了Servlet生命周期
——init方法:初始化Servlet对象
——service方法:响应客户请求
——destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源
Servlet生命周期分为三个阶段
——初始化阶段
——响应客户请求阶段
——终止阶段
(1)初始化阶段
下列时刻,Servlet容器装载Servlet
——Servlet容器启动时,自动装载某些Servlet
——Servlet容器启动后,客户首次向Servlet发出请求
——Servlet类文件被更新后,重新装载Servlet
Servlet装载后,Servlet容器创建一个Servlet实例,并且调用Servlet的init()方法,进行初始化。
在Servlet生命周期中,init方法只会被调用一次
程序示例:InitServlet.java
在web.xml文件中配置,可以使Servlet容器启动时,自动装载Servlet
启动服务器的时候,自动打印“init invoked”
(2)响应客户请求阶段
对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法
service方法从ServletRequest对象获得客户请求信息、处理该请求,并通过ServletResponse对象向客户返回响应结果
(3)Servlet终止阶段
当Web应用被终止、或Servlet容器终止运行(一个容器可以管理多个web应用)、或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy方法。在destroy方法中,可以释放Servlet所占用的资源
service方法程序示例:ServiceServlet.java,通过地址栏方式传递参数,通过地址栏方式向服务器发送请求时,这个请求一定是GET请求
当既有service方法、又有doGet方法时,程序实例和执行结果如下。此时doGet方法不执行了
分析service方法和doGet方法的关系:
HttpServlet类:提供一个抽象类,这个抽象类应该被继承,用来创建适合web的HTTP servlet。一个HttpServlet的子类,至少要重写以下的一个方法:
doGet,doPost,doPut,doDelete,init,destroy,getServletInfo
并不需要重写service方法,service方法将请求派发到每一个上述的doXXX方法
HttpServlet继承GenericServlet
总结:
(1)每一个Servlet都必须实现Servlet接口
GenericServlet是一个通用的、不特定于任何协议的Servlet,它实现了Servlet接口
HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要集成HttpServlet父类即可
(2)Servlet接口中定义了service方法,HttpServlet对该方法进行了实现,实现方式就是将ServletRequest与ServletResponse转换为HttpServletRequest与HttpServletResponse。
request =(HttpServletRequest)req;
response=(HttpServletResponse)res;
service(request,response);
转换完毕后,会调用HttpServlet类中,自己定义的service方法:
protected void service(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException
在该service方法中,首先获得请求的方法名,然后根据方法名,调用对应的doXXX方法,比如请求方法为GET,那么就调用doGet方法;请求方法为POST,就调用doPost方法
3.Servlet的API
Servlet框架由两个Java包组成:
——javax.servlet:定义了所有的Servlet类都必须实现或扩展的通用接口和类
——javax.servlet.http:定义了采用HTTP协议通信的HttpServlet类
4.创建并发布HttpServlet步骤
(1)继承HttpServlet抽象类
(2)覆盖HttpServlet的部分方法,如doGet()或doPost()
(3)获取HTTP请求信息,例如通过HttpServletRequest对象,来将所HTML表单提交的数据或URL上的查询字符串。
无论是HTML表单还是URL上的查询字符串,在HttpServletRequest对象中,都以:参数名/参数值的形式存放,可以通过getParameter(String name)方法,检索参数信息
(4)生成HTTP响应结果。通过HttpServletResponse对象生成响应结果。HttpServletResponse对象有一个getWriter()方法,该方法返回一个PrintWriter对象。使用PrintWriter的print()或println()方法,可以向客户端发送字符串数据流
5.理解ServletContext与JavaWeb应用的关系
当Servlet容器启动Web应用时,为每一个Web应用创建唯一的ServletContext对象。
把ServletContext看成一个Web应用的服务器端组件的共享内存
在ServletContext中可以存放共享数据,它提供了读取或设置共享数据的方法:
——setAttribute(String name,Object object)
——getAttribute(String name)
程序示例:使用ServletContext对象,实现一个网页计数器
CounterServlet.java
counter.jsp
6.Tomcat请求参数源代码分析
对于Tomcat来说,它会将客户传递过来的参数放在一个Hashtable中