Servlet —— Tomcat, 初学 Servlet 程序

JavaEE传送门

JavaEE

HTTP —— HTTP 响应详解, 构造 HTTP 请求

HTTPS —— HTTPS的加密方式


目录

  • Tomcat
  • Servlet
    • hello world
    • 创建项目
    • 引入 Servlet 依赖
    • 创建目录结构
    • 编写代码
      • doGet
    • 打包程序
    • 部署程序
    • 验证程序


Tomcat

Tomcat 是一个 HTTP 服务器

HTTP 客户端, 就是大家平时用到的浏览器.

HTTP 服务器, 需要开发实现一个服务器, 搭建网站的 “后端部分”.

开发实现一个服务器, 本质上就是写个 TCP socket 服务器. 但是比较麻烦, 有很多重复性工作.

业界就有一些大佬实现了一些现成的 HTTP 服务器, 我们进行开发网站, 就不必从头去写了, 只需要基于这些 HTTP 服务器, 进行二次开发即可.

下载Tomcat

Servlet —— Tomcat, 初学 Servlet 程序_第1张图片

简单介绍

Servlet —— Tomcat, 初学 Servlet 程序_第2张图片

webapps 中放的是我们想要部署的网站

Servlet —— Tomcat, 初学 Servlet 程序_第3张图片

就可以把前端和后端的代码拷贝到这个目录中.

每个目录都可以视为是一个 webapp (网站)

ROOT 目录

ROOT 目录里放的就是欢迎页面

启动 Tomcat, 双击 startup.bat

看到这个信息, 说明启动成功!

如果有问题, 可以把 bat 拖到 cmd 中运行, 查看报错信息是什么.

在浏览器上输入 127.0.0.1:8080

如果出现这样的页面, 说明 Tomcat 启动正常 (Tomcat 默认端口: 8080)

Servlet —— Tomcat, 初学 Servlet 程序_第4张图片

我们写一个 .html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>
<body>
    <style>
        div {
            font-size: 40px;
            color: hotpink;
            font-weight: 500;
        }
    style>
    <div>Gujiu ! !div>
body>
html>

将其移动到 ROOT 中

Servlet —— Tomcat, 初学 Servlet 程序_第5张图片

在 127.0.0.1:8080 后面加上 /gujiu.html

Servlet —— Tomcat, 初学 Servlet 程序_第6张图片

这个页面就是通过 Tomcat 这个 http 服务器来获取到的.

既然都可以双击本地打开, 为什么还要通过 Tomcat 折腾一下?

  • 本地打开只能访问你自己电脑的.

  • 使用 Tomcat 可以通过网络访问到别人电脑的网页.

# 注意事项 #

我们如果把所有文件都直接放到 ROOT 里, 就会弄得很乱, 一般我们都会新建一个文件夹.

Servlet —— Tomcat, 初学 Servlet 程序_第7张图片

gujiu.html 放到 Gujiu 下. 输入如下地址.

Servlet —— Tomcat, 初学 Servlet 程序_第8张图片


Servlet

Servlet 就是 Tomcat 给程序员提供的进行二次开发的 API, 学了这些 API 就可以比较方便的写出一个网站的后端程序了.

动态页面 vs 静态页面

  • 静态页面: 页面的内容, 是固定 (以文件的形式, 静静的躺在你的硬盘的指定目录中).

    无论什么时候, 无论谁来访问,得到的页面效果, 都一样.

  • 动态页面: 不是一个真实的硬盘的文件, 而是通过代码在内存中构造出一个 “虚拟的资源”.

    就可以根据你访问的时间的不同, 访问的人的不同, 访问时带有的参数不同, 就可以构造出不同的页面来了.

  • 静态页面部分拷贝到 webapps 里就行; 动态页面就需要基于 servlet.


hello world

写一个 Servlethello world

  1. 创建项目
  2. 引入 Servlet 依赖
  3. 创建,目录结构
  4. 编写代码
  5. 打包程序
  6. 部署程序
  7. 验证程序

这里和 JDBC 差不多, 都是固定套路


创建项目

创建一个 maven 项目

Servlet —— Tomcat, 初学 Servlet 程序_第9张图片

目录结构

Servlet —— Tomcat, 初学 Servlet 程序_第10张图片

小知识:

maven 是一个构建工具 (build,包括不限于: 编译, 打包, 部署)

# 之前写代码,都是直接在 idea 中, 点击 main 方法前的 三角号, 就自动编译程序

