Servlet 知识点

什么是Servlet ?

''Java servlet is a Java program that extends the capabilities of a server.''
Java servlet是一个扩展了服务器功能的java程序。

Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:

  • 客户端发送请求至服务器端;
  • 服务器将请求信息发送至 Servlet;
  • Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  • 服务器将响应返回给客户端。

Servlet 生命周期

  1. 客户端请求该servlet
  2. 加载servlet类到内存
  3. 实例化并调用init()方法,初始化该servlet
  4. service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())
  5. 加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet

Servlet创建一个servlet实例

  • 一个客户端的请求到达Server
  1. Server 调用 Servlet 的 init() 方法。(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
  • 一个客户端的请求到达 Server
  1. Server 创建一个请求对象,处理客户端请求
  2. Server 激活 Servlet 的 service()方法,传递请求和响应对象作为参数
  3. service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
  4. service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
    一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法
  • 典型的Servlet声明周期是:
  1. 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器
  2. Servlet 容器在调用 service() 方法之前加载 Servlet
  3. 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法

工作模式

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

开发Servlet

Servlet 本身不能独立运行,需要在一个web应用中运行的
而一个web应用是部署在tomcat中的.

开发步骤:

  1. 创建web应用项目
  2. 编写Servlet代码
  3. 部署到tomcat中

coding...

Servlet coding is done so现在我们整理一遍工作流程

  • login.html
    打开一个静态的html页面,在这个页面中可以通过form,以post的形式提交数据
  • /login路径
  • 在上一步的login.html中,用form,把账号和密码,提交到/login这个路径(这里使用的方法是form表达的action = "login"),并且附带method="post"
  • 找到对应的Servlet
    tomcat接受到一个新的请求

http://127.0.0.1/login
其路径是/login,接着就到配置文件web.xml进行匹配,发现/login,对应的Servlet类是 LoginServlet。
接下来的逻辑,就会基于这个LoginServlet进行

  • 调用doGet或者doPost
    Tomcat从上一步拿到了LoginServlet的实例之后,根据页面login.html提交信息的时候带的method="post",去调用对应的doPost方法

  • request获取参数
    接着流程进入了doPost方法中,在这个方法中,通过参数request,把页面上传递来的账号和密码信息取出来

String name = request.getParameter("name");
String password = request.getParameter("password");
  • response设置响应
    骤 8 : response设置响应 顶 折
    接着,根据账号和密码是否正确(判断是否是admin和123), 创建不同的html字符串。
    然后把html字符串通过如下方式,设置在了response对象上
String html = null;
        if (name.equals("admin") && password.equals("123456")) {
            html = "<h2 style='color:green'>login success hello i am fungi8~!</h2>";
        } else {
            html = "<h2 style='color:red'>sorry login fail. Dr.fungi8 do not want to see you !</h2>";
        }
        PrintWriter writer = resp.getWriter();
        writer.println(html);

这里Servlet的工作就做完了

  • tomcat把html传递给浏览器
    在Servlet完成工作之后,tomcat拿到被Servlet修改过的response,根据这个response生成html字符串,然后再通过HTTP协议,这个html字符串,回发给浏览器,浏览器再根据HTTP协议获取这个html字符串,并渲染在界面上。
    这样在效果上,浏览器就可以看到Servlet中生成的字符串了。

Service()

Servlet 需要提供对应的doGet() 与 doPost()方法

  • doGet()
    当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法
    doGet()请求:

    • form默认的提交方式
    • 如果通过一个超链访问某个地址
    • 如果在地址栏直接输入某个地址
    • ajax指定使用get方式的时候
  • doPost()
    当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法
    doPost()请求:

    • 在form上显示设置 method="post"的时候
    • ajax指定post方式的时候
  • service()
    LoginServlet继承了HttpServlet,同时也继承了一个方法

service(HttpServletRequest , HttpServletResponse )

实际上,在执行doGet()或者doPost()之前,都会先执行service(),由service()方法进行判断,到底该调用doGet()还是doPost().可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的.所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了.


中文编码问题

  • 获取中文的参数
    为了成功获取中文参数,需要做如下操作
  1. login.html中加上

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码

  1. login.html的form的method修改为post
  2. 在servlet进行解码和编码
    byte[] bytes= name.getBytes("ISO-8859-1");
    name = new String(bytes,"UTF-8");
    先根据ISO-8859-1解码,然后用UTF-8编码这样就可以得到正确的中文参数了
    如果觉得麻烦可以使用:

request.setCharacterEncoding("UTF-8");
并且把这句话放在request.getParameter()之前


生命周期

  • 实例化 -> 初始化 -> 提供服务 -> 销毁 -> 回收资源
  1. 实例化
    当用户通过浏览器输入一个路径,这个路径对应的servlet被调用的时候,该Servlet就会被实例化。无论访问了多少次LoginServlet
    LoginSerlvet构造方法 只会执行一次,所以Serlvet是单例

  2. 初始化
    LoginServlet 继承了HttpServlet,同时也继承了init(ServletConfig) 方法。init 方法是一个实例方法,所以会在构造方法执行后执行。
    无论访问了多少次LoginSerlvet --> init初始化 只会执行一次

  3. 提供服务
    接下来就是执行service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法
    在service()中就会编写我们的业务代码,在本例中就是判断用户输入的账号和密码是否正确

  4. 销毁
    在如下几种情况下,会调用destroy():

  • 该Servlet所在的web应用重新启动.在serverl.xml中配置该web应用的时候用到了

<Context path="/" docBase="e:\project\j2ee\web" debug="0" reloadable="false" />
如果把 reloadable="false" 改为reloadable="true"就表示有任何类发生的更新,web应用会自动重启,当web应用自动重启的时候,destroy()方法就会被调用

  • 关闭tomcat的时候destroy()方法会被调用,但是这个一般都发生的很快,不易被发现
  1. 被回收
    当Servlet被销毁之后,发生GC会自动回收内存。

引用:

http://how2j.cn/k/servlet/servlet-jump/
https://en.wikipedia.org/wiki/Java_servlet
https://baike.baidu.com/item/servlet

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

推荐阅读更多精彩内容

  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,334评论 0 10
  • 0 系列目录# WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 本...
    七寸知架构阅读 13,753评论 22 190
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • 简介 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用...
    寒桥阅读 2,173评论 0 10
  • 一、党员民主生活会 作为一个还没因年龄而自动归为群众的共青团员,自然是无法参加如此严肃高端的党员民主生活会。那天所...
    遇见青丘阅读 1,402评论 4 20