前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet: 全网最全Servlet详解

Servlet: 全网最全Servlet详解

作者头像
Freedom123
发布2024-03-29 13:42:41
1050
发布2024-03-29 13:42:41
举报
文章被收录于专栏:DevOpsDevOps

一、Web服务器

从事web开发的人,会很清楚一个东西叫 Web服务器,比如J2EE开—Tomcat,Jetty,.NET开发—IIS等。HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏览器进行信息交流。

1.HTTP服务器

HTTP服务器是Web服务器的一种,也是开发最常见的,自然还有其他方式进行信息交互,比如FTP文件服务器。Web服务器是可以向发出请求的浏览器提供文档的程序。其核心过程为连接过程 — 请求过程 — 应答过程 — 关闭连接。简单交互图:

2.Tomcat架构一张图:

Tomcat 包含了核心服务模块:Connector连接模块 和 Container 容器。Tomcat Server 核心是一个 Servlet/JSP Container。对每一个HTTP请求,过程如下:获取连接 — Servlet来分析请求(HttpServletRequest)— 调用其service方法,进行业务处理 — 产生相应的响应(HttpServletResponse)— 关闭连接。如下图:

蓝色线指向过程是请求,绿色线指向过程是响应过程。也就是上面Web服务器核心过程:“连接过程 — 请求过程 — 应答过程 — 关闭连接”

二、Servlet

Servlet 是运行在Web服务器的Java小程序。Servlet可以获取并针对Web客户端的请求作出响应。一般情况下,通过HTTP,即超文本传输协议,进行传输通信。Servlet 是Web服务器核心工作的抽象。它不单单只是实现HttpServlet,可能实现有FtpServlet。Serlvet是基于Java技术的Web组件,容器托管的,用于生产动态内容。它也是基于平台无关的Java类格式,被编译为平台无关的字节码,可以被基于Java技术的web server动态加载并运行。这里容器,有时候也称为servlet 引擎。在 JavaEE 6文档中,是这样介绍HttpServlet:“HttpServlet 提供了一个能被继承后创建一个适应Web网站的Http Servlet的抽象类。”

1.代码学习
代码语言:javascript
复制
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/helloWorld.html")
public class HelloWorldServletT extends HttpServlet{
     
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
        // 获取输出打印对象
        PrintWriter out = resp.getWriter();
        out.println("Hello,Servlet/JSP World!");
    }
}

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

你可看到网页上如下输出。这就是客户端从HttpServlet获取到的响应:

2.源码分析
代码语言:javascript
复制
@WebServlet(urlPatterns = "/helloWorld.html")

@WebServlet 注解用于声明一个HttpServlet的配置。其中,urlPatters = “/helloWorld.html”,urlPatterns复数形式,说明至少一个URL必须被申明。它和另一个value必须存在一个,但不能同时存在。如果要匹配多个URL路径的话,如下:

代码语言:javascript
复制
@WebServlet(urlPatterns = {"/helloWorld01.html", "/helloWorld02.html"}

下面有个@Override,重写了父类HttpServlet的doGet方法。我们先看看父类HttpServlet。HttpServlet是一个抽象类,它提供了以下方法: doGet , 服务于 HTPP GET 请求;doPost , 服务于 HTTP POST 请求; doPut , 服务于 HTTP PUT 请求;doDelete,服务于 HTTP DELETE 请求。

对于不同的请求,HttpServlet的子类必须相应的实现至少一个方法,通常来说,会是其中一个,这样代码比较清晰。那父类的doGet方法做了什么工作呢?

代码语言:javascript
复制
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
        }
    }

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

代码语言:javascript
复制
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    // 获取输出打印对象
    PrintWriter out = resp.getWriter();
    out.println("Hello,Servlet/JSP World!");
}

表示该HelloWorldServletT会接受Http GET请求,并OOM到HttpServletRequest,并执行里面的逻辑代码和返回响应。 这里从HttpServletResponse对象中获取到输出打印对象PrintWriter,然后输出了“Hello,Servlet/JSP World!”。

三、深入Servlet

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

代码语言:javascript
复制
public class HelloWorldServletT extends HttpServlet{
     
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
        // 获取输出打印对象
        PrintWriter out = resp.getWriter();
        out.println("Hello,Servlet/JSP World!");
    }
}

这过程总结如下: — 从浏览器(Client)获取连接”/helloWorld.html” — Tomcat Connector模块将请求(Request)传递给 Container模块 — Container 模块会做以下事情 —— 分析HTPP请求信息,组装成HttpServletRequest对象 —— 创建新的HttpServletResponse对象 —— 根据路由配置,搜索相应的Servlet,并创建一个线程用于处理本次请求。此时线程会将上面Request和Response对象的索引,传递给Servlet — 新线程中的Servlet处理逻辑 — 线程结束后,通过HttpServletResponse对象的PrintWriter,返回浏览器一个信息

过程图如下:

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

因此,Servlet对象实例化是在以第一次请求此Servlet时,如果访问后,实例对象存在内存中,只会在服务器停止时,它才会消失。它不会随着各个线程结束而结束。因此下次访问Servlet时,Servlet Container会搜索相应的Servlet,如果不存在,Container新建相应的Servlet。这也是我们想要的结果。

小结

本篇详细介绍了Servlet的执行过程以及原理,希望对大家有所帮助,文章中有什么错误的地方,也希望大家多多指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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