开发者社区> 二哥聊RPA> 正文

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

简介:
+关注继续查看

“眨眼间,离上一篇写技术博文时隔1个月。怕自己真的生疏了,都是备案太慢惹得。哈哈,继续high~ ”

[JavaEE 要懂的小事] Http相关 ,一直想写点Web开发相关的。最近项目接口开发紧,还有准备新的九月份战斗。JDK IO源码就隔一段落,温故知新看看Servlet & JSP 相关。把自己基础累积回顾一遍,并和大家分享分享一些心得和代码。这里应该涉及到一部分源码,开发思想和一些手工做出的图。喜欢java,或者有一定Java开发经验的多提宝贵意见。

一、Web服务器

从事web开发的人,会很清楚一个东西叫HTTP服务器,比如JEE开发—TomcatJetty,.NET开发—ISS等。HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏览器进行信息交流。下面就是HTTP服务器简单交互图:(来自[JavaEE 要懂的小事] Http相关 博客)

1_thumb3

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

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

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

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

image001

二、Tomcat 简单说几句

如图,Tomcat 包含了核心服务模块:Connector连接模块 和 Container 容器。Tomcat Server 核心是一个 Servlet/JSP Container。对每一个HTTP请求,过程如下

— 获取连接

— Servlet来分析请求HttpServletRequest

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

— 产生相应的响应HttpServletResponse

— 关闭连接

如图:

Tomcat相关

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

三、我第一个Servlet

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

 JavaEE 6文档中,介绍如下

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

1
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的抽象类。”

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

光说不练假把式,练一个“Hello,Servlet/JSP World!”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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;
/*
 * Copyright [2015] [Jeff Lee]
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
/**
 * @author Jeff Lee
 * @since 2015-6-25 19:46:45
 *  HelloWrold案例
 */
@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即可

image

image

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

image

休息一下吧~ 看看小广告:

开源代码都在我的gitHub上哦 — https://github.com/JeffLi1993

三、分析源码

 

1
@WebServlet(urlPatterns = "/helloWorld.html")

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

1
@WebServlet(urlPatterns = { "/helloWorld01.html", "/helloWorld02.html" }

下面有个@Override,重写了父类HttpServletdoGet方法。我们先看看父类HttpServlet。HttpServlet是一个抽象类,它提供了以下方法:

— doGet  , 服务于 HTPP GET 请求

— doPost , 服务于 HTTP POST 请求

— doPut  , 服务于 HTTP PUT 请求

— doDelete,服务于 HTTP DELETE 请求

如图:

image

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

1
2
3
4
5
6
7
8
9
10
11
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 这里:

1
2
3
4
5
6
7
@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!”。

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

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

五、深入Servlet 具体过程

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

1
2
3
4
5
6
7
8
9
10
11
12
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,并创建一个线程用于处理本次请求。此时线程会将上面RequestResponse对象的索引传递给Servlet

— 新线程中的Servlet处理逻辑

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

过程图如下:

Tomcat相关

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

有些面试题会这样问:

Servlet是线程安全的吗?

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

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

六、小结

发现这一博客写的太多,回头一看。可以写成三个文章了。言归正传本文要点如下

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

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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
javaWeb 常见面试题 20道,建议收藏
javaWeb 常见面试题 20道,建议收藏
45 0
java程序员怎么创建自己的网站:第五章:图解阿里云服务器部署SpringBoot项目
java程序员怎么创建自己的网站:第五章:图解阿里云服务器部署SpringBoot项目
36 0
与JavaWeb相关的面试题(上)
1、HTTP 请求的 GET 与 POST 方式的区别,2、解释一下什么是 servlet、3、说一说 Servlet 的生命周期、4、Servlet 的基本架构,5、什么情况下调用 doGet()和 doPost(),6、Request 对象的主要方法,7、forward 和 redirect 的区别,9、JSP 的常用指令,10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别
37 0
Servlet实战编程
Servlet实战编程: 基于Servlet实现的简单登陆练习(附源码)
37 0
SpringBoot 基础知识汇总 (史上最全)
SpringBoot常用注解,起步依赖starter,配置文件格式,yml优先级,SpringBoot打包运行,starter和parent的区别,Restful接口请求风格。
58 0
SpringMVC实战入门教程,四天快速搞定springmvc框架!
SpringMVC 也叫Spring web mvc。是Spring 框架的一部分,是在Spring3.0 后发布的。 这里对SpringMVC框架进行一个简单的介绍: • springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。 • springmvc是一个基于mvc的web框架。 • springmvc 表现层:方便前后端数据的传输 • Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层 MVC是指,C控制层,M模块层,V显示层这样的设计理念,而SSM框架里面SPRING MVC本身就是MVC框架,
97 0
Javaweb、javaEE学习笔记基础知识 下
JSP(java Server page)Java服务器页面 1、 Servlet:看做是嵌入HTML标签的类(数据的控制) JSP:看做是嵌入Java代码的HTML(数据的显示) 2、 JSP的工作原理: 当页面第一次被请求时,把Java代码转换成Servlet,然后响应回去,之后请求,如果页面没有变化,直接响应就可以,如果Servlet发生变化,再请求时,重新转换成Servlet,然后再响应
63 0
Javaweb、javaEE学习笔记基础知识 上
Html 1、属性 align:对齐方式 bgcolor:背景颜色 target: _blank在新窗口打开 _self默认,在相同的框架打开 _parent在父框架集中打开 _top在整个窗口打开 framename在指定的窗口打开
93 0
web开发从入门到精通一(详细)
每次学点东西都喜欢总结一下,顺便可以分享给大家。因此,在博客写知识点总结无疑成为我们目前最喜欢的总结方式。 我们来介绍一下web开发 web的起源: 1989年CERN(欧洲粒子物理研究所)中由Tim Berners-Lee领导的小组提交了一个针对Internet的新协议和一个使用该协议的文档系统,该小组将这个新系统命名为World Wide Web,它的目的在于使全球的科学家能够利用Internet交流自己的工作文档。
87 0
+关注
二哥聊RPA
公号「二哥聊RPA」。关注我,一起洞察 RPA ◎ RPA创业者 ◎ 现明堂红木商业顾问,为十月结晶、可啦啦、鑫蜂维等多家企业提供 RPA 咨询服务 ◎ 希望帮助大家在 RPA 上做一些力所能及的事情
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
Spring框架入门
立即下载
Java Spring Boot开发实战系列课程【第7讲】:Spring Boot 2.0安全机制与MVC身份验证实战(Java面试题)
立即下载
Java基础入门(三)-阿里巴巴Java开发手册介绍
立即下载