一、servlet是什么?

是用java编写的应用在服务端的程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和修改数据,生成动态Web内容,例如页面等等。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

二、工作原理、流程

 

 

 

1、工作原理

Servlet容器(Tomcat)Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例

用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。

ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。

ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。

 对于每一个应用程序或系统,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。

2、工作模式

  • 客户端发送请求至服务器
  • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  • 服务器将响应返回客户端

3、servlet接口

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
 
    ServletConfig getServletConfig();
 
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
 
    String getServletInfo();
 
    void destroy();
}

 

1、生命周期方法:

init():很明显,servlet的初始化方法,依赖于servletConfig对象初始化。当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,在后续请求中不会再被Servlet容器调用。

service():每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init()方法初始化一个Servlet对象出来,然后会调用它的service()方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。

destroy():卸载应用程序或者关闭Servlet容器时,Servlet容器就会调用这个方法销毁Servlet。

 

2、其他方法:

getServletConfig():返回由Servlet容器传给init()方法的ServletConfig对象。

getServletInfo():返回Servlet的一段描述,可以返回一段字符串。

 

3、生命周期:

init( )->service( )->destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。

举例:

web.xml:

    <!--配置和映射servlet-->
    <servlet>
        <!--配置servlet的注册名-->
        <servlet-name>helloServlet2</servlet-name>
        <!--配置servlet的全类名-->
        <servlet-class>com.servlet.sc.HelloServlet2</servlet-class>
        <init-param>
            <!--初始化该servlet的配置参数-->
            <param-name>name</param-name>
            <param-value>lzg</param-value>
        </init-param>
        <!--初始化的顺序,0或正数直接加载,越小优先级越高,负数代表调用的时候才初始化-->
        <load-on-startup>-1</load-on-startup>
    </servlet>
    <!--配置servlet的映射-->
    <servlet-mapping>
        <!-- 需要和要映射的 servlet 节点的 serlvet-name 子节点的文本内容一致 -->
        <servlet-name>helloServlet2</servlet-name>
        <!--映射具体的访问路径,/代表该web应用的根路径-->
        <!--/*代表任何请求都会触发,/do代表以/do结尾的请求才会触发-->
        <url-pattern>/do</url-pattern>
    </servlet-mapping>

实体类:

import javax.servlet.*;
import java.io.IOException;
import java.util.Date;
public class HelloServlet2 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init-2");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("-2当前时间是:"+new Date());
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy-2");
    }
}

效果:

 参考博客:https://blog.csdn.net/qq_19782019/article/details/80292110

posted on 2020-11-17 10:31  幂次方  阅读(63)  评论(0编辑  收藏  举报