# 这种方式针对一些比较简单的程序还好, 如果是一些更复杂的程序, 尤其是有多个模块, 并且互相依赖. 这时我们直接点运行就没有那么容易了.

比如 A 依赖 B, B 依赖 C.

此时你要想编译运行 A, 就必须先编译运行 B, 要想编译运行 B, 就需要先编译运行 C.

# 构建工具, 就是为了解决这个问题, 使我们在开发比较复杂的项目的时候, 也可以比较方便的进行编译和打包操作

# 我们这里使用 maven 主要就是借助 maven 进行编译, 打包, 管理依赖…


引入 Servlet 依赖

Servlet 不是 Java 标准库自带的, 要想使用, 就需要额外的下载安装, 并引入到项目中.

maven 的一个核心功能, 就是能够自动的管理依赖, 就会把咱们使用的库中依赖的东西, 自动从中央仓库中下载下来

中央仓库链接

Servlet —— Tomcat, 初学 Servlet 程序_第11张图片

选择 3.1.0 版本.

# 注意 # servlet 3.1.0 和 Tomcat 8.5 和 jdk 8 是配套的.

Servlet —— Tomcat, 初学 Servlet 程序_第12张图片

选择 maven 把 maven 中的这段内容复制出来, 然后粘贴到 pom.xml

复制的内容, 粘贴到 \ 这个标签中

<dependencies>
    
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>javax.servlet-apiartifactId>
        <version>3.1.0version>
        <scope>providedscope>
    dependency>
dependencies>

# 注意事项 #

拷贝过来, 可能是标红的.

当我们把他拷贝过来, idea 就会自动根据你这里写的内容, 从中央仓库上下载依赖.

在这个依赖下载好之前, 这里都是标红的, 在下载过程中, 我们需要耐心等待.

如果等了很久, 还是标红的, 就可以尝试手动刷新一下. (在 idea 的最右侧边边上, 有一个 maven, 鼠标点击 maven )


Servlet —— Tomcat, 初学 Servlet 程序_第13张图片


创建目录结构

虽然 maven 已经给我们创建出了一些目录了, 但是还不够

我们需要搞得是一个 符合 Tomcat 要求的目录结果

Servlet —— Tomcat, 初学 Servlet 程序_第14张图片

Servlet —— Tomcat, 初学 Servlet 程序_第15张图片

Servlet —— Tomcat, 初学 Servlet 程序_第16张图片

我们还需要再 web.xml 中填入下面这段代码

DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Applicationdisplay-name>
web-app>

# 注意事项 #

webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等.

在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源.

Servlet —— Tomcat, 初学 Servlet 程序_第17张图片

这里的作用: 验证 + 补全

这里标红, 只是影响到 idea 对于 web.xml 的验证和补全

可以 alt + enter 使其不再标红.


编写代码

# 要把代码放到 java 目录下, 我们创建一个 helloServlet

# 我们先要 extends HttpServlet 这个类, 但是这里有时会标红.

这个类来自于, 刚才通过 maven 下载的那个 servletjar 包. 报红的原因可能有:

  1. 之前下载的有问题
  2. 没有正确的导入到

解决方法: 点击刷新按钮尝试

doGet

# 重写 doGet 方法

public class helloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //注意, 自动生成的这个调用父类方法的代码, 一定一定要注释掉, 不然会出问题!!
        //super.doGet(req, resp);
    }
}

doGet 方法 就是 HttpServlet 父类里已经包含的方法了, 此处是需要 Overide 父类的方法

doGet 表示: 当前 Tomcat 在收到某些 GET 请求的时候, 会调用这个 doGet 方法.

Servlet —— Tomcat, 初学 Servlet 程序_第18张图片

此处 doGet 做的工作, 就是 “根据请求, 计算响应”.

doGet 就需要根据 req 里的一些数据 + 业务逻辑构造生成一个完整的 resp 对象.

再进一步, tomcat 就把 resp 对象转成一个 HTTP 响应报文.

典型的服务器要做三件事:

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应结果返回给客户端

1 和 3 都是固定的套路, 2 则是我们需要实现的业务逻辑 (可能比较简单, 也可能非常复杂)

# 编写如下代码

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 注意, 自动生成的这个调用父类方法的代码, 一定一定要注释掉或删掉
        // super.doGet(req, resp);

        // 是 Tomcat 这边打印这个日志
        System.out.println("hello");
        // 还可以给客户端返回这个 hello
        resp.getWriter().write("hello");
    }
}

