Servlet学习1
Posted lucasblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet学习1相关的知识,希望对你有一定的参考价值。
一.Servlet介绍
-
什么是Servlet
Servlet来自两个单词:Server和Applet,是一个在服务器上运行的Java程序。
与普通Java程序不同的是,Servlet是由服务器去调用的,可以对浏览器或者其他HTTP客户端发送的请求进行 处理,从原理上来说,Servlet可以响应任何类型的请求,但绝大数情况下是用来扩展基于HTTP协议的web服务器。
-
为什么要使用Servlet
Servlet可以处理请求和发送响应,使用Servlet跟浏览器交互 ,能生成动态Web内容。
-
tomcat和servlet的关系
tomcat是web应用服务器,是一个Servlet/JSP容器,Tomcat能够处理客户请求,把请求传给servlet,并且将servlet的响应回送给客户端。
工作模式是:
- 客户端浏览器发送请求到服务器(tomcat)
- 服务器(tomcat)启动并且调用Servlet,Servlet根据客户端请求生成响应,将响应内容传给服务器
- 服务器将响应返回客户端
二.Servlet的工作原理
? Servlet本质上就是一个Java接口,所有Servlet类必须直接或间接实现。
? Servlet接口中定义了以下方法:
public void init(ServletConfig servletConfig) throws ServletException
public ServletConfig getServletConfig()
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException
public String getServletInfo()
public void destroy()
当用户发送请求到服务器时,服务器将使用Servlet容器调用servlet的Service()方法,并且会传入一个ServletRequest对象和一个ServletResponse对象,这两个对象都是由Servlet容器创建的,程序员不需要实现,可以直接使用。
容器将当前的请求封装在了ServletRequest对象,开发者可以不需要去解析原始的HTTP数据,直接调用封装好的方法即可,而当开发者要返回响应给客户端时,只需操作ServletResponse对象就可以了。
对于每一个应用程序,Servlet容器还会创建一个ServletContext对象,这个对象封装了应用程序的环境详情,每一个应用程序只有一个ServletContext,可以通过ServletContext获取一些信息。
三.Servlet的生命周期
? 在Web容器中,Servlet主要经历3个阶段,这3个阶段就是Servlet的生命周期,主要是init(),service()和destroy()方法,这一部分都是由Servlet容器管理的。
- 在浏览器第一次请求服务时,容器将加载Servlet类,实例化一个Servlet对象出来,随即调用Servlet对象的init()方法完成初始化操作,只会调用一次。(后续的请求不会再调用init函数)
- 当浏览器请求Servlet时候,Servlet容器会调用对象的service()方法,开始进行工作,处理请求,作出响应给浏览器,都是在这里实现。
- 当web容器关闭时,会调用Servlet对象的destroy()进行资源的释放,然后该对象会被垃圾回收器回收。
下面编写一个简单的Servlet来验证Servlet的生命周期:
如何创建项目可以参考另一篇文章:Idea创建JavaWeb项目以及配置Tomcat
package cap.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/TestServlet")
public class TestServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet初始化....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet正在工作...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet正在销毁...");
}
}
这里使用了注解的方式配置访问的路径为/TestServlet.
在浏览器中访问该Servlet,控制台会输出如下信息:
第一次访问,会调用init(),再调用service(),所以会先打出“Servlet初始化..." 和"Servlet正在工作..."
然后刷新几次,只会调用service(),打印出"Servlet正在工作..."
最后当关闭tomcat后,会调用destroy(),打印出"Servlet正在销毁"
四.Servlet的体系结构
? Servlet是一个接口,在包javax.servlet.Servlet
,它的实现类是:GenericsServlet
.
? javax.servlet.GenericsServlet
是一个抽象类,有一个直接的子类:HttpServlet
.
? javax.servlet.http.HttpServlet
也是一个抽象类,继承自GenericsServlet
.
? 如下图:
-
GenericsServlet
:将Servlet接口中的其他方法做了默认的空实现,只将service()方法作为抽象方法,以便将来定义Servlet类时,直接继承GenericsServlet,只要实现service()就可以。 -
HttpServlet
:对HTTP协议做了封装,简化了操作(后面都以继承HttpServlet开发)操作步骤:
- 定义一个类继承自HTTPServlet。
- 重写doGet()和doPost()方法。
以上是关于Servlet学习1的主要内容,如果未能解决你的问题,请参考以下文章