Servlet 快速入门、执行流程、生命周期

目录

1 Servlet简介

2 Servlet快速入门

3 Servlet执行过程

4 Servlet对象的生命周期

5 Servlet的访问路径配置

6 IDEA工具帮忙创建Servlet时的注意事项(了解)


1 Servlet简介

Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序。
Servlet是用Java编写的服务器端程序,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

(1)狭义的Servlet是指Java语言实现的一个接口

(2)广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

2 Servlet快速入门

快速入门环节十分简单,虽然可能不理解为什么这么做,但相信说到“执行流程”部分的时候就清晰多了。总体快速入门步骤如下(前提是这个web工程绑定了Tomcat):

(1)创建类,实现Servlet接口的实现类,重写里面的5个抽象方法(实际上只重写了1个)。
(2)编写核心配置文件(告诉tomcat你实现的类是哪个)
(3)访问url

step1: 创建一个Java Enterprise项目,并选中“Web Application”,创建包和类, 实现Servlet的接口,如下图所示:

/**
 * servlet
 * server applet 运行在服务器端的程序(必须在服务器Tomcat中运行)、
 * 等待客户端连接,访问
 * servlet技术,即客户端交互技术,用于处理来自客户端的请求和相应
 * Sun公司,JavaEE平台上13个规范之一
 * 定义了一个接口:javax.servlet.Servlet
 *
 * Servlet快速入门
 * 1、创建类,实现Servlet接口的实现类
 * 2、重写里面的5个抽象方法
 * 3、编写核心配置文件(告诉tomcat你实现的类是哪个)
 *
 */
public class QuickStart implements Servlet{

    //接口中一共5个方法,先关注service方法,其他方法随后再说
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet快速入门");
        servletResponse.getWriter().write("hello");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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


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

    @Override
    public void destroy() {

    }
}

 step2: 在web.xml中配置刚才写好的Servlet实现类

 之所以要配置这个类,是因为要告诉Tomcat我们实现的Servlet接口到底是哪一个,后面Tomcat会拿这个实现类去做很多事情。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--配置我们自己的Servlet实现类信息-->
    <servlet>
        <!--定义Servlet的名字-->
        <servlet-name>quickStart</servlet-name>
        <!--实现类的全类名-->
        <servlet-class>com.lmy.servlet.QuickStart</servlet-class>
    </servlet>

    <servlet-mapping>
        <!--这个名字和上面的名字要一致-->
        <servlet-name>quickStart</servlet-name>
        <!--浏览器的访问路径-->
        <url-pattern>/quick</url-pattern>
    </servlet-mapping>

</web-app>

 step3: 访问servlet

访问浏览器:http://localhost:8080/web01/quick

最终再浏览器中打印出“hello”,这是由于重写了Servlet接口中的service方法的原因。

但是,为什么在浏览器中会打印出“hello”呢,Tomcat、Servlet到底做了什么?整个过程的执行流程是怎样的呢?请往下看~

3 Servlet执行过程

(1)接受并解析客户端浏览器的请求 "/web01/quick"
(2)拿到web.xml中Servlet实现类的全类名
(3)反射技术创建Servlet类的对象
(4)创建2个对象 Request、Response
(5)调用对象中的方法 service, 传递参数 Request, Response
(6)数据写在了Reponse对象的缓冲区中
(7)service方法结束后,数据从Response对象的缓冲区取出,组装成HTTP的响应信息, 回传给浏览器
(8)浏览器显示

4 Servlet对象的生命周期

(1)对象创建
默认:在客户端第一次访问的时候,对象会被创建(配置web.xml后,可以让tomcat一启动就马上创建Servlet对象而不是等到有了访问才创建,但是这个功能一般不用)
Servlet中有方法init() 对象创建时会调用该方法

(2)客户端访问
客户端每次请求Servlet,都会执行方法service()
只要有一个请求,就会执行一次

(3)对象销毁
tomcat服务器关闭时销毁对象,调用方法destory()
另外一个方法也可以销毁对象,且不需要关闭Tomcat服务器,那就是把web项目从Webapp中移除(点Deployment中的“Undeploy”那个朝左的红绿色箭头)

/**
 * Servlet 对象的生命周期
 * 1、对象创建
 * 默认:在客户端第一次访问的时候,对象会被创建(配置web.xml后,可以让tomcat一启动就马上创建Servlet对象而不是等到有了访问才创建,但是这个功能一般不用)
 * Servlet中有方法init() 对象创建时会调用该方法
 * 2、客户端访问
 * 客户端每次请求Servlet,都会执行方法service
 * 只要有一个请求,就会执行一次
 * 3、对象销毁
 * tomcat服务器关闭时销毁对象,调用方法destory()
 * 另外一个方法也可以销毁对象,且不需要关闭Tomcat服务器,那就是把web项目从Webapp中移除(点Deployment中的“Undeploy”那个朝左的红绿色箭头)
 */

