注解方式、ServletContext 与 ServletConfig和请求

2023-11-16

回顾

  1. http 协议的定义和组成

    • 请求行 请求头 请求体
    • 响应行 响应头 响应体
  2. 常见响应状态码的含义

    • 200 - 成功
    • 404 - 未找到
    • 405 - 方法不支持
    • 500 - 服务器出现异常
  3. 常见请求头

    • Host: 主机
    • User-Agent: 客户端类型
  4. 常见响应头

    • Content-Type: 资源类型
    • Content-Length: 资源大小
  5. servlet 继承关系

    • Servlet => GenericServlet => HttpServlet
  6. 如何开发一个 servlet

    • 类继承HttpServlet, 重写 doGet 和 doPost 方法

    • 配置 servlet

      • web.xml

        <servlet>
        	<servelt-name></servelt-name>
            <servlet-class>servlet类的全路径</servlet-class>
        </servlet>
        <servlet-mapping>
        	<servelt-name></servelt-name>
            <url-pattern>/资源路径</url-pattern>
        </servlet-mapping>
        
      • 注解 @WebServlet(urlPatterns="/资源路径")

    • 访问 http://ip:端口/虚拟目录/资源路径?参数名=值&参数名=值

  7. servlet 程序的执行流程

  8. servlet 程序的生命周期,什么时候会创建? 能否控制?

    • init()
    • service()
    • destroy()
    • load-on-startup
  9. 怎么保证 servlet 的线程安全

    • 局部变量
    • 共享变量(只读)
    • 共享变量加锁
  10. servlet 的路径映射有几种

    • /精确路径
    • /前缀/*
    • *.后缀
    • /

今日内容

1. 注解方式(*)

要点:掌握 @WebServlet 中的三个属性 urlPatterns,value 和 loadOnStartup

示例代码:

//@WebServlet(urlPatterns = {"/s1","/s2"}) // urlPatterns 取值是一个数组,可以支持多个资源路径
//@WebServlet("/s3") // value 与 urlPatterns 功能完全等价, 好处可以进一步简化资源路径
@WebServlet(loadOnStartup = 1, value="/s3") // loadOnStartup 是在服务器启动时创建和初始化此servlet
public class AnnotationServlet extends HttpServlet {
    //static String AppName = "it黑马应用程序";
    public AnnotationServlet () {

        System.out.println("构造方法");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("被初始化");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("执行了 AnnotationServlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2. ServletContext 与 ServletConfig (了解)

  • servletContext 上下文,保存所有 servlet 共同的信息
    1. 获取servletContext 对象
    1. getInitParameter 获得初始化参数
    1. getRealPath() 根据一个相对 web 文件夹路径,寻找磁盘此文件的真实路径(*)
    1. setAttribute , getAttribute, removeAttribute 存储 servletContext 的共享数据
    • servletContext 内部有一个键值集合 name value
    • Attribute 本意是【属性】
    • setAttribute(name, value) - 将 name value 放入 servletContext 的键值集合
    • getAttribute(name) - 根据 name 返回 value
    • removeAttribute(name) 根据 name,删除整个 name 和 value
例1:演示 getInitParameter 获取全局初始化参数
// 演示初始化参数的读取
@WebServlet("/demo1")
public class ServletContextDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取 servletContext
        ServletContext servletContext = this.getServletContext();
        // 2. 读取 servletContext 的初始化参数
        String value = servletContext.getInitParameter("appname");
        System.out.println(value);

        // 3. 读取另一个参数
        System.out.println(servletContext.getInitParameter("appdesc"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

web.xml 中有如下全局参数

<!-- servletContext 所使用的初始化参数 -->
<context-param>
    <param-name>appname</param-name>
    <param-value>it黑马应用程序</param-value>
</context-param>

<context-param>
    <param-name>appdesc</param-name>
    <param-value>应用程序描述</param-value>
</context-param>
例2:getRealPath 使用

其中 student.txt 在 web 目录下

@WebServlet("/demo2")
public class ServletContextDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取 servletContext
        ServletContext servletContext = this.getServletContext();
        // 2. 获取文件的真实路径, / 代表 web 目录的起点
        String realPath = servletContext.getRealPath("/student.txt");
        System.out.println(realPath);
        BufferedReader reader = new BufferedReader(
                new FileReader(realPath, Charset.forName("utf-8")));
        while (true) {
            String line = reader.readLine();
            if (line == null) {
                break;
            }
            System.out.println(line);
        }
        reader.close();
    }
}

如果编译不过,说明jdk版本低于 11,解决方法:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(new FileInputStream(realPath), "utf-8"));
例3:演示 setAttribute 和 getAttribute
@WebServlet("/demo3")
public class ServletContextDemo3 extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("执行文件的读取操作");
        try {
            // 1. 获取 servletContext
            ServletContext servletContext = this.getServletContext();
            // 2. 获取文件的真实路径, / 代表 web 目录的起点
            String realPath = servletContext.getRealPath("/student.txt");
            BufferedReader reader = new BufferedReader(
                    new FileReader(realPath, Charset.forName("utf-8")));
            List<Student> list = new ArrayList<>();
            while (true) {
                String line = reader.readLine();
                if (line == null) {
                    break;
                }
                System.out.println(line); // 1   zhangsan  18
                // 3. 对每行数据进行切分
                String[] split = line.split(",");
                // 4. 将数据存入 student 对象
                Student student = new Student();
                student.setId(split[0]);
                student.setName(split[1]);
                student.setAge(split[2]);
                // 5. 将学生对象放入 list
                list.add(student);
            }
            // 6. 将 list 集合数据存入 servletContext
            servletContext.setAttribute("students", list);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 7. 从 ServletContext 中获取 list 数据,后续请求都从内存中获取
        ServletContext servletContext = this.getServletContext();
        List<Student> students = (List<Student>) servletContext.getAttribute("students");
        for (Student student : students) {
            System.out.println(student);
        }
    }
}
例4:演示读取每个servlet的初始化参数

ServletConfig - 代表每个servlet 的配置信息(了解)

  • ServletConfig.getInitParameter(“参数名”) 返回参数值,获取是servlet自己配置的参数
  • ServletContext.getInitParameter(“参数名”) 返回参数值,获取是全局配置的参数

对于下面的 StudentServlet 要读取其 filename 参数

<servlet>
    <servlet-name>stuServlet</servlet-name>
    <servlet-class>demo.StudentServlet</servlet-class>
    <!-- 每个 servlet 独有的配置信息 -->
    <init-param>
        <param-name>filename</param-name>
        <param-value>student.txt</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>stuServlet</servlet-name>
    <url-pattern>/stu</url-pattern>
</servlet-mapping>

最简单的办法是

public class StudentServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取 servlet 自己独有的配置信息,它内部会间接调用 ServletConfig.getInitParameter()
        String value = this.getInitParameter("filename");
        System.out.println(value);
    }
}

此外,还可以用下面的方法,但不如上面的方便

String value = this.getServletConfig().getInitParameter("filename");

3. 请求(**)

作用:获取浏览器传递过来的数据

  • ServletRequest 父接口

  • HttpServletRequest 子接口

    • getContextPath() - 获取虚拟目录 (*)
    • getServletPath() - 获取资源路径
    • getQueryString() - 获取所有请求参数
    • getRequestURI 标识(范围大= 虚拟目录+资源路径)(*)
    • getRequestURL 定位 (完整路径)
    • getRemoteAddr() 获取浏览器的 ip (*)
      • 在tomcat的设置里 VM options 中加入 -Djava.net.preferIPv4Stack=true

获取请求头方法

  • getHeader(String name) 获取值 (*)
    • connection:keep-alive (长连接)
    • connection: close(短连接) 服务器发现取值是close 就会在响应返回后断开连接
    • accept-encoding
    • getHeaders(String name) 获取多个值
    • getHeaderNames() 获取所有的请求头名称

获取请求参数的方法

  • getParameter(String name) ==> 根据参数名返回参数值
  • getParameterValues(String name) ==> 根据参数名返回参数值的数组(多值)
  • getParameterMap() ==> 获取所有请求参数的map集合,key 为参数名,value为参数值数组
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注解方式、ServletContext 与 ServletConfig和请求 的相关文章

随机推荐

  • MySQL函数和存储过程

    MySQL流程控制函数 1 IF函数 IF expr1 expr2 expr3 如果expr1是真 返回expr2 否则返回expr3 SELECT name IF age gt 18 成年 未成年 FROM user 2 IFNULL函数
  • 给Qt程序添加管理员权限总结(一定有你没见过的方式)

    当我们写了一个Qt程序 程序会在C盘某些目录下创建文件时 会发现代码没有问题 但是就是创建失败 而当我们对程序右键 以管理员权限运行时 又可以正常创建文件 此时 说明我们的程序默认不具备管理员权限 故而无法对某些目录进行写入 根据我们的编译
  • 温酒读Qt:QObject 序篇

    一 醉言醉语话夏娃 跟Qt框架打了这么久交道 Qt貌似对我的半斤八两知根知底 我对Qt的认知却还不到半斤八两 o o 或许你知道Qt的meta object和属性系统 或许你在写代码时无数次显示或者隐示的继承了QObject 不管人家是否乐
  • 数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

    SQL SERVER数据库故障类型 1 SQL SERVER数据库文件被删除 2 SQL SERVER数据库所在分区格式化 3 SQL SERVER数据库文件大小变为 0 4 使用备份还原数据库时覆盖原数据库 SQL SERVER数据库故障
  • Sublime Text 中Anaconda 插件的Python语法配置

    在Ubuntu环境下Sublime Text 配置Anaconda 插件自动检查Python3语法 在Ubuntu16 04环境下使用Sublime Text 写Python3程序 已安装了Anaconda 插件包 通过配置Anaconda
  • Fabric java sdk 1.4简明教程

    在超级账本Fabric区块链中 应用通过节点的RPC协议接口访问链码 Java应用可以使用官方提供的Fabric sdk java开发包来实现对链码的访问 开发包封装了Fabric区块链的GRPC链码访问协议 有利于开发人员聚焦于业务逻辑
  • TCP报文的交互过程

    TCP建立连接和断开连接的过程如下图所示 在TCP 协议提供可靠的连接服务时 采用三次握手建立一个连接 采用四次握手来关闭一个连接 建立TCP连接的三次握手 第一次握手 建立连接时 客户端发送 SYN 包到服务器 等待服务器确认 第二次握手
  • Docker的简介、镜像及优化

    1 docker的安装 1 配置yum源 vim etc yum repo d docker ce repo 编辑内容 vim etc yum repo d CentOS Base repo 编辑内容 2 安装docker yum inst
  • 医疗保健行业中的区块链

    区块链技术是世界上最重要和最具颠覆性的技术之一 多个行业正在采用区块链技术来创新其运作方式 希望采用区块链的行业之一是医疗保健行业 在本指南中 我们将熟悉区块链 特别是有助于打破这个行业原有桎梏的功能 此外 我们将研究医疗行业的未来将会是什
  • 推荐系统实践(八)----评分预测

    目前为止都是在讨论 T o p N TopN TopN 推荐 即给定一个用户 如何给他生成一个长度为 N N
  • JVM 内存模型

    JVM 内存模型 1 JVM 内存模型共分为5个区 Java虚拟机栈 本地方法栈 堆 程序计数器 方法区 元空间 2 各个区各自的作用 a 本地方法栈 用于管理本地方法的调用 里面并没有我们写的代码逻辑 其由native修饰 由 C 语言实
  • 卷积神经网络之-Lenet

    更多内容请关注 机器视觉CV 公众号 原文地址 前言 Lenet 是一系列网络的合称 包括 Lenet1 Lenet5 由 Yann LeCun 等人在1990 年 Handwritten Digit Recognition with a
  • 一个将XM音频导入小宇宙的工具

    这个喜马拉雅语音导出工具 能够帮助你导出喜马拉雅中的音频节目 下载后的音频文件 可以复制到小宇宙设备文件夹里面 这样我们就可以用小宇宙播放我们导入的音频文件啦 windows电脑版 https jscs lanzouw com imVZ40
  • 负载均衡原理分析与源码解读

    上一篇文章一起学习了Resolver的原理和源码分析 本篇继续和大家一起学习下和Resolver关系密切的Balancer的相关内容 这里说的负载均衡主要指数据中心内的负载均衡 即RPC间的负载均衡 传送门 服务发现原理分析与源码解读 基于
  • 强化学习之Grid World的时序差分算法解析【MiniWorld】SYSU_2023SpringRL

    强化学习之Grid World的Monte Carlo算法解析 MiniWorld SYSU 2023SpringRL 题目以及思路 代码 运行结果 算法解析 代码算法流程 题目以及思路 环境在这篇博客强化学习原理及应用作业之动态规划算法
  • c语言输出斐波那契数列前40项

    分析 对于斐波那契数列数列来说 就是前一项和前前一项的和 就是当前项 就比如 1 1 2 3 5 其中2就是1 1 3就是1 2 5就是2 3 所以 在c语言中就可以定义数组的方式 去实现 当然 如果一行输出 不美观 于是利用if语句 将i
  • Streamlit项目: 轻松搭建部署个人博客网站

    文章目录 1 前言 1 1 探索 Streamlit 轻松创建交互式应用 1 2 最全 Streamlit 教程专栏 2 我的个人博客网站已上线 2 1 一个集成了智能中医舌诊 中e诊专栏的博客网站 2 2 前期准备 2 3 使用 Stre
  • MS-RTOS 内核模块动态装载

    1 MS RTOS 内核模块动态装载简介 MS RTOS 支持内核模块动态装载功能 用户可以根据需要 在不需要对内核重新编译的情况下 使用 insmod rmmod 等命令动态地将模块加入或移出内核 这样可以提高 MS RTOS 的灵活性
  • 使用clion链接liunx同步项目并编译

    一 clion的下载和安装 下载官网CLion A Cross Platform IDE for C and C by JetBrains 安装后有30天使用日期 学生可以获得免费教育许可证JetBrains 学习产品 二 clion项目的
  • 注解方式、ServletContext 与 ServletConfig和请求

    回顾 http 协议的定义和组成 请求行 请求头 请求体 响应行 响应头 响应体 常见响应状态码的含义 200 成功 404 未找到 405 方法不支持 500 服务器出现异常 常见请求头 Host 主机 User Agent 客户端类型