Servlet之ServletContext
ServletContext是什么
在web容器启动的时候,它会为每个web项目都创建一个对应的ServletContext
对象,即每个web项目都会有且仅有一个ServletContext
对象,通过GenericServlet的getServletContext
方法可以获取当前项目的ServletContext
对象,其主要的作用如下:
- 共享数据
- 获取初始化参数
- 请求转发
- 读取配置文件
共享数据
我们可以通过ServletContext
对象的setAttribute
和getAttribute
方法,使不同的Servlet间共享一些数据
例如在Demo1
中,向ServletContext
添加一个name=张三
,代码如下:
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String name = "张三"; // 需要共享的数据
servletContext.setAttribute("name", name);
}
}
在Demo2
中,可以获取name属性,代码如下:
public class Demo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("name");// 获取共享的数据
resp.setContentType("text/html;charset=utf-8");// 设置内容类型与字符编码
resp.getWriter().print(name);
}
}
启动后,先访问Demo1
后访问Demo2
,页面将显示“张三”。
若先访问Demo2
,则会显示null
,因为在访问Demo1
前,ServletContext
中没有name
属性。
获取初始化参数
我们可以web.xml中设置一些公用的参数,通过ServletContext
来获取这些参数,如下
<!--设置初始化参数-->
<context-param>
<param-name>user</param-name>
<param-value>admin</param-value>
</context-param>
String user = context.getInitParameter("user");// 获取初始化参数
请求转发
通过ServletContext
对象可以获取请求转发对象,可以进行请求转发操作,例如:
ServletContext context = this.getServletContext();
String path = "/3";// 需要转发到的路径
RequestDispatcher requestDispatcher = context.getRequestDispatcher(path);// 获取转发对象
requestDispatcher.forward(req, resp);// 进行转发
请求转发和重定向都可以使用户访问一个页面时返回另一个页面,其主要区别为:
- 请求转发返回200;重定向返回30x
- 请求转发的地址栏不会变;重定向会变
- 请求转发是将另一个页面的结果直接返回;而重定向需要用户请求两次,当浏览器获取30x后,会再去请求另一个页面
读取配置文件
InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");// 将资源文件转为流
Properties prop = new Properties();
prop.load(stream);// 加载配置文件
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print(prop.getProperty("username"));