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 {
@Overrideprotected 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);}@Overrideprotected 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 {
@Overrideprotected 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);}@Overrideprotected 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 {
@Overrideprotected 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);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);//super.doPost(req, resp);}
}
你会 发现 我们 并不是 用 当前本地这个 类的本体去 获取 资源。而是 利用 servletcontext 这个管理 servlet 整体的对象 去 获取 资源,而这个 资源的文件夹,期初的位置 就是 我们 当前 这个 servlet 程序 生成的文件夹root目录。也就是 target/servlet-02
所以我们 就知道 根据路径 应该 怎么 去 获取到 该 资源文件了。