public class LifeServlet implements Servlet {
    //创建Servlet对象时会调用该方法
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Tomcat调用init方法,Servlet对象被创建");
    }

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

    //浏览器请求时会调用该方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("客户端发请求了");
    }

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

    @Override
    public void destroy() {
        System.out.println("关闭tomcat服务器时,Servlet对象被销毁");
    }
}

如下:通过在web.xml 配置文件中新增一个标签: <load-on-startup>这是个常数,数字越小优先级越高</load-on-startup>
就可以控制Servlet对象的创建在启动Tomcat程序时就完成(而不是第一次客户端请求发来之后才创建Servlet对象)

<servlet>
        <servlet-name>life</servlet-name>
        <servlet-class>com.lmy.servlet.LifeServlet</servlet-class>
        <!--标签:Tomcat一启动就马上创建Servlet对象,而不是等到有客户端发请求时才调用,(标签中写任意整数,整数越小,启动的优先级就越高)但是这个功能一般不用-->
        <!--<load-on-startup>1</load-on-startup>-->
    </servlet>
    <servlet-mapping>
        <servlet-name>life</servlet-name>
        <url-pattern>/life</url-pattern>
    </servlet-mapping>

5 Servlet的访问路径配置

关于Servlet的访问路径(url)问题,之前只是简单的在代码中一笔带过,然而实际上关于访问路径还有一些可以了解的小知识。

<url-pattern></url-pattern>这个标签用于配置浏览器的访问路径,具体规则如下代码:

    <servlet>
        <servlet-name>config</servlet-name>
        <servlet-class>com.lmy.servlet.ConfigServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>config</servlet-name>
        <!--
        <url-pattern></url-pattern>配置浏览器的访问路径(虚拟路径)
        1、完全匹配方式,绝对匹配 “/路径”这是Servlet的最常用配置
        2、目录匹配 /aaa/bbb/* 只要前面aaa、bbb对上了,最后这个*写啥都行,但是这个方法不常用
        3、后缀名匹配 *.qqq 浏览器输入前面随意,最后必须是“.qqq”,这个也不常用
        注意:目录匹配和后缀名匹配不能同时使用
        其实在这里,对于servlet的配置,只要看“完全匹配”就可以了。
        -->
        <url-pattern>/config</url-pattern>
    </servlet-mapping>

6 IDEA工具帮忙创建Servlet时的注意事项

前面介绍了浏览器与服务器的请求与响应过程中,Servlet充当的角色,以及Servlet的生命周期问题,然而这些与Servlet相关的程序代码都是我们自己通过实现Servlet接口来自己写的。
比如我想在浏览器上打印一句话“hello”
我需要先写一个类来实现Servlet接口(在service方法中写:servletResponse.getWriter().write("hello"); ),然后在web.xml文件中进行相关的配置来保证程序能找到之前写的那个实现类。
这样才能完成了上面的目的。然而这些操作,IDEA也可以帮我们来完成一部分。

总而言之,上述内容无非两点:
(1)Servlet接口的实现
(2)接口实现类在配置文件中要有体现

通过IDEA可以完成上述操作:

 

上述的操作完成后,会自动地创建一个Servlet实现类 以及该实现类在配置文件中的信息。

注意如下:
(1)IDEA对于配置文件的创建,只会创建“一半”,另外一个mapping需要自己写,而且IDEA自动创建的配置文件的位置不太友好,需要自己调整
(2)关于实现类的创建,如下图;关于实现类模板的修改方式,如下图的下图。
(3)最后,我感觉这个功能虽说挺有些用,但是目前我还是觉得有点鸡肋。。。

/**
 * IDEA工具帮忙创建的Servlet
 * 包含两个方法,一个是doPost(处理Post请求)、另一个是doGet(处理Get请求)
 *
 * Servlet接口,是Sun公司标准
 * 标准操作:web.xml文件中配置过后,Tomcat引擎调用该接口实现类方法service,接着去处理请求信息(展示页面什么的)
 *
 * 结论:当客户端请求服务器时,Tomcat引擎会创建MyHttpServlet对象,调用方法service(),而service方法是它的父类HttpServlet实现的,
 * 然而在实现过程中,这个父类中的service方法又调用到了子类中的方法(doGet、doPost)
 *
 * 无论什么请求方式,都用一个方法来处理
 */
public class MyHttpServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用doGet()
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("GET");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值