美文网首页JavaWeb
HTTP&Tomcat&Servlet

HTTP&Tomcat&Servlet

作者: h2coder | 来源:发表于2022-11-17 00:12 被阅读0次

    什么是Web

    Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。例如百度、京东、淘宝等

    20210717183958532.png

    什么是JavaWeb

    JavaWeb,就是使用Java技术来解决web互联网领域的技术栈。

    静态资源

    使用HTML\CSS\JavaScript技术,构建前端网页,如果每个用户看到的内容都是一模一样的,就是静态资源

    动态资源

    • 动态资源包括Servlet、JSP等,负责逻辑处理
    • 动态资源处理完逻辑后,得到的结果交给静态资源进行展示,使每个用户看到的内容都不一样,就是动态资源
    • 动态资源需要和静态资源结合使用

    HTTP协议

    1627043194238.png
    • HyperText Transfer Protocol,超文本传输协议,定义浏览器和服务器之间的数据传输、通信的规则
    • 数据传输规则,指的就是请求数据和响应数据,需要按照指定的规则进行传输

    HTTP协议的特点

    • 基于TCP协议,面向连接,安全(TCP,是一种面向连接(建立连接之前,需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全)
    • 基于请求-响应模型,一次请求只有一次响应,请求和响应是一一对应关系
    • HTTP协议是无状态的,对事务处理没有记忆能力,每次请求和响应都是独立的

    HTTP协议无状态

    • 无状态是指客户端发送HTTP请求给服务端后,服务端根据请求做出响应,响应完后,服务端不会记录任何信息,从而它也有优缺点
      • 优点:速度快
      • 缺点:多次请求间不能共享数据

    请求格式

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

    HTTP的请求数据,分为三部分,分别为请求行请求头请求体

    • 请求行,请求数据的第一行数据(只有一行),它包含三块内容,分别是请求方式、请求路径、HTTP协议以及版本号

      • 请求方式有7种,最常用的是GET和POST
    • 请求头,从第二行开始,格式为 key:value

    Host: 表示请求的主机名
    User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
    Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
    Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
    Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
    
    • 请求体,和请求头之间有一个空行
    • GET请求没有请求体,POST请求有请求体,GET请求的参数在请求行中,POST请求的参数在请求体中
    POST / HTTP/1.1
    Host: www.baidu.cn
    Connection: keep-alive
    Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 Chrome/91.0.4472.106
    
    username=superbaby&password=123456
    

    响应格式

    HTTP/1.1 200 OK
    Server: Tengine
    Content-Type: text/html
    Transfer- Encoding: chunked...
    
    <html>
    <head>
    <title></title>
    </head>
    <body></body>
    </html>
    

    响应数据中,包含三个部分,分别是响应行,响应头和响应体

    • 响应行,响应数据的第一行(也只有一行),由三部分组成,分别是HTTP协议版本号,响应状态码,响应状码的描述
    • 响应头,第二行开始,格式为 key:value
    Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
    Content-Length:表示该响应内容的长度(字节数);
    Content-Encoding:表示该响应压缩算法,例如gzip;
    Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
    
    • 响应体,和响应头之间有一个空行,存放响应数据
    <html>
    <head>
    <title></title>
    </head>
    <body></body>
    </html>
    
    • 常见的响应状态码
      • 200 ok 客户端请求成功
      • 404 Not Found 请求资源不存在
      • 500 Internal Server Error 服务端发生不可预期的错误

    什么是Web服务器

    1627058356051.png
    • Web服务器是一个应用程序,将对HTTP协议的操作进行封装,让程序员不不需要直接对协议进行操作,让Web开发更加便捷,对外提供网上浏览服务
    • Web服务器软件有很多,例如最常用的Tomcat
    1627060368806.png

    Web服务器的功能

    • 负责解析HTTP协议,解析请求数据,并发送响应数据
    • 浏览器按照HTTP协议发送请求和数据,服务器使用一个Web服务器软件来根据HTTP来解析请求,再把服务器的响应按照HTTP协议发送给浏览器

    Tomcat

    1627176045795.png
    • Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范

    Tomcat的下载、安装、配置、部署

    下载和安装Tomcat

    1627178001030.png
    • 进入Tomcat的官网进行下载,https://tomcat.apache.org/
    • 例如下载Tomcat/apache-tomcat-8.5.68-windows-x64.zip,对压缩包进行解压,注意最好解压到非中文、没有空格的目录
    • 打开apache-tomcat-8.5.68目录,目录结构如下:
    • bin目录,存放Tomcat的命令,.bat是windows的可执行文件,.sh是Linux、Mac的可执行文件
    • conf,存放Tomcat的一些配置文件
    • webapps,部署的项目的目录
    1627178815892.png

    卸载Tomcat

    删除Tomcat目录即可

    启动Tomcat

    1627179006011.png 1627199957728.png
    • 进入bin目录,windows系统双击startup.bat或Linux、Mac使用命令行执行sh startup.sh,启动Tomcat
    • 浏览器访问http://localhost:8080,能出现Tomcat的欢迎页面,即为成功
    • 如果控制台出现中文乱码,则需要修改conf目录下的logging.prooperties配置文件,修改编码为GBK
    # 默认
    java.util.logging.ConsoleHandler.encoding = UTF-8
    # 修改为GBK
    java.util.logging.ConsoleHandler.encoding = GBK
    

    关闭Tomcat

    关闭有3种方式

    • 直接x掉运行的命令行窗口,强制关闭(不建议,可能有不可预知的问题)
    • windows双击bin目录下的shutdown.bat,Linux、Mac执行sh shutdown.sh命令,该方式为正常关闭
    • 运行命令行窗口,ctrl + c,也是正常关闭

    配置Tomcat

    • Tomcat默认端口为8080,一般端口端口冲突才需要修改,修改conf目录下的server.xml
    1627200780590.png
    <Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443" />
    
    • 如果启动Tomcat时,一闪而过,一般是JAVA_HOME环境变量没有配置,进行配置重试即可
    1627201248802.png

    部署Tomcat

    部署可以分为2种方式

    • 手动在webapps目录下,创建一个目录,放入静态资源,在浏览器直接访问资源路径
    • IDEA打包war包,启动Tomcat,手动将war包复制到webapps目录下,Tomcat会有一个定时任务解压该目录下的war包为一个目录

    Servlet

    1627236923139.png
    • Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态的web资源开发技术

    Servlet入门

    • 创建名为web-demo的maven项目,在pom.xml文件中,导入依赖坐标
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <!--
          此处为什么需要添加该标签?
          provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
          因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
        -->
        <scope>provided</scope>
    </dependency>
    
    • 定义一个类,继承Servlet接口
      • 在类头添加@WebServlet注解,配置该Servlet的访问路径
      • 实现所有方法,在service方法中输出打印一句话
    @WebServlet("/demo1")
    public class ServletDemo1 implements Servlet {
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("servlet hello world~");
        }
    
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        public ServletConfig getServletConfig() {
            return null;
        }
    
        public String getServletInfo() {
            return null;
        }
    
        public void destroy() {
        }
    }
    
    • 启动Tomcat,访问该Servlet,控制台能看到打印输出的语句
    http://localhost:8080/web-demo/demo1
    

    Servlet生命周期

    • init(),Servlet初始化方法,只会调用一次

    • service(),服务调用方法,每次访问Servlet就会调用一次

    • destroy(),Servlet销毁方法,服务器重启或关闭时,只会调用一次

    • @WebServlet注解

    • value属性:映射的路径,必须/开头,否则启动会报错

    • loadOnStartup属性:(数字越小,优先级越高)

      • 大于等于0,Web容器启动时,就会创建Servlet。
      • 如果为负数,则是第一次调用时才创建,默认为-1
    @WebServlet(value = "/demo1", loadOnStartup = 1)
    public class Demo1Servlet implements Servlet {
        /**
         * 初始化方法,每一次Servlet对象创建时,调用一次
         */
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("你好 demo1 servlet 初始化方法");
        }
    
        /**
         * 服务调用方法,每次访问Servlet都会被调用
         */
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("你好 demo1 servlet");
        }
    
        /**
         * 销毁方法,服务器重启或关闭时,调用一次
         */
        @Override
        public void destroy() {
            System.out.println("你好 demo1 servlet 销毁方法");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    }
    

    Servlet体系结构

    针对HTTP协议,Servlet有提供专门的子类HttpServlet,让我们只关注服务调用方法,提供了doGetdoPost方法,分别对应访问Servlet时,对应的GET请求和POST请求

    1627240593506.png
    • Servlet(根接口)
    • GenericServlet(Servlet公共抽象类)
    • HttpServlet(对HTTP协议进行封装的Servlet实现类)
    @WebServlet(value = "/demo3")
    public class Demo3Servlet extends HttpServlet {
        private static final long serialVersionUID = 3652460378925257829L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo3 doGet");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo3 doPost");
        }
    }
    
    • 新建一个HTML页面,访问该Servlet,进行测试
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/web-demo/demo3" method="post">
            <input name="username"/><input type="submit"/>
        </form>
    </body>
    </html>
    

    为什么HttpServlet要区分doGet和doPost

    • 这是由于GET请求和POST请求的参数位置不一致,GET请求参数在请求行中,POST请求的参数在请求体中

    Servlet访问路径匹配

    除了精确匹配路径外,Servlet还支持目录匹配、任意匹配、多路径匹配等

    • 优先级:精确匹配 > 目录匹配 > 任意匹配 > 后缀匹配
    • 注意:value和urlPatterns是等价关系,不能同时出现!不然启动就会报错
    //精确匹配
    //@WebServlet(value = "/user/demo3")
    
    //目录匹配,访问/user/下的路径,都是找到该Servlet
    //@WebServlet(value = "/user/*")
    //扩展名匹配(后缀匹配),访问/user/1.demo、/555/abc.do,就是访问后缀为.do的路径
    //@WebServlet(value = "*.do")
    
    //任意匹配,访问任何路径都可以访问到该
    //@WebServlet(value = "/*")
    
    //实际开发中,一般一个Servlet只配置一个访问路径
    //@WebServlet(value = {"/demo3", "/demo4"})
    @WebServlet(value = "/demo3")
    

    XML配置Servlet

    注解配置Servlet,是在Servlet 3.0开始支持的,在3.0之前,都是使用xml配置,xml配置太繁琐,所以才有了后来的注解配置,这里简单了解以下XML的配置方式

    • 定义一个Servlet,注意不要添加@WebServlet注解
    public class Demo4Servlet extends HttpServlet {
        private static final long serialVersionUID = -1768906787754655105L;
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo4 doGet...");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo4 doPost...");
        }
    }
    
    • 在web.xml中,配置Servlet

      • servlet标签,用于定义Servlet全类型以及对应的简短名称的映射关系
      • servlet-mapping标签,用于定义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">
    
        <!-- 使用xml方式配置Servlet -->
        <!-- 1、 给Servlet配置一个名字-->
        <servlet>
            <servlet-name>demo4_servlet</servlet-name>
            <servlet-class>com.itheima.servlet.Demo4Servlet</servlet-class>
        </servlet>
        <!-- 2、配置Servlet和访问路径的映射,路径也是必须以/开头 -->
        <servlet-mapping>
            <servlet-name>demo4_servlet</servlet-name>
            <url-pattern>/demo4</url-pattern>
        </servlet-mapping>
    </web-app>
    

    相关文章

      网友评论

        本文标题:HTTP&Tomcat&Servlet

        本文链接:https://www.haomeiwen.com/subject/eyxyxdtx.html