Web 前端学习 之servlet(二) servletConfig与servletContext

Web 前端学习 之servlet(二) servletConfig与ServletContext

ServletConfig类

在这里插入图片描述

作用

  • **可以获取 Servlet 程序的别名 servlet-name 的值 **
  • **获取初始化参数 init-param **
  • 获取 ServletContext 对象

先看看init-param的配置,同样是在web.xml文件中
而每个servlet对象中都可以配置init-param
也就是说配置的位置如下

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
        <init-param> 
        	... ...
        </init-param> 
    </servlet>

它是以键值对的形式进行配置的,可以输入我们自己想要的内容
我们可以配置多个init-param

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>tty</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>zqq</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </servlet>

init方法测试

下面就通过之前的HelloServlet类来访问
通常写在init初始化方法中,如下

 public void init(ServletConfig servletConfig) throws ServletException {
 
    }

可以看到参数就是一个ServletConfig对象
我们也可以看看它有什么方法
在这里插入图片描述
getInitParameter()方法用来通过键获取值,有点类似于python的字典,我们需要传入一个String类型的参数
在这里插入图片描述

public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("HelloServlet的servlet-name是:" + servletConfig.getServletName());
        System.out.println("初始化参数 username 的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是:"+servletConfig.getInitParameter("password"));
        System.out.println("初始化参数 url 的值是:"+servletConfig.getInitParameter("url"));
    }

经过测试之后,成功输出结果
在这里插入图片描述

其他方法测试

这次我们用HelloServlet2类来测试
首先在HelloServlet2的配置中加上init-param

    <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.guigu.servlet.HelloServlet2</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>tty2</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>zqq2</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test2</param-value>
        </init-param>
    </servlet>

我们选择在doGet方法中输出而不是inti

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet被访问");
        ServletConfig servletConfig = getServletConfig();

        System.out.println("初始化参数 username 的值是:" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是:" + servletConfig.getInitParameter("password"));
        System.out.println("初始化参数 url 的值是:" + servletConfig.getInitParameter("url"));

    }

可以看到也能成功访问

在这里插入图片描述
但是如果我们重写了init方法,必须加上super.init(config)不然就会产生错误

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

也就是super那句话必须保留,不然在doGet中的调用会产生空指针异常
原因如下
我们一层层的来看下源码

getServletConfig();

先看它的源码如下,属于GenericServlet
在这里插入图片描述
再点进去
在这里插入图片描述
可以看到GenericServlet的初始方法保存了config
在这里插入图片描述
而我们自己重写了init方法的时候,如果没有调用父类的init,config就不会被保存,所以会产生错误

servletContext类

在这里插入图片描述

作用

  • **获取 web.xml 中配置的上下文参数 context-param **
  • 获取当前的工程路径,格式:/工程路径
  • **获取工程部署后在服务器硬盘上的绝对路径 **
  • 像 Map 一样存取数据

首先它在web.xml中配置的位置跟之前的不同,它属于整个web工程,所以要配置在外面,如下,配置的内容也是键值对的方式
在这里插入图片描述

获取参数

编写方法获取参数

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//       获取web.xml中配置的上下文参数context-param
        ServletContext context = getServletConfig().getServletContext();
        String username = context.getInitParameter("username");
        System.out.println("context-param 参数 username 的值是:" + username);
        System.out.println("context-param 参数 password 的值是:" + context.getInitParameter("password"));
//        获取当前工程路径
        System.out.println("当前工程路径:" + context.getContextPath());
//        获取工程部署在服务器硬盘上的绝对路径
        System.out.println("工程部署的路径是:" + context.getRealPath("/"));
        System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
        System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));

    }

在这里插入图片描述

存取数据

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//          存取数据
        ServletContext context = getServletContext();
        System.out.println("保存之前Context1 获取key1 的值是:"+context.getAttribute("key1"));
//        保存
        context.setAttribute("key1","value1");
        System.out.println("保存之后Context1 获取key1 的值是:"+context.getAttribute("key1"));
           }

结果如下
说明在存取前 获取不到,存取后可以获取到值
在这里插入图片描述
我们可以再新建一个文件试试,因为context是全局的,理论上来说也是可以获取到的

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = getServletContext();
        System.out.println("HelloServlet3获取的context key1的值:" + context.getAttribute("key1"));
    }

可以看到只要在setAttribute之后,其他的文件也可以获取到key的值
在这里插入图片描述
我们可以把它理解为一个全局的变量,当工程部署的时候通过set函数被创建
ServletContext 是在web 工程部署启动的时候创建。在web 工程停止的时候销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joker-Tong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值