JavaWeb核心篇(1)——HTTP/Tomcat/Servlet

JavaWeb核心篇(1)——HTTP/Tomcat/Servlet

在正式讲解JavaWeb前,我们先来了解一下JavaWeb:

  • Web:全球广域网,也被称为万维网(www),能够通过浏览器访问的网站
  • JavaWeb:通过Java技术来解决相关Web互联网领域的技术栈

如果说网页是为了展现数据,数据库是为了存储和管理数据,那么JavaWeb就是为了进行逻辑处理

温馨提示:在学习JavaWeb前,需要先学习MYSQL,JDBC和前端三件套。

WEB核心技术栈介绍

既然我们想要学习JavaWeb,那么我们就要先来进行了解:

  • B/S框架:Browser/Server,浏览器/服务器 构造模式,它的特点是,客户端只需要浏览器,应用程序和数据都存储在服务器端。浏览器只需要请求服务器,获得Web资源,服务器把Web资源发送给浏览器即可。
  • 静态资源:HTML,CSS,JavaScript,图片等,负责页面展示
  • 动态资源:Servlet,JSP等,负责逻辑处理
  • 数据库:负责存储数据
  • HTTP协议:定义通信规则
  • Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据(常用Web服务器:Apache Tomcat)

HTTP

首先我们系统的介绍一下HTTP

  • 概念:HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则

HTTP特点:

  • 基于TCP协议:面向连接,安全
  • 基于请求-响应模型:一次请求对应一次响应
  • HTTP协议是无状态的协议:对于事务处理没有记忆能力;每次请求-响应都是独立的

HTTP优缺点:

  • 优点:速度快
  • 缺点:多次请求间不能共享数据。(Java中使用会话技术Cookie,Session来解决这个问题)

HTTP请求数据格式

HTTP请求数据分为三部分:

  • 请求行:请求数据的第一行,其中GET表示请求方式(还有POST方法),/表示请求资源路径,HTTP/1.1表示协议版本
  • 请求头:第二行开始,格式为key:value形式
  • 请求体:POST请求的最后一部分

常见的请求头:

  • Host:表示请求的主机名
  • User-Agent:浏览器版本
  • Accept:表示浏览器能接收的资源类型,其中text/ , image/ 或者 * / *表示所有
  • Accept-Language:表示浏览器偏好的语言
  • Accept-Encoding:表示浏览器可以支持的压缩类型,类如gzip,deflate等

GET请求和POST请求的区别:

  • GET请求请求参数在请求行中,没有请求体;但是POST请求请求参数在请求体中
  • GET请求请求参数有限制,但是POST没有

下面给出GET和POST两个例子:

GET请求数据格式

GET/HTTP/1.1
Host:www.itcast.cn
Connection:keep-alive
Cache-Control:max-age=0 Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0Chrome/91.0.4472.106
......

POST请求数据格式

POST/HTTP/1.1
Host:www.itcast.cn
Connection:keep-alive
Cache-Control:max-age=0 Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0Chrome/91.0.4472.106

username=superbaby&password=123456

HTTP响应数据格式

响应数据分为三部分:

  • 响应行:响应数据的第一行;其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
  • 响应头:第二行开始,格式为key:value形式
  • 响应体:最后一部分,存放响应数据

常见HTTP响应头:

  • Content-Type:表示该响应内容的类型,类如text/html/image/jpeg
  • Content-Length:表示该响应内容的长度(字节数)
  • Content-Encoding:表示该响应压缩算法。例如gzip
  • Cache-Control:指示客户端应如何缓存,例如max-age=300,表示最多可以缓存300s

下面给出HTTP响应例子:

HTTP/1.1 200 OK
Server:Tengine
Content-Type:text/html
Transfer-Encoding:chunked...

重要状态码:

状态码分类 说明 1xx 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 2xx 成功——表示请求已经被成功接收,处理已经完成 3xx 重定位——重定义到其他地方;它让客户端再发起一个请求已完成整个处理 4xx 客户端错误——处理发生错误,责任在客户端,如:客户端请求一个不存在的资源 5xx 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持 状态码 英文描述 解释 200 OK 客户端请求成功,处理成功 404 NOT FOUND 请求资源不存在,通常为url错误或资源被删除 500 Internal Server Error 服务器发生不可预期的错误,服务器出现异常,可以查看日志

状态码大全:HTTP 状态码 | 菜鸟教程 (runoob.com)

Tomcat

首先我们知道Tomcat是Web服务器的一种,那么我们从头介绍:

  • Web服务器属于一个应用程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。
  • 其主要功能是”提供网上信息浏览服务”。

