Servlet学习1

Posted lucasblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet学习1相关的知识,希望对你有一定的参考价值。

一.Servlet介绍

  1. 什么是Servlet

    Servlet来自两个单词:Server和Applet,是一个在服务器上运行的Java程序。

    与普通Java程序不同的是,Servlet是由服务器去调用的,可以对浏览器或者其他HTTP客户端发送的请求进行 处理,从原理上来说,Servlet可以响应任何类型的请求,但绝大数情况下是用来扩展基于HTTP协议的web服务器。

  2. 为什么要使用Servlet

    Servlet可以处理请求和发送响应,使用Servlet跟浏览器交互 ,能生成动态Web内容。

  3. 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容器管理的。

  1. 在浏览器第一次请求服务时,容器将加载Servlet类,实例化一个Servlet对象出来,随即调用Servlet对象的init()方法完成初始化操作,只会调用一次。(后续的请求不会再调用init函数)
  2. 当浏览器请求Servlet时候,Servlet容器会调用对象的service()方法,开始进行工作,处理请求,作出响应给浏览器,都是在这里实现。
  3. 当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开发)

    操作步骤:

    1. 定义一个类继承自HTTPServlet。
    2. 重写doGet()和doPost()方法。

以上是关于Servlet学习1的主要内容,如果未能解决你的问题,请参考以下文章

filter与servlet

jsp初识servlet转发转发与重定向的比较

servlet和filter的区别

PHP必用代码片段

Servlet学习(代码)

IOS开发-OC学习-常用功能代码片段整理