4.8 ServletContext 应用
- 如何 利用 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);
}
}
- 实现转发
什么叫转发:转发就是 你请求一个 资源,而这个 资源(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
所以我们 就知道 根据路径 应该 怎么 去 获取到 该 资源文件了。