为什么要研究ServletContext的应用,有助于了解框架的底层原理,如果还不清楚ServletContext是什么,看一下上篇文档。
1 共享数据
参见上篇文章
2 获取初始化参数
首先我们在web.xml中定义初始化参数
<context-param>
<param-name>url</param-name>
<paramvalue>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
接下来我们创建一个类继承HttpServlet,然后再doGet方法里获取servletContext ,servletContext 对象提供了获取初始化对象的方法getInitParameter,参考下面代码试一下
public class GetInitParam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
resp.getWriter().print(url);
}
}
然后注册Servlet到web.xml
<servlet>
<servlet-name>getinittest</servlet-name>
<servlet-class>com.duowei.servlet.GetInitParam</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getinittest</servlet-name>
<url-pattern>/getinit</url-pattern>
</servlet-mapping>
最后启动tomcat,访问getinit,获得了我们上面定义的上下文参数。
3 请求转发
先理解一下请求转发和重定向
A —————— B ——————C
A是你,B是服务员,C是你要点的菜
- 请求转发:你去一家餐厅吃饭,想吃什么菜点了服务员给你送来,你不用直接去端你的菜。
- 重定向:你去吃自助餐,问服务员匹萨在哪,服务员告诉你在哪,你去端。
所以请求转发,你问B要C,B给你拿来了,而你没有去C那里拿,重定向是你真的去C那里拿了。
上Demo,看代码 - 获得 servletContext 对象
- 转发给了另一个Servlet (/getinit)servletContext.getRequestDispatcher("/getinit")
- .forward(req, resp) 可以理解成正常的请求响应,如果没有请求转发,是不是就是一个简单的请求响应
public class TestDispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.getRequestDispatcher("/getinit").forward(req, resp);
}
}
配置一下web.xml
<servlet>
<servlet-name>testDispatcher</servlet-name>
<servlet-class>com.duowei.servlet.TestDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testDispatcher</servlet-name>
<url-pattern>/testDispatcher</url-pattern>
</servlet-mapping>
执行看结果,注意 地址栏里testDispatcher没有变,页面内容跳转到了getinit!!!
到此你可能已经理解了。如果是重定向地址栏就变成
http://localhost:8080/testmaven_war/testDispatcher/getinit
4 读取资源文件
我们经常要用到配置文件,存储我们的配置信息,如数据库的用户名密码
4.1 resources新建db.properties
username = root
password = 123456
4.2 读取properties
思考一下路径为什么是“/WEB-INF/classes/db.properties”
第一个/代表了这个项目,我们在获取资源的时候往往使用相对路径,相对于本项目
WEB-INF/classes是编译后项目类路径
如图
public class TestReadResources extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(is);
String user = properties.getProperty("username");
String pwd = properties.getProperty("password");
resp.getWriter().print(user);
resp.getWriter().print(pwd);
}
}
4.3 注册Servlet
<servlet>
<servlet-name>testReadResources</servlet-name>
<servlet-class>com.duowei.servlet.TestReadResources</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testReadResources</servlet-name>
<url-pattern>/testReadResources</url-pattern>
</servlet-mapping>
4.4 运行看结果
5 拓展
思考一下如果把配置文件放到Java目录下,编译后classes目录里有吗?为什么,怎么办?