然后我们对Tomcat做出一个简单解释:

  • Tomcat是Apache软件基金会的一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
  • JavaEE:Java企业版,指Java企业级开发的技术规范总和,包含13门技术:JDBC,JSP,XML,Servlet等
  • Tomcat也被称为Web容器;Servlet需要依赖Tomcat才能运行
  • 官网:Apache Tomcat® – Welcome!

通俗来讲,我们自制的HTML网页通常只能在自己电脑上使用
如果我们希望将该网页上传到网络上被其他人阅读,就需要书写HTTP等原本不属于该网页的制造代码
但是我们可以通过Web服务器(Tomcat等)来省略HTTP内容书写的过程,直接将该网页上传至网络被其他人阅读

Tomcat下载

Tomcat下载流程:

  1. 下载:官网下载即可(示例Tomcat为Tomcat8)
  2. 安装:绿色版本,直接安装即可(推荐安装在无汉字无空格的文件目录下)
  3. 启动:双击bin\startup.bat即为启动

Tomcat关闭流程:

  1. 强制关闭:直接按×关闭即可
  2. 正常关闭:双击bin\shutdown.bat 或者 在cmd控制面板使用ctrl+c

我们给出Tomcat的文件目录展示并解释:

JavaWeb核心篇(1)——HTTP/Tomcat/Servlet

我们对文件夹进行解释翻译:

  • bin:可执行文件存放目录
  • conf:配置文件存放目录
  • lib:jar包存放目录
  • logs:日志文件
  • temp:临时文件
  • webapps:应用发布目录(我们把需要编译的文件放置在该文件夹下,在启动后,就可以在网页中直接搜索)
  • work:工作目录

Tomcat配置与项目部署

Tomcat的配置主要是修改端口号:

我们在conf/server.xml中找到如下代码,修改port端口号即可

注意:HTTP协议默认端口号为80,如果将Tomcat端口号修改为80,则访问时不需要输入端口号

Tomcat部署项目:

将项目放在webapps目录下,即为部署成功

注意:我们的文件通常打包为war压缩包,放置在webapps下后会自动解压(加快速度)

IDEA创建Maven Web项目整体框架

首先我们先对Maven Web项目的整体框架进行解释:

JavaWeb核心篇(1)——HTTP/Tomcat/Servlet

我们对文件夹进行解释翻译:

  • src:主目录
  • java:java代码
  • resources:资源文件
  • webapp:Web项目特有目录
  • html:HTML文件目录(可自定义)
  • WEB-INF:Web项目核心目录(必须这个名字)
  • web.xml:Web项目配置文件
  • test:测试目录

在文件打包之后会创建一个target打包包,即为部署成功的JavaWeb项目包:

  • 编译后的Java字节码文件和resources资源文件,放到WEB-INF下的class目录下
  • pom.xml中依赖坐标对应的jar包会放到WEB-INF下的lib目录下

IDEA创建Maven Web项目

创建方法分为使用骨架和不使用骨架(骨架:项目模板)

  • 使用骨架:

  • 在创建项目中使用Maven Archetype,直接创建即可

  • 在创建后,删除掉pom.xml中的多余坐标(只保留自身groupId即可)
  • 需要补全main下的Java目录和resources目录

  • 不使用骨架:

  • 直接创建Maven项目

  • 在pom.xml中的groupId中添加war,使其打包方法为war(默认为jar)
  • 补全webapp目录

IDEA中使用Tomcat

我们如果在Tomcat的下载地址下上传网页,需要不停刷新Tomcat,所以我们希望在IDEA中使用Tomcat

  • 集成本地Tomcat(IDEA完整版)

我们需要在IDEA中添加配置(Add)中添加Tomcat即可

  • Tomcat Maven插件(Tomcat7版本之前)

直接在pom.xml中添加Tomcat插件


            org.apache.tomcat.maven
            tomcat7-maven-plugin

                /
                8080

然后在Maven Helper插件中快速启动项目,选中项目,右键-> Run Maven ->tomcat7:run

Servlet

最后我们介绍一下Servlet:

  • Servlet是Java提供的一门动态Web资源开发技术
  • Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由Web服务器运行Servlet

如果说Tomcat是Java网页与互联网连接的一个框架,那么Servlet就是Java网页在登陆互联网后的动态资源

Servlet入门

下面我们通过一个简单的步骤来介绍Servlet的使用过程:

  1. 创建Web项目,在pom.xml中导入Servlet依赖坐标

    4.0.0

    org.example
    web-demo
    1.0-SNAPSHOT
    war

        8
        8

            javax.servlet
            javax.servlet-api
            3.1.0
            provided

                org.apache.tomcat.maven
                tomcat7-maven-plugin
                2.2

  1. 在Java文件夹下创建一个类,并实现Servlet接口,重写所有方法
