前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解 & 深入浅出 JavaWeb:Servlet必会必知

图解 & 深入浅出 JavaWeb:Servlet必会必知

作者头像
养码场
发布2018-08-13 17:52:59
5570
发布2018-08-13 17:52:59
举报
文章被收录于专栏:养码场

今天由场子里的养码人子木为大家带来一篇关于servlet的技术专贴,希望与大家交流经验,共同进步!

-1-

Web服务器

从事web开发的人,会很清楚一个东西叫HTTP服务器,比如JEE开发—Tomcat,Jetty,.NET开发—ISS等。

HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏览器进行信息交流。下面就是HTTP服务器简单交互图:

HTTP服务器是Web服务器的一种,也是开发最常见的,自然还有其他方式进行信息交互,比如FTP文件服务器…

Web服务器是可以向发出请求的浏览器提供文档的程序。其核心过程为

连接过程 — 请求过程 — 应答过程 — 关闭连接

这让我想到了Tomcat架构的一张图:

-2-

Tomcat 简单说几句

如图,Tomcat 包含了核心服务模块:Connector连接模块 和 Container 容器。

Tomcat Server 核心是一个 Servlet/JSP Container。

对每一个HTTP请求,过程如下

获取连接

Servlet来分析请求(HttpServletRequest

— 调用其service方法,进行业务处理

— 产生相应的响应HttpServletResponse

关闭连接

如图:

蓝色线指向过程是请求,绿色线指向过程是响应过程。

也就是上面Web服务器核心过程:“连接过程 — 请求过程 — 应答过程 — 关闭连接

-3-

我第一个Servlet

什么是Servlet?(每次都会不停的问自己,这是什么“What”?紧接着应该是什么用“How”吧)

在 JavaEE 6文档中,介绍如下

Servlet 是运行在Web服务器Java小程序。Servlet可以获取并针对Web客户端的请求作出响应。一般情况下,通过HTTP,即超文本传输协议,进行传输通信。”

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.

所以,Servlet 是Web服务器核心工作的抽象

它不单单只是实现HttpServlet,可能实现有FtpServlet(这个我猜的)等。相对较多的Web开发,知道的肯定是HttpServlet。

在 JavaEE 6文档中,是这样介绍HttpServlet

“HttpServlet 提供了一个能被继承后创建一个适应Web网站的Http Servlet的抽象类。”

Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site.

光说不练假把式

练一个“Hello,Servlet/JSP World!”:

右键该HelloWorldServletT.java文件 — Run As — Run On Server — 选择Tomcat服务器 — Finish即可

等待片刻,你可看到网页上如下输出。

这就是客户端从HttpServlet获取到的响应:

-4-

分析源码

@WebServlet 注解用于声明一个HttpServlet的配置。

其中,urlPatters = “/helloWorld.html”,urlPatterns复数形式,说明至少一个URL必须被申明。

它和另一个value必须存在一个,但不能同时存在。如果要匹配多个URL路径的话,如下:

下面有个@Override,重写了父类HttpServlet的doGet方法。

我们先看看父类HttpServlet。

HttpServlet是一个抽象类,它提供了以下方法:

— doGet , 服务于 HTPP GET 请求

— doPost , 服务于 HTTP POST 请求

— doPut , 服务于 HTTP PUT 请求

— doDelete,服务于 HTTP DELETE 请求

...

如图:

对于不同的请求,HttpServlet的子类必须相应的实现至少一个方法,通常来说,会是其中一个,这样代码比较清晰。

那父类的doGet方法做了什么工作呢?

这里就简单的获取了下HTTP协议及Http Local信息,然后可以协议是否是1.1,做出分别是405或者400HTTP状态码的响应。

回到HelloWorldServletT.java 这里:

表示该HelloWorldServletT会接受Http GET请求,并OOM到HttpServletRequest,并执行里面的逻辑代码和返回响应。

这里从HttpServletResponse对象中获取到输出打印对象PrintWriter,然后输出了“Hello,Servlet/JSP World!”。

完毕!哦还有一点补充补充补充:

print,这里还好一句话。如果打印个table会很麻烦,因此有一个JSP的东西出现了,是Servlet的HTML化身。

-5-

深入Servlet 具体过程

又回到这个简单的 Get Servlet代码:

这过程总结如下:

— 从浏览器(Client)获取连接”/helloWorld.html

Tomcat Connector模块将请求(Request)传递给 Container模块

Container 模块会做以下事情

—— 分析HTPP请求信息,组装成HttpServletRequest对象

—— 创建新的HttpServletResponse对象

—— 根据路由配置,搜索相应的Servlet,并创建一个线程用于处理本次请求。此时线程会将上面RequestResponse对象的索引传递给Servlet

— 新线程中的Servlet处理逻辑

线程结束后,通过HttpServletResponse对象的PrintWriter,返回浏览器一个信息

过程图如下:

蓝色线指向过程是请求,绿色线指向过程是响应过程,橙色线指向过程是内部处理过程。

有些面试题会这样问:

Servlet是线程安全的吗?

不是,一个servlet实现类只会有一个实例对象,多个线程是可能会访问同一个servlet实例对象的,线程安全问题都是由全局变量及静态变量引起的。

因此,Servlet对象实例化是在以第一次请求此Servlet时,如果访问后,实例对象存在内存中,只会在服务器停止时,它才会消失。

它不会随着各个线程结束而结束。

因此下次访问Servlet时,Servlet Container会搜索相应的Servlet,如果不存在,Container新建相应的Servlet。

这也是我们想要的结果。

-6-

小结

本文要点如下:

1、简单介绍Web服务器 及 Tomcat容器

2、第一个Sevlet的开发及使用

3、深入源码及api介绍使用

4、总结一次请求及响应的真实过程

5、欢迎点击我的博客及GitHub — 博客提供RSS订阅哦

子木

来自

养码场技术

交流1群的养码人

养码人介绍

Java工程师一枚,多个小开源项目发起人,并发编程网专栏技术分享家。酷爱分享写文,曾参与编写《企业级Java EE架构设计精深实践》,坚持更新博客三年,原创博文已达至100多篇。主要分享 Java 后端分布式技术和架构干货及工作上的思考。

做快乐的事,帮助社会与人。

个人微信公众号:BYSocket泥瓦匠(ID:bysocket)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 养码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档