JavaWeb 09 ServletContext 应用

4.8 ServletContext 应用


  1. 如何 利用 web.xml 设置 context内部的 初始化信息
<context-param>
        <param-name>databaseurl</param-name>
        <param-value>jdbc:mysql://localhost:3306/school</param-value>
    </context-param>

在这里插入图片描述

package com.muquanyu.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ServletDemo03 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String url = servletContext.getInitParameter("databaseurl");

        resp.getWriter().print(url);

        //super.doGet(req, resp);
    }

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

在这里插入图片描述

  1. 实现转发

什么叫转发:转发就是 你请求一个 资源,而这个 资源(A) 在服务器端 也在 请求另一个资源(B),然后 B资源返回给 A资源,A资源再返回给 浏览器。你会发现 我们 请求的 url 没变,对吧,就是那个资源。但是 呢,由于 这个资源 请求了 其它的资源,所以响应的东西不是 本来的资源,而是 这个资源 请求的资源。

这就叫 "转发"
在这里插入图片描述
特性是:url 地址是没有任何变化的!但响应过来的内容发生了变化。

package com.muquanyu.servlet;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class 转发 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/gp");
        requestDispatcher.forward(req, resp);

        //super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
        //super.doPost(req, resp);
    }
}
<servlet>
        <servlet-name>转发</servlet-name>
        <servlet-class>com.muquanyu.servlet.转发</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>转发</servlet-name>
        <url-pattern>/zf</url-pattern>
    </servlet-mapping>

在这里插入图片描述

什么叫 重定向呢?
答:浏览器 请求 资源B,但资源B告诉浏览器去 请求 资源 C,所以浏览器 就去 请求了 资源C。这就叫 重新请求(重定向)。

在这里插入图片描述
3. 读取 web 应用的 资源文件!

先 测试 在 resources 下 建立 properties 文件,是否能够 被 web 应用 生成!
在这里插入图片描述

先 clean 清除掉 web 应用生成的 target。

在这里插入图片描述在这里插入图片描述
然后 你就发现 会有个 db 的资源文件,确实 被 生成在 target 文件夹下了。
在这里插入图片描述

测试 java 文件夹下的 properties 文件 是否能够被 生成在 web target文件夹下。

在这里插入图片描述

在这里插入图片描述
会发现 没有 生成 java 文件夹下创建的 properties 资源。这是 maven 自己的问题。我们在一开始 讲 maven 的时候就说过。在 pom.xml 中加入 下面的 代码

<build>
	<resources>
		<resource>
			<directory>src/main/resources</directory>
			<excludes>
				<exclude>**/*.properties</exclude>
				<exclude>**/*.xml</exclude>
			</excludes>
			<filtering>true</filtering>
		</resource>
		<resource>
			<directory>src/main/java</directory>
			<includes>
				<include>**/*.properties</include>
				<include>**/*.xml</include>
			</includes>
			<filtering>true</filtering>
		</resource>
	</resources>
</build>

在这里插入图片描述
这样 的话 就加载 进来了。

  • 获取 web target 文件夹下的 properties 资源文件。
package com.muquanyu.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;

public class 获取资源文件 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/com/muquanyu/servlet/javadb.properties");

        Properties properties = new Properties();
        properties.load(is);

        String username = properties.getProperty("username");
        String password = properties.getProperty("password");

        PrintWriter writer = resp.getWriter();
        writer.print(username+":"+password);
        //super.doGet(req, resp);
    }

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

你会 发现 我们 并不是 用 当前本地这个 类的本体去 获取 资源。而是 利用 servletcontext 这个管理 servlet 整体的对象 去 获取 资源,而这个 资源的文件夹,期初的位置 就是 我们 当前 这个 servlet 程序 生成的文件夹root目录。也就是 target/servlet-02在这里插入图片描述
所以我们 就知道 根据路径 应该 怎么 去 获取到 该 资源文件了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值