什么是Servlet

Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据;
  • 处理请求;
  • 完成响应。

  例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。

Servlet的生命周期

所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:

  • void init(ServletConfig);
  • void service(ServletRequest,ServletResponse);
  • void destroy();

Servlet在第一次请求的时候,由Tomcat来创建, 马上调用init()方法, 用户每请求一次,都会调用一次service(),

当服务器关闭之前, 先销毁Servlet, 在销毁Servlet之前,调用destroy()方法.

实现Servlet有三种方式:

  1. 实现javax.servlet.Servlet接口;
  2. 继承javax.servlet.GenericServlet类;
  3. 继承javax.servlet.http.HttpServlet类;(推荐)

第一种方式: 实现javax.servlet.Servlet接口

1)

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_请求参数

2)

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_java_02

3) 访问:http://服务器ip:服务器端口/项目名/servlet的url

访问这个servlet的url:http://localhost:8888/les02/hello

 

Servlet是一个线程不安全的, Tomcat会为每一次请求创建一个线程, 我们web项目是一个多线程的项目

默认情况:  Servlet的创建是在第一次请求这个Servlet的时候,创建, 为了Tomcat启动快, 从用户角度来看: 第一个访问的用户耗时多一点, 耗费创建Servlet的时间,  第一次惩罚

    Tomcat:第一步判断这个Servlet类有没有创建对象如果对象。
    直接通过这个类的对象调用service0方法处理用户请求
    如果没有: Tomcat先创建这个类的对象,然后通过对象调用service()

第二种方式: 继承GenericServlet类

   GenericServlet这个类是Servlet的一个实现类, 它是一个抽象类, service()没有重写

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_java_03

第三种方式: 继承HttpServlet类 (推荐)

  HttpServlet是GenericServlet的子类, 也是一个抽象类

1)

    doGet() 处理Get请求

       doPost() 处理Post请求

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_服务器_04

2)

Servlet接口相关类型

在Servlet接口中还存在三个我们不熟悉的类型:

  • ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
  • ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
  • ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的<servlet>元素。

ServletRequest对象常用的方法: getParamenter(String name)    获取请求参数, 通过请求参数名获取请求参数的值

ServletResponse对象常用的方法: getWriter()  /  getOutputStream() 响应对象方法: 后台把数据响应给前端, 使用输出流 (两个流只能选一个)

ServletConfig对象常用的方法: 获取指定的Servlet的配置信息,每一个Servlet都有自己的配置信息,

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_服务器_05

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_请求参数_06

@Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        //获取请求参数
        String name = req.getParameter("name");
        System.out.println("前端传递的参数name的值:"+name);
        //给客户端响应:  响应到客户端浏览器上   类似于js,  document.write()
        //得到响应输出流
        res.getWriter().write("<h1>hello client</h1>");

        //获取Servlet初始化参数
                String servletName = config.getServletName();
        String encoding = config.getInitParameter("encoding");
        String age = config.getInitParameter("age");        
        res.getWriter().print("<h1>"+servletName+","+encoding+","+age+"</h1>");
    }

View Code

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_服务器_07

 

  • getServletContext() :获取ServletContext对象  
  • getServletName() : 获取Servlet的name
  • getInitParament(String name) : 获取Servlet的初始化参数(在<servlet>中配置的参数)
  • getInitParaments() : 获取Servlet请求参数所有的name的值,返回的是一个集合, 

HttpServlet调用源码分析

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_请求参数_08

 三种创建方式的关系可用下图表示:

java 每次请求创建一个单独定时器 每次请求都会创建servlet吗?_java_09