一.ServletContext类详解
getInitParameter()方法
此方法和上一章我们遇到的Serlvet.getInitParameter
相似,都是获取初始化参数。不同的是,Serlvet.getInitParameter
方法获取的是使用此方法的servlet的初始化参数,配置设置在<servlet>
标签中;而SerlvetContext.getInitParameter
获取的是整个web应用的初始化参数,配置设置在web.xml
中并且不在别的标签里面。
其实ServletContext
的初始化参数相当于web应用
的初始化参数。
接下来为了方便我们对于ServletContext.getInitParamter
方法的理解,我们做一个小小的案例。
在此案例中我们需要完成以下步骤:
- 在
web.xml
中设置ServletContext
的初始化参数。 - 编写一个
servlet
类,使用它获取上一步设置的初始化参数。 - 启动web应用,查看servlet类获取的初始化参数。
1.在web.xml中设置SerlvetContext的初始化参数。
<context-param>
<param-name>InitParamterTest</param-name>
<param-value>This is a test for ServetContext.getInitParameter !</param-value>
</context-param>
2.编写一个获取ServletContext初始化参数的servlet类,给它配置映射路径。
package com.kuang.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ServletContextGetInitParameterTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
// 获取初始化参数
String message = servletContext.getInitParameter("InitParamterTest");
// 将获取的初始化参数输出
PrintWriter writer = resp.getWriter();
writer.println("IninParameter test : " + message);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置映射路径:
<servlet>
<servlet-name>initParameterTest</servlet-name>
<servlet-class>com.kuang.servlet.ServletContextGetInitParameterTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>initParameterTest</servlet-name>
<url-pattern>/initParameterTest</url-pattern>
</servlet-mapping>
(PS:配置映射路径的步骤就不在此处展示了。)
3.测试结果。
getRequestDispatcher()方法
我们只需要知道ServletContext中有请求转发的功能。其相关的知识我们将会在后面的学习中与重定向一同学习。
ServletContext读取资源文件
Properties
类介绍
1.什么是Properties
类?
Properties类是用于处理属性文件的类(一般来说,属性文件是使用键值对保存一些程序运行所需要的配置数据,例如jdbc的url等。这类文件的后缀一般是.properties
)。Properties类继承自Hashtable
类,在Hashtable
类的基础之上增加了一些与配置文件相关的方法。
2.Properties类中常用的方法
Properties
类中常用的方法有:load()
,getProperty()
,setProperty
,store()
load()
:加载properties文件。一般使用流
的方式来加载。
getProperty()
:根据参数获取Property类中对应的数据信息。
setProperty()
:根据参数设置Property类中的信息。
store()
:将Property中的信息存储会properties文件之中。
3.使用ServletContex获取properties文件的方法
- 创建一个Properties文件
username = BugMaker2000
password = 123456
- 创建一个用于读取配置文件的
Serlvet
,使用ServletContext
读取上一步设置的配置文件(作为流读取)
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Properties;
import java.util.Set;
public class PropertiesTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.使用Servlet读取配置文件
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/Test.properties");
// 2.创建一个Properties类,并且使用load()方法加载获取的输入流
Properties prop = new Properties();
prop.load(is);
// 3.读取Properties中的数据
String username = prop.getProperty("username");
String password = prop.getProperty("password");
// 4.使用Servlet输出
PrintWriter writer = resp.getWriter();
writer.print("username : " + username + " password : " + password);
// 测试properties的修改功能
// 1.再properties中设置属性
prop.setProperty("url","www.baidu.com");
// 2.创建文件的输出流(输出流要使用绝对路径)
FileOutputStream fos = new FileOutputStream("D:\\IDEAWorkPlace\\javaweb-02-servlet\\servlet-02\\src\\main\\resources\\Test.properties");
// 3.使用store文件对数据进行保存
prop.store(fos,"文件修改");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
映射路径的操作在此省略。
- 启动服务器,查看读取的内容。
properties读取结果:
properties修改结果:
小知识:
在我们使用servlet读取数据时,我们使用的文件路径是:/WEB-INF/classes/Test.properties
。这个路径是根据文件生成的target
文件中的路径获取的。
其中我们可以看到’servlet-02’这个目录,在web应用中我们文件的目录便是从这个目录开始的。其中’class’目录我们称为classpath
目录,我们在’java’以及’resource’目录下的创建的目录会生成在本目录之下。在没有进行其余操作时,我们是不可以在除了resource目录之外的地方创建.properties文件的(因为maven的特性:约定大于配置)。
如果需要在别的地方生成.properties并且被导出的话,我们需要在pom文件的<build>
标签中添加下面标签:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
这个是固定格式。
在我们添加了<resources>
标签之后我们便可以在别的目录之下创建.properties文件,并且可以被导出了。
本章结束。
本章学习之后,遗留两个问题:
1.在我们进行javaweb开发时,我们的OutPutFileStream
类能否使用相对路径?如果能,相对路径是从哪里开始的?
2.本人尝试了在’com.kuang.servlet’路径之下创建properties文件,但是在启动服务器之后整个’com.kuang.servlet’路径之下的类都没有在target文件中生成,这是什么问题导致的?
这两个问题,我之后会研究并且回答,如果有知道的小伙伴请在评论区留下答案。万分感谢!