package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {

    // service 在每次开启网页后都会启动一次(是主要代码)
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(ServletConfig config) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;package com.itheima.web;

  1. 在类上方使用@WebServlet注解,配置该Servlet的访问路径
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

// 这里使用注解,后面括号内为访问路径
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(ServletConfig config) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
}

    }
}
  1. 访问:启动Tomcat,输入URL即可访问,并且触动Servlet中的service方法
// /web-demo 是Web项目名称
// /demo1是配置访问路径

http://localhost:8080/web-demo/demo1

Servlet生命周期

在分析执行流程前,我们先明白两个问题:

  • Servlet由Web服务器创建,Servlet方法由Web服务器调用
  • 因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,所以Servlet接口中必定存在service方法

生命周期概念:

  • 生命周期:指一个对象从被创建到被销毁的全过程

Servlet生命周期:

  1. 加载和实例化:
  2. 默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
  3. 初始化:
  4. 在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作,该方法只调用一次!
  5. 请求处理:
  6. 每次请求Servlet时,Servlet容器都会调用Service方法来对请求进行处理
  7. 服务终止:
  8. 当需要释放内存或容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放;在destroy方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器回收

注意:@WebServlet(urlPatterns = “/demo1″,loadOnStartup = 1)
loadOnStartup:当为负整数,表示第一次被访问时创建;当为正整数或0,表示服务器启动时创建,数字越小优先级越高

Servlet方法介绍

Servlet存在五种方法,我们在代码中进行介绍:

package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * Servlet 生命周期方法
 */
@WebServlet(urlPatterns="/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet {

    /**
     * 初始化方法
     * 1. 调用时机:默认情况下,Servlet被第一次访问时,调用
     *      * loadOnStartup:
     * 2. 调用次数:1次
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init...");
    }

    /**
     * 提供服务
     * 1. 调用时机:每一次Servlet被访问时,调用
     * 2. 调用次数:多次
     *
     *
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }

    /**
     * 销毁方法
     * 1. 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
     * 2. 调用次数:1次
     */
    @Override
    public void destroy() {
        System.out.println("destroy...");
    }

    // 用于获取Servlet的具体信息
    @Override
    public String getServletInfo() {
        return null;
    }

    // 用于获取ServletConfig对象
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
}

Servlet体系结构

Servlet属于最高级根接口,为了更加契合HTTP的使用

我们又以Servlet创建了GennericServlet类,再以GennericServlet类为模板创建了HTTPServlet类

在这部分我们将介绍HTTPServlet类:

  • 我们的B/S构架的Web的开发,都是针对HTTP协议的,所以我们自定义的Servlet类可以继承HTTPServlet类

HTTPServlet使用步骤:

  • 继承HTTPServlet类
  • 重写doGet和doPost方法

HttpServlet原理:

  • 获得请求方式,并根据不同请求方法,调用不同的do方法

我们给出一个具体实例:

package com.itheima.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {

    // HTTPServlet根据其请求的GET或POST方法提供不同的返回信息

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post...");
    }
}

Servlet urlPattern配置

Servlet如果想被访问,就必须要配置urlPattern信息(访问路径)

首先我们阐明一个道理:

  • 一个Servlet,可以配置多个urlPattern
@WebServlet(urlPattern = {"/demo1","/demo2"})

然后我们介绍Servlet的urlPattern匹配规则:

  1. 精准匹配
// Java源码
@WebServlet(urlPattern = "/user/select")

// 查询网站
localhost8080/web-demo/user/select
  1. 目录匹配
// Java源码
@WebServlet(urlPattern = "/user/*")

// 查询网站
localhost8080/web-demo/user/aaa
localhost8080/web-demo/user/bbb
  1. 扩展名匹配
// Java源码
@WebServlet(urlPattern = "*.do")

// 查询网站
localhost8080/web-demo/aaa.do
localhost8080/web-demo/bbb.do
  1. 任意匹配
// Java源码
@WebServlet(urlPattern = "/")
@WebServlet(urlPattern = "/*")

// 查询网站
localhost8080/web-demo/hehe
localhost8080/web-demo/haha

/*
介绍一下 / 和 /* 区别:

/*: 可以匹配任意访问路径

/: 当我们的项目中配置了"/"后,会覆盖掉tomcat中的DefaultServlet,这样就会导致你的静态内容(html)都无法被访问,所以尽量不要使用
*/

