HTTP和Servlet快速入门


目录
  • https://cloud.tencent.com/developer/chapter/13553

    常见的响应状态码:

    状态码 英文描述 解释
    200 OK 客户端请求成功,即处理成功,这是我们最想看到的状态码
    302 Found 指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
    304 Not Modified 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
    400 Bad Request 客户端请求有语法错误,不能被服务器所理解
    403 Forbidden 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
    404 Not Found 请求资源不存在,一般是URL输入有误,或者网站资源被删除了
    428 Precondition Required 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
    429 Too Many Requests 太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用
    431 Request Header Fields Too Large 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
    405 Method Not Allowed 请求方式有误,比如应该用GET请求方式的资源,用了POST
    500 Internal Server Error 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
    503 Service Unavailable 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好
    511 Network Authentication Required 客户端需要进行身份验证才能获得网络访问权限
  • 2、Servlet

    • 快速入门

      • 依赖:创建web项目,导入Servlet依赖坐标

        Tomcat内置Servlet,若运行时使用该依赖则会导致冲突

        使用provided,仅测试和编译环境有效

        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        
        
      • 创建:定义类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

        public class ServletDemo1 implements Servlet {
        
            @Override
            public void init(ServletConfig servletConfig) throws ServletException {
        
            }
        
            @Override
            public ServletConfig getServletConfig() {
                return null;
            }
        
            @Override
            public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
                System.out.println("servlet hello world!");
            }
        
            @Override
            public String getServletInfo() {
                return null;
            }
        
            @Override
            public void destroy() {
        
            }
        }
        
        
      • 配置:在类上使用@WebServlet("")注解,配置该Servlet的访问路径

        @WebServlet("/demo1")
        public class ServletDemo1 implements Servlet { }
        
      • 访问:启动Server,输入URL访问该Servlet

        http://localhost:8080/servlet_1_0_SNAPSHOT_war/demo1
        
    • 执行流程

      • URL拆解

        • http://localhost:8080为本机的服务器地址
        • http://localhost:8080/servlet_1_0_SNAPSHOT_war为本项目地址
        • http://localhost:8080/servlet_1_0_SNAPSHOT_war/demo1为该Servlet的访问地址
      • 创建和调用

        1. 客户端发送请求到服务器

        2. 服务器解析请求

        3. Servlet对象由服务器自动创建

        4. service()方法由服务器自动调用

          自定义Servlet时,必须实现Servlet接口并覆写其中方法,故必然存在可以调用的service()方法

        5. service()方法被执行,服务器对客户端做出响应

    • 生命周期

      • Servlet运行在Servlet容器中,其生命周期由容器管理,分为四个阶段

        1. 加载和实例化

          • 默认情况下,Servlet第一次被访问时,由容器创建Servlet对象

          • 通过配置参数决定创建时机

            • 负整数(默认):第一次被访问时创建

            • 0或正整数:服务器启动时创建(数字越小优先级越高)

              @WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
              
        2. 初始化

          • 调用init()初始化对象,仅执行一次
            • 加载配置文件
            • 创建连接
            • ...
        3. 请求处理

          • 调用service()对请求进行处理
        4. 服务终止

          • 调用destroy()进行资源回收
          • 释放Servlet实例,随后其会被Java垃圾收集器回收
    • 方法介绍

      • 初始化方法

        public void init(ServletConfig servletConfig);
        
      • 提供服务方法

        public void service(ServletRequest servletRequest, ServletResponse servletResponse);
        
      • 销毁方法

        public void destroy();
        
      • 获取ServletConfig对象

        public ServletConfig getServletConfig();
        
      • 获取Servlet信息

        public String getServletInfo();
        
    • 体系结构

      多数时候不需要覆写上述五个方法全部,可以简化

      • Servlet体系结构

        类或接口 说明
        Servlet Servlet体系根接口
        --
        GenericServlet Servlet抽象类实现
        --
        HttpServlet 对HTTP协议封装的Servlet实现

        由于以开发B/S的Web项目为主,均针对HTTP协议,故可在自定义Servlet时继承HttpServlet

      • HttpServlet示例

        HttpServlet已经对service()方法中请求方式判断的方式进行封装

        在使用时需要进一步对不同请求方式实现不同的逻辑

        @WebServlet("/demo4")
        public class ServletDemo4 extends 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...");
            }
        }
        
      • Servlet urlPattern配置

        • 一个Servlet可以配置多个urlPattern

        • urlPattern配置规则

          配置规则总共四种,如下所示,优先级逐级降低

          • 精确匹配

            // 准确输入主机端口项目地址并在最后加上请求路由即可访问
            @WebServlet("/user/select")
            // 两个请求路由均可访问
            @WebServlet(urlPatterns = {"/servlet1","/servlet2"})
            
          • 目录匹配

            // * 为通配符,可匹配任意的字符串
            @WebServlet("/user/*")
            
          • 拓展名匹配

            // 拓展名匹配不能以 / 开头,如示例,任何路由以.do结尾即可访问
            @WebServlet("*.do")
            
          • 任意匹配

            // 匹配任意请求路由,二者作用相同, /* 的优先级高于 / ,覆盖Tomcat服务器的default的Servlet
            @WebServlet("/")
            @WebServlet("/*")
            

            DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问

    3、Servlert的xml配置

    • 说明

      @WebServlet()注解仅支持3.0版本及以上,3.0以下版本仅支持使用XML进行配置

    • 快速入门

      • 编写Servlet类

        package priv.dandelion.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("/demo13")
        public class ServletDemo13 extends HttpServlet {
        
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("demo13 get...");
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("demo13 post...");
            }
        }
        
      • 在web.xml中对该Servlet进行配置

        
            
          
            
          
          
            demo13
            priv.dandelion.web.ServletDemo13
          
          
          
            demo13
            /demo13