Servlet —— Tomcat, 初学 Servlet 程序_第19张图片

当我们发送的请求是 GET 路径是 /hello .此时 Tomcat 才会调用到这里的 doGet 方法.

Tomcat 可以让你关联上很多路径.

可以给请求中的不同路径, 关联上不同的类, 也就是执行了不同的方法了.

小知识:

/hello 其实就是一个 “虚拟的资源”.

硬盘上目录中是没有这个 /hello 文件,浏览器访问这个路径的资源, 就通过 servlet 代码, 直接返回了一个 hello 字符串.


打包程序

当前写的 Servlet 代码, 没有 main 方法. 我们要想程序运行, 就需要 打包 + 部署程序.

单击右侧的 maven, 双击 package 打包.

Servlet —— Tomcat, 初学 Servlet 程序_第20张图片

打包:

  1. 把缺失的依赖给下载好
  2. 然后编译所有 .java 文件得到一堆 .class 文件
  3. 再把这些 .class 给打包到一个压缩包中

当我们看到 BUILD SUCCESS 这个提示, 就是打包成功了.

Servlet —— Tomcat, 初学 Servlet 程序_第21张图片

这时我们可以看到这里多了一个 .jar 文件.

Servlet —— Tomcat, 初学 Servlet 程序_第22张图片

# 注意事项 #

虽然我们打出来 jar 包, 但是 Tomcat 不认! !

Tomcat 要求的压缩包格式, 是 war 包

最主要的区别, war 包, 会把整个 webapp 目录都给打进去, 包括 web.xml ,以及未来放的一些静态 html, css ...

这时我们需要修改 pom.xml , 在 中写入这样一段代码:

<packaging>warpackaging>
<build>
    // war 包的名字
    <finalName>helloServletfinalName>
build>

这时再次双击 package, 打包完毕后, 我们再看左侧, 多了一个 helloServlet.war 文件

Servlet —— Tomcat, 初学 Servlet 程序_第23张图片


部署程序

war 包, 拷贝到 Tomcat 的 webapps 中.

Servlet —— Tomcat, 初学 Servlet 程序_第24张图片

重新启动 Tomcat 服务器. Tomcat 就会加载这里的 war 包.

我们看到这里多了一个 helloServlet 文件. 加载操作就是把这个 war 解压缩成目录了.

Servlet —— Tomcat, 初学 Servlet 程序_第25张图片


验证程序

通过浏览器, 构造一个HTTP 请求, 访问 Tomcat 服务器.

我们打开一个浏览器, 在地址栏上输入 http://127.0.0.1:8080/helloServlet/hello

此时在浏览器的页面上, 和 Tomcat 日志中, 都出现了 hello 这个字符串.

Servlet —— Tomcat, 初学 Servlet 程序_第26张图片

  • 第一级目录来指定 webapps 中的目录
  • 第二级目录来指定 第一级目录下的文件

浏览器发送一个 HTTP 请求给 Tomcat 服务器. (GET /helloServlet/hello)

Tomcat 服务器就会解析请求

  1. 获取到 URL 中的第一级路径, /helloServlet 确定一个 webapp

  2. Tomcat 找到 helloServlet 目录之后, 就会加载里面的类, 尤其是重点去识别出 @WebServlet 注解修饰的类

    就会取出 URL 中的第二级路径 /hello .

    然后就在 @WebServlet 注释中, 找到名字为 /hello 的类.

    找到类之后, 创建实例 (只会创建一次. 如果之前创建过了, 就直接复用上次的实例)

  3. 再解析出 HTTP 请求的方法 “GET”, 取出 GET 之后, 就可以根据 HTTP 方法来调用对应的 servlet 中的方法:

    GET 请求就调用 doGet 方法

    POST 请求就调用 doPost 方法

    PUT 请求就调用 doPut 方法

    DELETE 请求就调用 doDelete 方法 …

    同时 Tomcat 还会构造出 HttpServletRequest 对象和 HttpServletResponse 对象


(( ◞•̀д•́)◞⚔◟(•̀д•́◟ ))

以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!

在这里插入图片描述
在这里插入图片描述

这里是Gujiu吖!!感谢你看到这里
祝今天的你也
开心满怀,笑容常在。

你可能感兴趣的:(JavaEE,servlet,tomcat,java)