ServletConfig和ServletContext接口及其使用方法详解(附带实例)

╰+攻爆jí腚メ 2024-03-29 14:48 173阅读 0赞

这一节我们学习 ServletConfig 和 ServletContext 两个接口。下面我们先介绍 ServletConfig 接口。

ServletConfig接口

在运行 Servlet 程序时,可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等,这些信息可以在 web.xml 文件中使用一个或多个 \ 元素进行配置。当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。

ServletConfig 接口中定义了一系列获取配置信息的方法,如表 1 所示。


























方法说明 功能描述
String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames() 返回一个 Enumeration 对象,其中包含了所有的初始化参数名
ServletContext getServletContext() 返回一个代表当前 Web 应用的 ServletContext 对象
String getServletName() 返回 Servlet 的名字,即 web.xml 中 元素的值

下面以 getInitParameter() 方法为例,分步骤讲解该方法的使用。

1)创建Servlet

在 com.mengma.servlet 包中创建一个名称为 TestServlet02 的 Servlet 类,并在类中编写用于读取 web.xml 文件中参数信息的代码,如下所示。

  1. package com.mengma.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class TestServlet02 extends HttpServlet {
  10. protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
  11. PrintWriter out = response.getWriter();
  12. ServletConfig config = this.getServletConfig();
  13. String param = config.getInitParameter("encoding");
  14. out.println("encoding=" + param);
  15. }
  16. protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
  17. this.doGet(request, response);
  18. }
  19. }

2)配置参数信息

在 web.xml 文件中为 Servlet 配置一些参数信息,具体的配置代码如下所示:

  1. <servlet>
  2. <servlet-name>TestServlet02</servlet-name>
  3. <servlet-class>com.mengma.servlet.TestServlet02</servlet-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>TestServlet02</servlet-name>
  11. <url-pattern>/TestServlet02</url-pattern>
  12. </servlet-mapping>

在上面的参数信息中,\ 节点表示要设置的参数,该节点中的 \ 表示参数的名称,\ 表示参数的值,在 \ 节点中为 TestServlet02 配置了一个名为 encoding 的参数,并设置其参数的值为 UTF-8。

3)运行项目并查看结果

启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/servletDemo01/TestServlet02 访问 TestServlet02,结果如图 1 所示。

c9f830168e4768a08d75f29f0a69f5fc.gif

图 1 运行结果

从图 1 中可以看出,web.xml 文件中为 TestServlet02 配置的编码信息被读取了出来。由此可见,通过 ServletConfig 对象可以获得 web.xml 文件中的参数信息。

ServletContext接口

当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的初始化信息、读取资源文件等。下面对 ServletContext 接口的不同作用分别进行讲解。

  1. 获取 Web 应用程序的初始化参数

在 web.xml 文件中,不仅可以配置 Servlet 的映射信息,还可以配置整个 Web 应用的初始化信息。Web 应用初始化参数的配置方式具体如下所示:

  1. <context-param>
  2. <param-name>XXX</param-name>
  3. <param-value>xxx</param-value>
  4. </context-param>
  5. <context-param>
  6. <param-name>AAA</param-name>
  7. <param-value>aaa</param-value>
  8. </context-param>

在上面的示例中,\ 元素位于根元素 \ 中,它的子元素 \ 和 \ 分别用于指定参数的名字和参数值。要想获取这些参数名和参数值的信息,可以使用 ServletContext 接口中定义的 getInitParameterNames() 和 getInitParameter(String name)方法分别获取。

下面通过案例演示如何使用 ServletContext 接口获取 Web 应用程序的初始化参数。

1)在 servletDemo01 项目的 web.xml 文件中配置初始化参数信息和 Servlet 信息,其代码如下所示:

  1. <context-param>
  2. <param-name>username</param-name>
  3. <param-value>admin</param-value>
  4. </context-param>
  5. <context-param>
  6. <param-name>password</param-name>
  7. <param-value>1234</param-value>
  8. </context-param>
  9. <servlet>
  10. <servlet-name>TestServlet03</servlet-name>
  11. <servlet-class>com.mengma.servlet.TestServlet03</servlet-class>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>TestServlet03</servlet-name>
  15. <url-pattern>/TestServlet03</url-pattern>
  16. </servlet-mapping>