优先级:精确路径 > 目录路径 > 扩展名路径 > /* > /

XML配置方法编写Servlet

Servlet在3.0版本后才可以使用注解配置(@注解)

在3.0版本之前我们需要采用XML配置文件的配置方法

配置方法:

  • 编写Servlet类
  • 在web.xml中配置该Servlet

        demo13
        com.itheima.web.ServletDemo13

        demo13
        /demo13

结束语

好的, 关于JavaWeb的第一期就到这里,具体介绍了HTTP,Tomcat和Servlet三门技术

下一期将会介绍Request和Response以及案例介绍

附录

该文章属于学习内容,具体参考B站黑马程序员陈老师的JavaWeb课程

这里附上链接:01-Web核心介绍_哔哩哔哩_bilibili

Original: https://www.cnblogs.com/qiuluoyuweiliang/p/16669453.html
Author: 秋落雨微凉
Title: JavaWeb核心篇(1)——HTTP/Tomcat/Servlet

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611525/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySql Explain字段解析

    MySql Explain字段解析 id id列表示select的序号,查询Sql中有几个select就会有几个id。 id的值越大,该查询的优先级超高。 select_type …

    数据库 2023年5月24日
    086
  • 容器化|在 S3 备份恢复 RadonDB MySQL 集群数据

    作者:程润科、钱芬视频:钱芬 上一篇文章我们演示了如何快速实现 MySQL 高可用集群部署,以及部署集群的校验和卸载方式。本文将演示如何对集群进行备份和恢复。 部署版本为 Rado…

    数据库 2023年5月24日
    091
  • 0. 数据库设计规范化

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    0101
  • Shell第一章《变量》

    什么是shell shell-‘壳’ 命令解释器,一种应用程序 shell语言特点 SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程…

    数据库 2023年6月14日
    082
  • 【必知必会】手把手教你配置MySQL环境变量——图文详解

    一、先决条件 假设我们已经成功安装MySQL数据库。如果还有小伙伴不知道如何安装MySQL数据库,可以在本文下留言,留言数超20,则出一期”手把手教你安装MySQL数据…

    数据库 2023年6月14日
    057
  • HTML详解

    一、初识HTML 初始基本标签代码解释 点击查看代码 <!–DOCTYPE:告诉浏览器我们要使用什么规范–> <!DOCTYPE html> <h…

    数据库 2023年6月16日
    089
  • leetcode 101. Symmetric Tree 对称二叉树(简单)

    一、题目大意 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3]输出:true 示例 2: 输入:root =…

    数据库 2023年6月16日
    079
  • FlyAway–数据库版本管理工具

    相关博文: FlyAway官方文档: https://flywaydb.org/documentation/getstarted/how 关于SpringBoot整合并使用FlyA…

    数据库 2023年6月6日
    061
  • 2022-8-30 servlet

    HttpServletRequest — request(请求) &#x6240;&#x6709;&#x7684; &#x548C;&a…

    数据库 2023年6月14日
    081
  • Linux 系统安装RocketMQ

    准备工作 1.去官网下载一个安装包 1.解压 unzip rocketmq-all-4.9.0-bin-release.zip -d /download/compress/ 2.进…

    数据库 2023年6月6日
    087
  • Python语法糖,提升编程幸福感!!!

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/a52bc938.html 大家好,我是测试蔡坨坨。 今天,我们来盘点一下Python中的那些语法糖。 …

    数据库 2023年6月11日
    0106
  • Mall 动态权限学习参考

    代码仓库 https://github.com/Rain-with-me/JavaStudyCode/tree/main/4-springboot-security-dynic 本…

    数据库 2023年6月14日
    081
  • Java 线程常用操作

    继Java线程生命周期继续学习Java线程其他常用操作 线程的常用操作 设置线程名字:setName() 获取线程名称:getName() 线程唯一Id:getId() // 自定…

    数据库 2023年6月6日
    082
  • Java面试题(四)–RabbitMQ

    1、MQ有哪些使用场景?(高频) 异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。 系统解耦:比如用注册完成,再加…

    数据库 2023年6月16日
    081
  • 2022-9-2 cookie 和 session

    当客户端关闭后,服务器不关闭,两次获取session是否为同一个?默认情况下。不是。 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cooki…

    数据库 2023年6月14日
    096
  • 09 子查询

    数据库关联子查询和非关联子查询 非关联子查询:数据库嵌套查询中内层查询是完全独立于外层查询的。 执行顺序: 先执行内层查询 得到内层查询的结果后带入外层,再执行外层查询 selec…

    数据库 2023年6月16日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球