IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> javaWEB六:Servlet 之 其它相关问题 -> 正文阅读

[系统运维]javaWEB六:Servlet 之 其它相关问题

Servlet二:Servlet的一些其它相关问题

一、设置编码

  1. get请求方式

    基于tomcat8,不需要设置转码

    在tomcat8之前发送中文数据,需要进行如下转码操作

    String fname = req.getParameter("fname");
    // 1.将字符串打散成字节数组
    byte[] bytes = fname.getBytes("ISO-8859-1");
    // 2.将字节数组按照设定的编码重新组装成字符串
    fname = new String(bytes,"UTF-8");
    
  2. post请求方式
    req.serCharacterEncoding("UTF-8");
    

    注意:该代码必须在所有的获取参数动作之前

二、Servlet的继承关系

  1. 继承关系
    javax.servlet.Servlet	接口
        javax.servlet.GenericServlet	抽象类
        	javax.servlet.http.HttpServlet    抽象子类		
    
  2. 相关方法
    重点查看的是服务方法

    ① javax.servlet.Servlet 接口

    void init(config)  初始化方法
    void service(ServletRequest var1, ServletResponse var2)  服务方法
    void destory()  销毁方法
    

    ② javax.servlet.GenericServlet 抽象类

    public abstract void service(ServletRequest var1, ServletResponse var2)   仍然是抽象方法
    

    ③ javax.servlet.http.HttpServlet 抽象子类

    protected void service(HttpServletRequest req, HttpServletResponse resp){
        // 1.获取请求方式
        String method = req.getMethod();
        // 2.根据不同的请求方式,执行不同的方法体
        if (method.equals("GET")) {
            this.doGet(req, resp);
        } else if (method.equals("HEAD")) {
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
    }
    
    // 3.do方法都类似
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  {
            String protocol = req.getProtocol();
            String msg = lStrings.getString("http.method_post_not_supported");
            if (protocol.endsWith("1.1")) {
                resp.sendError(405, msg);
            } else {
                resp.sendError(400, msg);
            }
    
        }
    
  3. 小结

    ① 继承关系:HttpServlet -> GenericServlet -> Servlet

    ② Servlet中的核心方法:init( ) , service( ) , destroy( )

    ③ 服务方法service( ) :当有请求过来时,service方法会自动响应(其实是tomcat容器调用的)。在HttpServlet中,会自动分析请求的方式,从而决定调用哪个do开头的方法。

    ④ 这些do方法默认都是405的实现风格,因此我们在新建Servlet时,会考虑请求类型,从而决定重写对应的do方法

三、Servlet的生命周期

  1. 定义

    从出现到消亡的整个过程,与其对应的是上面的三个核心方法,由tomcat维护

  2. 默认情况

    第一次接收请求时,这个Servlet会进行实例化(调用构造方法)、初始化(调用init方法)、然后是服务(调用service方法)

    从第二次请求开始,每一次都是服务

    当容器关闭时,其中的所有servlet实例会被销毁

    2.1 测试生命周期的service方法
    package com.atguigu.servlets;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    /**
     * @author e_n
     * @version 1.0.0
     * @ClassName Web_Cycle.java
     * @Description
     * @CreateTime 2022/03/01 11:00
     */
    public class Web_Cycle extends HttpServlet {
        public Web_Cycle() {
            System.out.println("构造器");
        }
    
        @Override
        public void init() throws ServletException {
            System.out.println("初始方法");
        }
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("服务方法");
        }
    
        @Override
        public void destroy() {
            System.out.println("销毁方法");
        }
    }
    
    2.2 配置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">
        
        <servlet>
            <servlet-name>Web_Cycle</servlet-name>
            <servlet-class>com.atguigu.servlets.Web_Cycle</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>Web_Cycle</servlet-name>
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>    
    </web-app>
    
    2.3 配置tomcat

    在这里插入图片描述

  3. 情况说明

    在tomcat中,Servlet实例只会被创建一个,所有的请求都是这个实例去响应

    在默认情况下,第一次请求,tomcat会实例化和初始化,为了提高系统的启动速度,我们应设置Servlet的初始化时机

  4. Servlet的初始化时机
    <!-- load-on-startup中的数字越小,启动越靠前,最小值为0 -->
    <servlet>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
  5. Servlet在容器中:单例、线程不安全

    单例:所有的请求都是同一个实例去响应

    线程不安全:一个线程需要根据这个实例中的某个成员变量去做逻辑判断。但是在中间的某个时刻,另一个线程改变了该成员变量

    **故:**尽量不要在servlet中定义成员变量。如果必须定义成员变量,那么不要修改该成员变量的值或根据该成员变量的值去做逻辑判断