2)在项目的 com.mengma.servlet 包中创建一个名称为 TestServlet03 的类,该类中使用 ServletContext 接口获取 web.xml 中的配置信息,如下所示。

  1. package com.mengma.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.Enumeration;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. public class TestServlet03 extends HttpServlet {
  11. public void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. response.setContentType("text/html;charset=utf-8");
  14. PrintWriter out = response.getWriter();
  15. // 得到ServletContext对象
  16. ServletContext context = this.getServletContext();
  17. // 得到包含所有初始化参数名的Enumeration对象
  18. Enumeration<String> paramNames = context.getInitParameterNames();
  19. // 遍历所有的初始化参数名,得到相应的参数值并打印
  20. while (paramNames.hasMoreElements()) {
  21. String name = paramNames.nextElement();
  22. String value = context.getInitParameter(name);
  23. out.println(name + ":" + value);
  24. out.println("<br/>");
  25. }
  26. }
  27. public void doPost(HttpServletRequest request, HttpServletResponse response)
  28. throws ServletException, IOException {
  29. this.doGet(request, response);
  30. }
  31. }

上述代码中,当通过 this.getServletContext() 方法获取到 ServletContext 对象后,首先调用 getInitParameterNames() 方法,获取到包含所有初始化参数名的 Enumeration 对象,然后遍历 Enumeration 对象,根据获取到的参数名,通过 getInitParamter(String name)方法得到对应的参数值。

3)启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/servletDemo01/TestServlet03 访问 TestServlet03,浏览器的显示结果如图 2 所示。

09bee8a89871a1487e30ca97f966c684.png

图 2 运行结果

从图 2 中可以看出,web.xml 文件中配置的信息被读取了出来。由此可见,通过 ServletContext 对象可以获取 Web 应用的初始化参数。

  1. 读取 Web 应用下的资源文件

在实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,在 ServletContext 接口中定义了一些读取 Web 资源的方法,这些方法是依靠 Servlet 容器实现的。Servlet 容器根据资源文件相对于 Web 应用的路径,返回关联资源文件的 I/O 流或资源文件在系统的绝对路径等。

表 2 中列举了 ServletContext 接口中用于获取资源路径的相关方法。


























方法说明 功能描述
Set getResourcePaths(String path) 返回一个 Set 集合,集合中包含资源目录中子目录和文件的路径名 称。参数 path 必须以正斜线(/)开始,指定匹配资源的部分路径
String getRealPath(String path) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数 path 代表资源文件的虚拟路径,它应该以正斜线(/)开始,/ 表示当前 Web 应用的根目录,如果 Servlet 容器不能将虚拟路径转换为文 件系统的真实路径,则返回 null
URL getResource(String path) 返回映射到某个资源文件的 URL 对象。参数 path 必须以正斜线(/)开始,/ 表示当前 Web 应用的根目录
InputStream getResourceAsStream(String path) 返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致

了解了 ServletContext 接口中用于获得 Web 资源路径的方法后,下面通过案例分步骤演示如何使用 ServletContext 对象读取资源文件。

案例分步骤演示如何使用 ServletContext 对象读取资源文件。

1)在 servletDemo01 项目的 src 目录中创建一个名称为 itcast.properties 的文件,在创建好的文件中输入如下所示的配置信息:

  1. username=admin
  2. password=1234

2)在 com.mengma.servlet 包中创建一个名称为 TestServlet04 的 Servlet 类,使用该类读取 itcast.properties 资源文件的内容,其实现代码如下所示。

  1. package com.mengma.servlet;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.PrintWriter;
  5. import java.util.Properties;
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. public class TestServlet04 extends HttpServlet {
  12. public void doGet(HttpServletRequest request, HttpServletResponse response)
  13. throws ServletException, IOException {
  14. response.setContentType("text/html;charset=utf-8");
  15. ServletContext context = this.getServletContext();
  16. PrintWriter out = response.getWriter();
  17. // 获取相对路径中的输入流对象
  18. InputStream in = context
  19. .getResourceAsStream("/WEB-INF/classes/itcast.properties");
  20. Properties pros = new Properties();
  21. pros.load(in);
  22. out.println("username=" + pros.getProperty("username") + "<br/>");
  23. out.println("password=" + pros.getProperty("password") + "<br/>");
  24. }
  25. public void doPost(HttpServletRequest request, HttpServletResponse response)
  26. throws ServletException, IOException {
  27. this.doGet(request, response);
  28. }
  29. }

在上述代码中,使用 ServletContext 的 getResourceAsStream(String path)方法获得了关联 itcast.properties 资源文件的输入流对象,其中的 path 参数必须以正斜线(/)开始,表示 itcast.properties 文件相对于 Web 应用的相对路径。

3)启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/servletDemo01/TestServlet04 访问 TestServlet04,浏览器的显示结果如图 3 所示。

5ae2bc4316834d783540830ad4d8dda1.png

图 3 运行结果

从图 3 中可以看出,itcast.properties 资源文件中的内容已经被读取了出来。由此可见,使用 ServletContext 可以读取 Web 应用中的资源文件。

发表评论

表情:
评论列表 (有 0 条评论,173人围观)

还没有评论,来说两句吧...

相关阅读