8 ServletContext重要应用

为什么要研究ServletContext的应用,有助于了解框架的底层原理,如果还不清楚ServletContext是什么,看一下上篇文档。

1 共享数据

参见上篇文章

2 获取初始化参数

首先我们在web.xml中定义初始化参数

<context-param>
        <param-name>url</param-name>
        <paramvalue>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>

接下来我们创建一个类继承HttpServlet,然后再doGet方法里获取servletContext ,servletContext 对象提供了获取初始化对象的方法getInitParameter,参考下面代码试一下

public class GetInitParam extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String url = servletContext.getInitParameter("url");
        resp.getWriter().print(url);
    }
}

然后注册Servlet到web.xml

<servlet>
    <servlet-name>getinittest</servlet-name>
    <servlet-class>com.duowei.servlet.GetInitParam</servlet-class>
    </servlet>
<servlet-mapping>
    <servlet-name>getinittest</servlet-name>
    <url-pattern>/getinit</url-pattern>
</servlet-mapping>

最后启动tomcat,访问getinit,获得了我们上面定义的上下文参数。
在这里插入图片描述

3 请求转发

先理解一下请求转发和重定向
A —————— B ——————C
A是你,B是服务员,C是你要点的菜

  • 请求转发:你去一家餐厅吃饭,想吃什么菜点了服务员给你送来,你不用直接去端你的菜。
  • 重定向:你去吃自助餐,问服务员匹萨在哪,服务员告诉你在哪,你去端。
    所以请求转发,你问B要C,B给你拿来了,而你没有去C那里拿,重定向是你真的去C那里拿了。
    上Demo,看代码
  • 获得 servletContext 对象
  • 转发给了另一个Servlet (/getinit)servletContext.getRequestDispatcher("/getinit")
  • .forward(req, resp) 可以理解成正常的请求响应,如果没有请求转发,是不是就是一个简单的请求响应
public class TestDispatcher extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        servletContext.getRequestDispatcher("/getinit").forward(req, resp);
    }
}

配置一下web.xml

<servlet>
        <servlet-name>testDispatcher</servlet-name>
        <servlet-class>com.duowei.servlet.TestDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testDispatcher</servlet-name>
        <url-pattern>/testDispatcher</url-pattern>
    </servlet-mapping>

执行看结果,注意 地址栏里testDispatcher没有变,页面内容跳转到了getinit!!!
到此你可能已经理解了。如果是重定向地址栏就变成
http://localhost:8080/testmaven_war/testDispatcher/getinit
在这里插入图片描述

4 读取资源文件

我们经常要用到配置文件,存储我们的配置信息,如数据库的用户名密码

4.1 resources新建db.properties

username = root
password = 123456

4.2 读取properties

思考一下路径为什么是“/WEB-INF/classes/db.properties”
第一个/代表了这个项目,我们在获取资源的时候往往使用相对路径,相对于本项目
WEB-INF/classes是编译后项目类路径
如图
在这里插入图片描述

public class TestReadResources extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(is);
        String user = properties.getProperty("username");
        String pwd = properties.getProperty("password");
        resp.getWriter().print(user);
        resp.getWriter().print(pwd);
    }
}

4.3 注册Servlet

<servlet>
        <servlet-name>testReadResources</servlet-name>
        <servlet-class>com.duowei.servlet.TestReadResources</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testReadResources</servlet-name>
        <url-pattern>/testReadResources</url-pattern>
    </servlet-mapping>

4.4 运行看结果

在这里插入图片描述

5 拓展

思考一下如果把配置文件放到Java目录下,编译后classes目录里有吗?为什么,怎么办?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值