• Tomcat


    🧑‍🎓 个人主页:花棉袄

    📖 本章内容:【Tomcat
    📢 版权: 本文由【花棉袄】原创 💝在 CSDN 首发 💝 需要转载请联系博主

    在这里插入图片描述

    🌳 Tomcat 🌳 Servlet🌳

    📢💨如果文章对你有帮助【关注👍点赞❤️收藏⭐】


    🍖WEB概念

    1️⃣软件架构

    • C/S: 客户端/服务器端 ‐‐‐‐‐‐‐‐‐‐‐‐> QQ 、360 …
    • B/S: 浏览器/服务器端 ‐‐‐‐‐‐‐‐‐‐‐‐> 京东、 网易 …

    2️⃣资源分类

    🌳 静态资源

    • 静态资源:所有用户访问后,得到的结果都是一样的
    • 静态资源可以直接被浏览器解析
    • 如: html css JavaScript jpg

    🌳 动态资源

    • 动态资源:每个用户访问相同资源后,得到的结果可能不一样
    • 动态资源被访问后,需要先转换为静态资源,再返回给浏览器,通过浏览器进行解析
    • 如:servlet/jsp php asp

    3️⃣网络通信三要素

    🌳 IP:电子设备(计算机)在网络中的唯一标识
    🌳 端口:应用程序在计算机中的唯一标识 – 0~65536
    🌳 传输协议:规定了数据传输的规则

    • tcp : 安全协议,三次握手 – 速度稍慢
    • udp:不安全协议 – 速度快

    🥙WEB服务器

    1️⃣WEB服务器概念

    • 服务器:安装了服务器软件的计算机
    • 服务器软件:接收用户的请求,处理请求,做出响应
    • web服务器软件:接收用户的请求,处理请求,做出响应
      在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目

    2️⃣WEB服务器软件

    • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范 – 收费的
    • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范 – 收费的
    • JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范 – 收费的
    • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范 – 免费的

    🍵Tomcat 安装

    1️⃣Tomcat 目录结构

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

    2️⃣Tomcat 启动停止

    • 启动:双击 bin/startup.bat 文件
    • 停止:双击 bin/shutdown.bat 文件
    • 访问:http://localhost:8080

    在这里插入图片描述

    3️⃣Tomcat源码

    • 📢💨TOMCAT下载
    • 1) 解压zip压缩包
    • 2) 进入解压目录,并创建一个目录,命名为home , 并将conf、webapps目录移入home 目录中
    • 3) 在当前目录下创建一个 pom.xml 文件,引入tomcat的依赖包
    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     
        <modelVersion>4.0.0modelVersion>
        <groupId>org.apache.tomcatgroupId>
        <artifactId>Tomcat8.5artifactId>
        <name>Tomcat8.5name>
        <version>8.5version>
     
        <build>
            <finalName>Tomcat8.5finalName>
            <sourceDirectory>javasourceDirectory>
            <testSourceDirectory>testtestSourceDirectory>
            <resources>
                <resource>
                    <directory>javadirectory>
                resource>
            resources>
            <testResources>
               <testResource>
                    <directory>testdirectory>
               testResource>
            testResources>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.pluginsgroupId>
                    <artifactId>maven-compiler-pluginartifactId>
                    <version>2.3version>
                    <configuration>
                        <encoding>UTF-8encoding>
                        <source>1.8source>
                        <target>1.8target>
                    configuration>
                plugin>
            plugins>
        build>
     
        <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.easymockgroupId>
                <artifactId>easymockartifactId>
                <version>3.4version>
            dependency>
            <dependency>
                <groupId>antgroupId>
                <artifactId>antartifactId>
                <version>1.7.0version>
            dependency>
            <dependency>
                <groupId>wsdl4jgroupId>
                <artifactId>wsdl4jartifactId>
                <version>1.6.2version>
            dependency>
            <dependency>
                <groupId>javax.xmlgroupId>
                <artifactId>jaxrpcartifactId>
                <version>1.1version>
            dependency>
            <dependency>
                <groupId>org.eclipse.jdt.core.compilergroupId>
                <artifactId>ecjartifactId>
                <version>4.5.1version>
            dependency>
           
        dependencies>
    project>
    
    • 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
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 4) 在idea中, 导入该工程
    • 没有maven:右键添加maven

    在这里插入图片描述

    • 5) 配置idea的启动类, 配置 MainClass , 并配置 VM 参数
    • 修改自己的项目路径
    ‐Dcatalina.home=E:/JAVA\tomcat/apache-tomcat-8.5.42-src/home
    ‐Dcatalina.base=E:/JAVA\tomcat/apache-tomcat-8.5.42-src/home
    ‐Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    ‐Djava.util.logging.config.file=E:/JAVA/tomcat/apache-tomcat-8.5.42-src/home/conf/logging.properties
    
    • 1
    • 2
    • 3
    • 4
    • 6)启动主方法, 运行Tomcat , 访问Tomcat
    出现上述异常的原因,是我们直接启动org.apache.catalina.startup.Bootstrap的时候没有加载JasperInitializer,从而无法编译JSP
    解决办法是在tomcat的源码ContextConfig中的configureStart函数中手动将JSP解析器初始化:
    在ContextConfig类中添加:context.addServletContainerInitializer(new JasperInitializer(), null);
    
    • 1
    • 2
    • 3


    🏵️JavaWeb项目

    • WEB工程目录

    在这里插入图片描述

    1️⃣项目创建

    • 创建项目(新建一个空项目,然后再新建一个web模块)

    在这里插入图片描述

    • src:存放源代码的
    • web:存放项目相关资源的(html、css、js、jsp、图片等)
    • WEB-INF:存放相关配置的(web.xml等)

    2️⃣应用部署

    🌳 点击 Tomcat Server -> Deployment

    在这里插入图片描述

    • After launch:启动tomcat自动以谷歌浏览器打开首页http://localhost:8080/
    • update resources , 是tomcat启动之后,我们还可能会修改项目,那这时候不用重新启动tomcat,只需要刷新浏览器,就可以看到修改后的内容

    🌳 设置项目路径

    在这里插入图片描述

    🌳 启动项目

    • 访问:http://localhost:8080/web/

    在这里插入图片描述

    3️⃣应用发布

    🌳在项目的 web 路径下打 war 包jar -cvf 文件名.war .

    • jar -cvf war包名称 空格 .,最后的一个点代表当前路径

    在这里插入图片描述

    • 将打好的 war 包剪切到 tomcat 的 webapps 路径下

    在这里插入图片描述

    • 启动 tomcat 服务,自动解压 war 包

    在这里插入图片描述

    4️⃣配置虚拟目录

    🌳虚拟目录的作用:可以发布任意目录下的项目

    • 编辑 server.xml 配置文件,找到标签

    在这里插入图片描述

    • path 属性:访问资源的虚拟目录名称
    • docBase属性:项目真实存在的路径
    • 将之前发布的myweb,copy到E盘下tomcat文件夹下,改名字为tomcat

    在这里插入图片描述

    • 重启tomcat,访问:http://localhost:8080/tomcat

    在这里插入图片描述


    🍏Tomcat 架构

    1️⃣HTTP工作原理

    • HTTP协议是浏览器与服务器之间的数据传送协议
    • 作为应用层协议,HTTP是基于TCP/IP
    • 协议来传递数据的(HTML文件、图片、查询结果等)
    • TTP协议不涉及数据包(Packet)传输
    • 主要规定了客户端和服务器之间的通信格式

    在这里插入图片描述

    2️⃣Tomcat整体架构

    • 浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后
    • 需要调用服务端程序来处理,所谓的服务端程序就是你写的Java类
    • 一般来说不同的请求需要由不同的Java类来处理

    在这里插入图片描述

    • 1) 图1:表示HTTP服务器直接调用具体业务类,它们是紧耦合的。
    • 2) 图2:HTTP服务器不直接调用业务类,而是把请求交给容器来处理容器通过Servlet接口调用业务类
    • 因此Servlet接口和Servlet容器的出现,达到了HTTP服务器与业务类解耦的目的
    • 而Servlet接口和Servlet容器这一整套规范叫作Servlet规范
    • Tomcat按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能
    • 作为Java程序员,如果我们要实现新的业务功能,只需要实现一个Servlet
    • 并把它注册到Tomcat(Servlet容器)中,剩下的事情就由Tomcat帮我们处理了

    3️⃣Servlet容器工作流程

    • 为了解耦,HTTP服务器不直接调用Servlet,而是把请求交给Servlet容器来处理

    🌳 Servlet容器工作流程

    • 当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来
    • Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系找到相应的Servlet
    • 如果Servlet还没有被加载,就用反射机制创建这个Servlet
    • 并调用Servlet的init方法来完成初始化,接着调用Servlet的service方法来处理请求
    • 把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

    在这里插入图片描述

    🌳 Tomcat要实现两个核心功能

    • 处理Socket连接,负责网络字节流与Request和Response对象的转化
    • 加载和管理Servlet,以及具体处理Request请求

    🌳 Tomcat设计了两个核心组件

    • 连接器:(Connector)
    • 容器:(Container)

    在这里插入图片描述


    🥐Servlet开发

    1️⃣Servlet介绍

    • Servlet 是运行在 Java 服务器端的程序,用于接收和响应来自客户端基于 HTTP 协议的请求

    • 如果想实现 Servlet 的功能,可以通过实现 javax.servlet.Servlet 接口或者继承它的实现类

    • 核心方法:service(),任何客户端的请求都会经过该方法

    在这里插入图片描述

    2️⃣Servlet实现方式

    • 第一种:实现 Servlet 接口,实现所有的抽象方法。该方式支持最大程度的自定义
    • 第二种:继承 GenericServlet 抽象类,必须重写 service 方法,其他方法可选择重写
    • 第三种:继承 HttpServlet 抽象类,需要重写 doGet 和 doPost 方法

    🌳 创建一个类继承 GenericServlet,重写 service 方法

    public class HelloServlet extends GenericServlet {
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("方法执行了");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 在 web.xml 中配置 Servlet
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>testServlet</servlet-name>
            <servlet-class>com.michale.javaweb.TestServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>testServlet</servlet-name>
            <url-pattern>/testServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • Servlet执行过程分析

    在这里插入图片描述

    3️⃣Servlet关系视图

    在这里插入图片描述

    4️⃣Servlet的生命周期

    • 出生:请求第一次到达 Servlet 时,对象就创建出来,并且初始化成功。只出生(创建)一次,将对象放到内存中
    • 活着:服务器提供服务的整个过程中,该对象一直存在,每次都是执行 service 方法
    • 死亡:当服务停止时,或者服务器宕机时,对象死亡

    🌳Servlet的生命周期结论

    • 结论:Servlet 对象只会创建一次,销毁一次
    • 所以 Servlet 对象只有一个实例
    • 如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式
    public class HelloServlet extends HttpServlet {
        @Override
        public void init() throws ServletException {
            System.out.println("对象创建并初始化了...");
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("接收到了客户端的请求...");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    
        @Override
        public void destroy() {
            System.out.println("对象销毁了...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    5️⃣不同映射方式

    • 第一种具体名称的方式
    • 第二种/ 开头 + 通配符的方式
    • 第三种通配符 + 固定格式结尾的方式

    6️⃣Servlet创建时机

    • 第一次访问时创建1

    • 服务器加载时创建0

    • 正整数代表服务器加载时创建,值越小、优先级越高


    🥞ServletConfig

    1️⃣配置方式

    • 标签中,通过标签来配置。有两个子标签
    • :代表初始化参数的 key
    • :代表初始化参数的 value

    在这里插入图片描述

    2️⃣常用方法

    在这里插入图片描述

    3️⃣使用步骤

    • web.xml配置
        <servlet>
            <servlet-name>HelloServletservlet-name>
            <servlet-class>com.example.demo01.HelloServletservlet-class>
            <init-param>
                <param-name>encodingparam-name>
                <param-value>UTF-8param-value>
            init-param>
            <init-param>
                <param-name>nameparam-name>
                <param-value>michaleparam-value>
            init-param>
        servlet>
        <servlet-mapping>
            <servlet-name>HelloServletservlet-name>
            <url-pattern>/hello-servleturl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 创建TestServletConfig类继承HttpServlet
    public class TestServletConfig extends HttpServlet {
    
        //声明ServletConfig配置对象
        private ServletConfig config;
    
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取key值
            String name = config.getInitParameter("name");
            System.out.println("name:"+name);
    
    
            //获取所有的key
            Enumeration<String> names = config.getInitParameterNames();
            //遍历得到的key
            while(names.hasMoreElements()) {
                //获取每一个key
                String key = names.nextElement();
                //通过key获取value
                String value = config.getInitParameter(key);
                System.out.println("name:" + key + ",value:" + value);
            }
            //获取ServletContext对象
            ServletContext context = config.getServletContext();
            System.out.println(context);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
    • 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

    在这里插入图片描述


    🥪ServletContext

    • ServletContext 是应用上下文对象
    • 每一个应用中只有一个 ServletContext 对象
    • 作用:可以获得应用的全局初始化参数和达到 Servlet 之间的数据共享

    在这里插入图片描述

    1️⃣配置方式

    • ServletContext 并不属于某个 Servlet 的配置,而是针对于整个应用的配置,也叫全局的初始化参数

    • 标签中,通过标签来配置。有两个子标签

    • :代表全局初始化参数的 key

    • :代表全局初始化参数的 value

    在这里插入图片描述

    2️⃣常用方法

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

    3️⃣使用步骤

    • 准备工作:新建三个空的txt文件,如下

    在这里插入图片描述

    • 配置Servlet,并且配置ServletContext
    <web-app>
        ....
        
        <servlet>
            <servlet-name>servletContextDemoservlet-name>
            <servlet-class>com.example.demo01.ServletContextDemoservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>servletContextDemoservlet-name>
            <url-pattern>/servletContextDemourl-pattern>
        servlet-mapping>
    
    
        
        <context-param>
            <param-name>globalEncodingparam-name>
            <param-value>UTF-8param-value>
        context-param>
        <context-param>
            <param-name>globalDescparam-name>
            <param-value>This is ServletContextparam-value>
        context-param>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 继续在ServletContextDemo中写
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取ServletContext对象
            ServletContext context = getServletContext();
    
            //获取全局配置的globalEncoding
            String value = context.getInitParameter("globalDesc");
            System.out.println(value);
    
            //获取应用的访问虚拟目录
            String contextPath = context.getContextPath();
            System.out.println(contextPath);
    
            //根据虚拟目录获取应用部署的磁盘绝对路径
        	String realPath = context.getRealPath("/");
            System.out.println(realPath);
            //获取b.txt文件的绝对路径
            String b = context.getRealPath("/b.txt");
            System.out.println(b);
    
            //获取c.txt文件的绝对路径
            String c = context.getRealPath("/WEB-INF/c.txt");
            System.out.println(c);
    
            //获取a.txt文件的绝对路径
            String a = context.getRealPath("/WEB-INF/classes/a.txt");
            System.out.println(a);
        }
    
    • 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

    在这里插入图片描述

    🌳 共享数据

    	//修改ServletContextDemo:存储数据
     	//向域对象中存储数据
     	context.setAttribute("username","zhangsan");
    	//修改ServletConfigDemo:获取数据
        //获取ServletContextDemo设置共享的数据
        Object username = context.getAttribute("username");
        System.out.println(username);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🍜Request

    1️⃣获取各种路径

    在这里插入图片描述

    2️⃣获取请求头信息

    在这里插入图片描述

    3️⃣获取请求参数

    在这里插入图片描述

    4️⃣请求转发

    在这里插入图片描述

    Response

    🍑@WebServlet

    在这里插入图片描述

    在这里插入图片描述

    @WebServlet("/servletDemo1")
    public class ServletDemo1 extends HttpServlet{
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("servlet执行了...");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    📺 学习视频推荐📝 官方文档

    📢💨如果文章对你有帮助【关注👍点赞❤️收藏⭐】

  • 相关阅读:
    表结构及索引设计
    最大子段和(分治法+动态规划法)
    【SQL数据库】数据库的创建、查询、插入等操作使用方法(结合黑皮书教材网站(db-book中的例子)在MySQL Workbench和shell中实现查询操作
    当Java遇到Redis:Jedis实战入门
    入门力扣自学笔记192 C++ (题目编号:1620)
    BFSの笔记
    【大二Web课程设计】基于HTML+CSS技术制作抗疫感动专题网页设计
    YOLOv8/5不显示FLPOs
    springcloud05——Zookeeper实现支付微服务
    云计算安全体系介绍
  • 原文地址:https://blog.csdn.net/m0_46914264/article/details/126309854