Servlet

Servlet

一、servlet是什么?

Servlet是一个运行在Web服务器中的Java小程序,Servlet将会接收和响应来自Web客户端的请求,使用HTTP(超文本传输协议)进行通信。

Servlet是所有Web应用程序的核心类,它是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其他部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。

在JSP+Servlet+JavaBean开发模式中,JSP作为视图将数据展现给用户,Servlet作为控制器,统一调度用户的请求,JavaBean封装和处理数据。

二、servlet怎么用?

1、Servlet继承关系

Screenshot from 2019-06-16 16-02-19.png

)

(1)Servlet

所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的。Servlet只是一个简单接口,它包含了初始化并销毁Servlet和处理请求的方法。不过,无论什么类型的请求,甚至是非HTTP请求,也会调用service方法。

(2)GenericServlet

一般情况下,Servlet都继承自javax.servlet.GenericServlet。GenericServlet也是一个不依赖具体协议的Servlet,它只包含了一个抽象的service方法和几个用于日志操作的辅助方法。

(3)HttpServlet

javax.servlet.http.HttpServlet继承自GenericServlet,主要用来响应HTTP请求。HttpServlet实现了service方法。并且提供了响应每种HTTP方法类型的方法的空实现。

(4)ServletConfig

表示此Servlet在web.xml中的配置信息。web容器将配置信息封装为ServletConfig对象.

此外,可以用ServletContext对象表示一个web工程

获取ServletConfig对象和ServletContext对象
this.getServletConfig()
this.getServletContext()

2、HttpServlet中的方法

HTTP方法类型 Servlet方法 目的
GET doGet() 从指定的URL中获取资源
HEAD doHead() 与GET一致,唯一的区别在于该请求只返回页面的头部数据
POST doPost() 通常用于处理Web表单提交
PUT doPut() 存储URL中提供的实体
DELETE doDelete() 删除由URL标示的资源
OPTIONS doOptions() 返回支持的HTTP方法
TRACE doTrace() 用于诊断目的

3、Servlet的生命周期

(1)初始化调用init()

init()方法只会在web容器初始化Servlet时调用一次,只会调用一次

(2)服务器响应客户端时调用service()

每次客户端请求服务器,服务器进行响应时都会调用service()方法,会调用多次

(3)终止阶段调用destory()

当将web工程从web容器移除时,将会调用
destory()方法

4、Servlet的执行过程

(1)在浏览器地址栏中输入访问路径,向服务器发出请求。

(2)服务器根据请求的URL地址在web.xml文件中的<servlet-mapping>标签下的子标签<url-pattern>中寻找匹配路径,找到对应的<servlet-name>。

(3)服务器根据已经寻找到<servlet-name>找到<servlet-class>(包名+类名)。

<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">
         
  <!--表示应用程序在应用服务器中显示的名字-->
  <!--Tomcat管理器页面(显示出所有已安装应用程序的列表)中将显示出<display-name>标签中配置的名字-->
  <display-name>Hello Web Application</display-name>

  <!--配置Servlet,Web容器创建一个Servlet的实例-->
  <servlet>
    <servlet-name>hello</servlet-name><!--名称可以自定义-->
    <servlet-class>com.hello.Servlet.HelloServlet</servlet-class><!--指定要创建实例的Servlet类-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!--将Servlet映射为URL地址,告诉Servlet对哪些请求URL做出响应-->
  <!--<Servlet>标签和<Servlet-mapping>标签中的<servlet-name>需要一致,Web容器通过这种方式关联这两种配置-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/</url-pattern><!--URL的路径-->
  </servlet-mapping>
  
</web-app>

(4)服务器根据包名和类名寻找Servlet类(用户自定义的),创建Servlet实例。

(5)执行init方法

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }
}

(6)调用service方法

//GenericServlet类
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    //......
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}

//HttpServlet类
public abstract class HttpServlet extends GenericServlet {
    //.......
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException("non-HTTP request or response");
        }

        this.service(request, response);
    }
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long errMsg;
        if(method.equals("GET")) {
           //。。。。
        } else if(method.equals("HEAD")) {
            //。。。。
        } else if(method.equals("POST")) {
            this.doPost(req, resp);
        } else if(method.equals("PUT")) {
            this.doPut(req, resp);
        } else if(method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if(method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if(method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            //错误请求
        }

    }
}

(7)当Web应用程序被停止或卸载,或者Web容器关闭后,Servlet不在接收请求后,立即调用destroy方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容