• 关于对ServletContext对象的应用详解


    一.预准备工程

    1.1 ServletContext的概念

    ServletContext是用于存储信息的全局空间。它从服务器开始就存在,只有在服务器关闭后才释放。

    ServletContext和Cookie、Session对比图如下:

    1

    2.1 创建新的Servlet项目

    1.新建项目Servlet-02。

    2.新建文件java,标记其为Sources Root。

    3.新建接口为com.gowork.servlet

    4.创建类helloservlet

    5.继承HttpServlet

    6.重写doGet和doPost方法

    public class helloservlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Hello");
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    7.注册hello,写映射

    <servlet>
        <servlet-name>helloservlet-name>
        <servlet-class>com.gowork.servlet.helloservletservlet-class>
    servlet>
    
    <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    8.重新设置web容器路径—tomcat

    C:\Users\24190\IdeaProjects\xiao\servlet-02\src\main\webapp

    image-20220816093936346

    测试可以正常访问!

    二.ServletContext对象

    做好了上面的准备过程,我们先了解一下几个对象

    this.getInitParameter() 初始化参数
    this.getServletConfig() servlet配置
    this.getServletContext() servlet上下文
    
    • 1
    • 2
    • 3

    当web容器启动时,它将为每个web应用程序创建一个对应的ServletContext对象,该对象表示当前的web应用程序

    • 共享数据:我在这个servlet中保存的数据可以在另一个servlet中获得

      image-20220816095800249

    2.1 新建类 GetServlet

    1.继承HttpServlet。

    2.重写doGet和doPost。

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context =this.getServletContext();
        String username = (String) context.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("我的用户名为"+username);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注册getx,写映射:如下

        <servlet>
            <servlet-name>getxservlet-name>
            <servlet-class>com.gowork.servlet.getservlettservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>getxservlet-name>
            <url-pattern>/getxurl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动应用,测试项目

    直接访问

    http://localhost:8080/servlet-02/getx

    会爆我的用户名为null

    image-20220816102847581

    这是因为,我们没有执行hello类,没有生成ServletContext对象,现在的ServletContext是空的,所以显示我的用户名为null。

    那么,我们先访问hello,再来访问getx,如下图:

    image-20220816103102165

    image-20220816103118264

    现在就出现了——我的用户名为上进小菜猪。

    因为我们在第一次访问hello的时候,服务器端会执行helloservlet类,将ServletContext对象赋值。

    我们再访问getx的时候,ServletContext就不为空了,而变成了上进小菜猪。

    三.ServletContext应用

    3.1 获取初始化函数

    1.新建立一个类,类名为:servleDemo3。

    2.继承HttpServlet。

    3.重写doGet和doPost。

    ServletContext comtext = this.getServletContext();
    
    • 1

    获取到之前访问得到的ServletContext对象值。

    4.配置一下web应用初始化参数

    <context-param>
        <param-name>urlparam-name>
        <param-value>jdbc:mysql://localhost:3306/mybatisparam-value>
    context-param>
    
    • 1
    • 2
    • 3
    • 4

    5.前台输出url的值

    String url = comtext.getInitParameter("url");
    resp.getWriter().print(url);
    
    • 1
    • 2

    6.去配置表里,注册,写对应的映射。

    <servlet>
        <servlet-name>urlservlet-name>
        <servlet-class>com.gowork.servlet.servletDemo3servlet-class>
    servlet>
    
    <servlet-mapping>
        <servlet-name>urlservlet-name>
        <url-pattern>/urlurl-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7,启动项目,访问:

    image-20220816175045987

    8.由上可以看出我们获取到了初始化函数。后期在这里链接我们的数据库。

    jdbc:mysql://localhost:3306/mybatis
    
    • 1

    3.2 请求转发

    1.首先先建立一个新的Demo方便我们操作,类名为servletDemo04。

    2.配置好基础的步骤,与上面的配置步骤相同。

    4.转发的请求路径

    ServletContext context = this.getServletContext();   context.getRequestDispatcher("/url").forward(req,resp);
    
    • 1

    forward(req,resp);是实现了请求转发。

    5.请求转发需要配置的注册表以及映射:

    <servlet>
        <servlet-name>goandgoservlet-name>
        <servlet-class>com.gowork.servlet.servletDemo04servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>goandgoservlet-name>
        <url-pattern>/goandgourl-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6.重新启动项目访问goandgo路径,观察下列结果。

    image-20220816180455005

    3.2.1 转发和重定向的区别

    转发是服务器行为,重定向是客户端行为。

    重定向是浏览器上的网址改变,转发是浏览器上的网址不变。

    image-20220816113927938

    3.3 读取资源文件

    1.在build中配置resources,来防止我们资源导出失败的问题

    <build>
        <resources>
            <resource>
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
            resource>
            <resource>
                <directory>src/main/javadirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>truefiltering>
            resource>
        resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    image-20220816204947310

    2.新建类 类名为:servletDemo05。

    3.继承类,重写doGet

    4.在resour目录下新建db.properties

    username=zhu
    password=123456
    
    • 1
    • 2

    5.路径指向当前项目生成路径:

    InputStream is=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
    Properties prop =new Properties();
    prop.load(is);
    String user = prop.getProperty("username");
    String pas = prop.getProperty("password");
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6.输出到页面

    resp.getWriter().print(user+":"+pas);
    
    • 1

    7.写url注册与映射:

    <servlet>
        <servlet-name>sx5servlet-name>
        <servlet-class>com.gowork.servlet.servletDemo05servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>sx5servlet-name>
        <url-pattern>/sx5url-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    8.访问localhost:8080/servlet-02/sx5

    结果如下:

    image-20220816214108147

  • 相关阅读:
    基于C++实现表达式转换
    Linux篇【3】:Linux环境基础开发工具使用(上)
    C语言每日一题—魔幻矩阵
    「Python入门」Python多线程
    ceph分布式存储
    2022 lineCTF WEB复现WriteUp
    【golang】深入理解GMP调度模型
    Cannot read properties of null bug解决方法
    Linux下OpenJDK的下载和安装
    一文搞懂什么是阻塞IO、信号驱动IO、Reactor模型、零拷贝
  • 原文地址:https://blog.csdn.net/weixin_52908342/article/details/126361056