四、Http协议

  1. HTTP:HyperText Transfer Protocol,超文本传输协议
  2. Http是无状态的
  3. Http请求
    请求行

    包含三个信息:请求的方式;请求的URL;请求的协议(一般是HTTP1.1,2015年退出HTTP2.0)

    请求消息头

    包含客户端告知服务器的消息。例如:浏览器的型号、版本、我能接收的内容类型、我给你发的内容类型

    请求体

    get方式:没有请求体,但是有一个queryString

    post方式:有请求体,form data

    json方式:有请求体:payload

  4. Http响应
    响应行

    包含三个消息:1.协议;2.响应状态码(200);3.响应状态(ok)

    响应头

    包含服务器的信息;服务器发给浏览器的信息(内容的媒体类型、编码、内容长度等)

    响应体

    响应的实际内容

五、会话(session)

  1. Http是无状态的

    概念:服务器无法判断两次的请求是同一个客户端发过来的,还是不同的客户端发过来的

    现实举例:第一次请求是添加商品到购物车,第二次请求是结账。如果服务器无法区分两次请求是否为同一用户发来的,那么就会产生混乱,可能你给别人的购物车结账了

    解决方法:会话跟踪技术

  2. 会话跟踪技术

    2.1 客户端第一次发请求给服务器,服务器获取session,如果获取不到,则创建新的,然后相应给客户端

    2.2 下次客户端给服务器发请求时,会把sessionId带给服务器,那么服务器在获取到的同时会判断这次请求和上次的哪个客户端的请求是相同的,从而区分不同的客户端

    // 常见的API
    // 1.获取当前的会话,没有则创建一个新的会话
    request.getSession();
    request.getSession(true);  
    // 2.获取当前的会话,没有则返回null,不会创建新的
    request.getSession(false); 
    // 3.获取sessionId,全球唯一
    session.getId();
    // 4.判断当前session是否是新的
    session.isNew();
    // 5.session的非激活间隔时长,默认1800秒(即30分钟)。例如银行系统,你间隔30分钟无任何操作,就需要重新登录
    sesseion.getMaxInactiveInterval();
    sesseion.setMaxInactiveInterval();
    // 6.强制性让会话立即失效
    session.invalidate();
    ...
    

六、服务器内部转发以及客户端重定向

  1. 服务器内部转发

    过程:一次请求响应的过程,对于客户端而言,内部经过了多少次转发,客户端都不知道

    结果:地址栏没有变化

    代码:
    public class Demo6Servlet  extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo6");
            // 服务器内部转发
            req.getRequestDispatcher("demo7").forward(req,resp);
        }
    }
    
    public class Demo7Servlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo7");
        }
    }
    
    流程图:

    在这里插入图片描述

  2. 客户端重定向

    过程:两次请求响应的过程。客户端知道请求的URL有变化

    结果:地址栏有变化

    代码:
    public class Demo6Servlet  extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo6");
            // 重定位
            resp.sendRedirect("demo7");
        }
    }
    
    public class Demo7Servlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo7");
        }
    }
    
    流程图:

    在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:53:58  更:2022-03-03 16:54:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:18:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码