JavaWeb-Servlet(一)

简介: 1.Servlet生命周期 2.Servlet的配置 3.Servlet的常用方法 4.Servlet体系结构 5.HTTP请求报文 6.HTTP响应报文


1.Servlet生命周期

Servlet(Server Applet)是Java Servlet的简称。其主要的功能是交互式地浏览和修改数据,生成一些动态的Web内容。

Servlet的生命周期 可以简述为以下几个步骤:

    1. Servlet容器接收到第一个HTTP请求,将其委派给对应的Servlet。
    2. Servlet初始化阶段,容器会调用Servlet的init()方法,用于执行一些初始化操作,比如加载资源、建立数据库连接等。
    3. 在接收到客户端请求时,Servlet容器会调用Servlet的service()方法来处理请求,并根据请求方法(如GET、POST等)决定调用具体的doGet()、doPost()等方法。在这些方法中,开发者可以编写处理请求和生成响应的业务逻辑。
    4. 当Servlet容器关闭或重新加载时,会调用Servlet的destroy()方法用于清理资源、释放连接等操作。
    5. 最后,当没有活跃的请求或超过一定时间限制时,Servlet容器会通过JVM的垃圾回收机制对Servlet进行回收。

    2.Servlet的配置

    1.通过xml配置

    image.gif编辑

    <!--    servlet声明-->
        <servlet>
            <servlet-name> Servlet名字(自己定义的) </servlet-name>
            <servlet-class> 此处写完整的类名 </servlet-class>
        </servlet>
    <!--    servlet访问方式的声明-->
        <servlet-mapping>
            <servlet-name>Servlet名字(自己定义的)</servlet-name>
            <url-pattern>访问路径</url-pattern>
        </servlet-mapping>

    image.gif

    2.通过注解配置

    可以看到如果增加一个servlet类就需要多进行配置一次非常麻烦,所以官方引入了注解配置(无需再使用web.xml),但是注意注解配置只能在Web Application3.0以上版本才可用

    @WebServlet("/" +" 路径名(可以自行设置名称)")

    @WebServlet({"/" +" 路径名(可以自行设置名称)","/" +" 路径名(可以自行设置名称)"...})

    案例:

    image.gif编辑


    3.Servlet的常用方法

          在实现了Servlet的接口后会出现以下几个方法:(核心在于init(),service();destory()三个生命周期方法)

    package com.company;
    import javax.servlet.*;
    import java.io.IOException;
    public class Main  implements Servlet {
    //    创建一个ServletConfig对象可以用来接收init传递的servletConfig
        private ServletConfig servletConfig;
    //    初始化,在Servlet创建时候自动执行,特点是只会执行一次
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    //        通过数据范围上升一级实现能够获取ServletConfig信息
            this.servletConfig = servletConfig;
        }
    //    获取Servlet类的相关配置数据
        @Override
        public ServletConfig getServletConfig() {
            return servletConfig;
        }
    //    提供服务方法,特点是在每一次用户访问时候都能调用方法
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("执行服务方法");
        }
    //    获取消息
        @Override
        public String getServletInfo() {
            return null;
        }
    //    结束生命周期,在服务器关闭时候执行destroy方法
        @Override
        public void destroy() {
        }
    }

    image.gif

    案例:

    创建一个类叫ServletDemo源码如下:通过实行按Servlet接口并覆写相关方法。找到service方法,在其下输出Hello Servlet和Test

    package com.company;
    import javax.servlet.*;
    import java.io.IOException;
    public class ServletDemo implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
        }
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        //  使用service服务的方法,其他暂时不用管
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("Hello Servlet");
            System.out.println("Test");
        }
        @Override
        public String getServletInfo() {
            return null;
        }
        @Override
        public void destroy() {
        }
    }

    image.gif

    web.xml配置如下(也可以通过注解配置):

    <?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">
    <!--配置-->
        <display-name>HelloServlet</display-name>
    <!--    servlet声明-->
        <servlet>
    <!--        随便创建想要的Servlet名字-->
            <servlet-name> ServletDemo </servlet-name>
    <!--        找到servlet对应的类,输入 包.具体类名-->
            <servlet-class> com.company.ServletDemo </servlet-class>
        </servlet>
    <!--    servlet访问方式的声明-->
        <servlet-mapping>
    <!--        映射Servlet名-->
            <servlet-name>ServletDemo</servlet-name>
    <!--        映射路径配置一般就用 "/"+映射类名-->
            <url-pattern>/ServletDemo</url-pattern>
        </servlet-mapping>
    </web-app>

    image.gif

    通过输入url并加上对应的路径

    image.gif编辑

    再回到idea中的控制台可以看到能够正常访问

    image.gif编辑


    4.Servlet体系结构

    问题引出:通过案例可以发现 我们一般使用资源请求,只会调用到service方法。其他init方法,destroy方法等等我们都不太需要,但是由于Servlet是接口所以需要覆写所有的方法,所以引入了其他类

    Servlet体系结构:

    image.gif编辑

    其中GennericServlet抽象类将除了service的方法默认进行空处理如下所示:

    package com.company;
    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    public class GenServlet extends GenericServlet {
    //    除了service方法其他都不需要覆写
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("我是service方法");
    //        判断请求方式
            String method = servletRequest.getMethod();
            if (method.equals("GET")){
            }else if (method.equals("POST")){
            }
        }
    }

    image.gif

    问题引出:可以看到虽然继承了GennericServlet类,但是处理请求数据时候,由于请求方式的不同(请求方式有Get和POST)所以要单独对其进行操作,并且每多一个继承GennericServlet的类就需要再写一边判断请求方式代码,为此又细化分了一个HttpServlet抽象类

    HttpServlet自动帮助写完了判断方法,并且带来了方法doGet(),doPOST()

    案例代码:

    package com.company;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    //多路径设置
    @WebServlet({"/Hello","/Dome","/kimi"})
    public class HttpServlet extends javax.servlet.http.HttpServlet {
        @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!!!!!!!!!!!!");
        }
    }

    image.gif

    在index.jsp中设置一个表单并且可以通过method修改发送方法

    image.gif编辑

    Get方法获取到信息

    image.gif编辑

    Post方法获取到信息

    image.gif编辑


    5.HTTP请求报文

    1.请求报文格式

    HTTP 请求报文的格式可分为三个部分:起始行(请求行)、请求头部(Header)和请求体(Body)。

    image.gif编辑

    示例:

    GET /index.html HTTP/1.1
    Host: www.example.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
    Accept-Language: en-US,en;q=0.9

    image.gif

      • 请求行(Request Line):
        • 包含三个要素:HTTP 方法、请求目标(URI/URL)和 HTTP 版本。
        • 示例:GET /index.html HTTP/1.1
          • 请求头部(Headers):
            • 由多个键值对组成,每行一个键值对,用冒号分隔键和值。
            • 可包含多个不同的请求头,如 Host、User-Agent、Content-Type 等。
              • 请求体(Body):
                • 仅在某些请求中存在,用于承载客户端向服务器发送的数据(如 POST、PUT 请求)。
                • 根据不同的应用场景,请求体可以是纯文本、JSON、XML、二进制数据等格式。

                  2.请求头部

                  由关键字和值组成,每行一队,关键字和值之间用“:”隔开

                  请求头部字段 说明 示例
                  Host 请求的目标主机的域名或IP地址 Host:www.example.comwww.example.comwww.example.com
                  User-Agent 发起请求的用户代理信息 User-Agent: Mozilla/5.0
                  Accept 客户端可接受的响应内容类型 Accept: text/html, application/json
                  Content-Type 请求中包含的实体的媒体类型 Content-Type: application/json
                  Authorization 认证信息,用于身份验证 Authorization: Bearer token123
                  Cookie 之前由服务器通过Set-Cookie设置的cookie Cookie: sessionId=abc123
                  Referer 表示客户端是从哪个URL跳转过来的 Referer: Example DomainExample DomainExample Domain
                  Content-Length 请求中的消息体长度 Content-Length: 1024
                  If-None-Match 用于缓存验证,与资源的ETag进行比较 If-None-Match: "abc123"
                  If-Modified-Since 用于缓存验证,与资源的最后修改时间进行比较 If-Modified-Since: Tue, 01 Aug 2023 12:00:00 GMT

                  6.HTTP响应报文

                  1.响应报文格式

                     HTTP 响应报文的格式可分为三个部分:起始行(状态行)、响应头部(Header)和响应体(Body)。

                  示例:

                  HTTP/1.1 200 OK
                  Content-Type: text/html
                  Content-Length: 1234
                  Cache-Control: max-age=3600
                  <!DOCTYPE html>
                  <html>
                  <head>
                    <title>Welcome</title>
                  </head>
                  <body>
                    <h1>Hello, World!</h1>
                    <p>This is a sample HTML page.</p>
                  </body>
                  </html>

                  image.gif

                    • 状态行(Status Line):
                      • 包含三个要素:HTTP 版本、状态码和状态消息。
                      • 示例:HTTP/1.1 200 OK
                        • 响应头部(Headers):
                          • 由多个键值对组成,每行一个键值对,用冒号分隔键和值。
                          • 可包含多个不同的响应头,如 Content-Type、Content-Length、Cache-Control 等。
                            • 响应体(Body):
                              • 用于承载服务器返回给客户端的实际数据内容。
                              • 根据不同的应用场景,响应体可以是纯文本、HTML、JSON、XML、二进制数据等格式。

                                2.常用的状态码

                                状态码 含义
                                200 OK - 请求成功完成
                                301 Moved Permanently - 资源永久重定向到新URL
                                302 Found - 资源临时重定向到新URL
                                304 Not Modified - 资源未修改,可以使用缓存的版本
                                400 Bad Request - 请求无效或非法
                                403 Forbidden - 拒绝访问,权限不足或被禁止
                                404 Not Found - 请求的资源不存在
                                500 Internal Server Error - 服务器内部错误

                                3.常用的响应头

                                响应头部字段 说明 示例
                                Content-Type 响应中实体的媒体类型 Content-Type: text/html; charset=UTF-8
                                Content-Length 响应中实体的长度(字节) Content-Length: 1024
                                Server 服务器软件名称和版本号 Server: Apache/2.4.29 (Unix)
                                Set-Cookie 服务器设置的cookie信息 Set-Cookie: sessionId=abc123
                                Last-Modified 资源的最后修改时间 Last-Modified: Tue, 01 Aug 2023 12:00:00 GMT
                                ETag 资源的实体标识符 ETag: "abc123"
                                Location 重定向的目标URL Location: Example Domain
                                Cache-Control 指定响应的缓存机制 Cache-Control: max-age=3600
                                Content-Encoding 响应实体的压缩编码方式 Content-Encoding: gzip
                                Access-Control-Allow-Origin 指定允许跨域请求的域名或通配符 Access-Control-Allow-Origin: *

                                目录
                                相关文章
                                |
                                18天前
                                |
                                人工智能 缓存 前端开发
                                DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
                                DeepSeek Harness + DeepSeek V4 Pro 项目实战保姆级教程!手把手带你从零安装开源 AI 编程工具,开发架构图、知识讲解网站、3D 网页游戏、全栈 AI 应用 4 个项目,覆盖运行模式选择、插件安装与开发,看看能不能对标 Claude。
                                12960 81
                                DeepSeek Harness 首发实测 + 入门教程,夯爆了!梁神我错了
                                |
                                6天前
                                |
                                人工智能 自然语言处理 安全
                                阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
                                本文聚焦阿里云2026年推出的三款自研AI办公产品,清晰拆解千问办公、Qoder Teams、Qoder CN的差异化定位与能力边界:千问办公主打职场全场景提效,支持自然语言指令一键完成PPT生成、数据分析等高频办公任务;Qoder Teams面向程序员团队,深度整合AI代码生成、团队协同与企业知识库能力;Qoder CN则专为金融、政务等强合规场景打造,实现数据不出境与VPC私有化部署。文章同步给出分场景选型指南与最新活动定价,帮助不同类型的企业按需组合产品,实现业务岗、研发岗与强合规场景的AI能力全覆盖。
                                阿里云千问办公、Qoder Teams、Qoder CN区别与选择指南:模型能力、适用场景与最新活动参考
                                |
                                11天前
                                |
                                Web App开发 人工智能 API
                                16 个超火的 DeepSeek Harness 插件,大肥鱼已经落后 N 个版本了。。。
                                DeepSeek Harness 精选插件推荐合集,从图片识别、浏览器操控、多 Agent 协作到手机远程控制,一口气带你看完 DSH 社区热门的十几个插件,覆盖技能扩展、UI 界面增强、整活玩法三大类,让你的鲸鱼变得更强。
                                1662 3
                                |
                                人工智能 JavaScript 开发工具
                                DeepSeek Harness 本地安装与使用指南
                                DeepSeek Harness(DSH)是DeepSeek AI开源的Agent运行框架,支持本地文件操作、命令执行与工具调用。基于Cordis插件架构,具备高扩展性与强可控性,适合开发者搭建可控Agent环境或开展模型基准测试。当前为开发者预览版,需Node.js环境,推荐先用`npx @deepseek-ai/dsh web`快速体验。
                                5069 0
                                |
                                12天前
                                |
                                人工智能 Java BI
                                【AI】DeepSeek Harness 安装、运行、管理插件
                                本文介绍了如何运行DeepSeek开源的Agent框架DeepSeek Harness(dsh)。主要内容包括:使用nvm安装适配的Node版本;通过代理加速克隆GitHub源码;使用pnpm安装依赖并启动项目;配置DeepSeek API Token;安装扩展功能的插件。该框架自带Web界面,支持模型适配、文件编辑等插件化功能
                                1820 1
                                |
                                14天前
                                |
                                人工智能 JavaScript 测试技术
                                保姆级教程:DeepSeek Harness从安装到跑通测试,30分钟上手
                                DeepSeek Harness是DeepSeek开源的AI Agent运行时,主打“一行命令安装、5分钟跑通”。它让模型真正动手干活——读代码、跑测试、分析失败、生成修复方案。本文手把手教你30分钟从零上手,覆盖安装、配置、实测及避坑指南,助你快速掌握下一代AI编程范式。
                                |
                                16天前
                                |
                                开发工具 Swift git
                                DeepSeek Harness 插件推荐:4 款开源神器让写代码直接起飞
                                DeepSeek Harness 插件推荐:ModLens 视觉、Web UI 全家桶、Mac 原生与 GenUI 渲染,4 款开源插件给纯文本模型补齐短板。
                                2040 6
                                DeepSeek Harness 插件推荐:4 款开源神器让写代码直接起飞
                                |
                                13天前
                                |
                                人工智能 JavaScript 测试技术
                                从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!
                                DeepSeek Harness是DeepSeek推出的开源Agent运行框架,秉持“一切皆插件”理念,支持模型、工具、技能、工作流等全模块自由替换与扩展。其核心Cordis内核实现动态插件管理,赋能Agent自进化。已成GitHub史上增速最快开源项目(15w+ Star),标志着国内大模型从拼价格转向重架构与生态的新拐点。
                                1314 6
                                从 0 到 1,DeepSeek Harness 保姆级安装与使用教程!