全文目录
一. 什么是ServletContext ?
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且项目内部的所有servlet都共享这个对象,所以叫全局应用程序共享对象。
二. 如何获取ServletContext对象
this.getServletContext(); // this 指向当前Servlet
this.getServletConfig().getServletContext(); // this 指向当前Servlet
三. ServletContext常用方法
| void setAttribute(String key, Object value) | 添加数据,添加时以key-value形式添加 |
| Object getAttribute(String key) | 根据指定的key读取对象里面的数据 |
| String getInitParameter(String key) | 根据指定的key获取全局配置参数 |
| void removeAttribute(String var1) | 根据指定的key从对象里面删除数据 |
四. ServletContext的作用
① 共享数据
我们在一个Servlet中保存到ServletContext中的数据可以在另一个Servlet中访问
public class ServletContext01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html"); // 设置响应文件的类型
resp.setCharacterEncoding("UTF-8"); // 设置响应文件编码格式
ServletContext context = this.getServletContext();
String name = "张三";
context.setAttribute("username",name); // 以键值对的形式添加数据到ServletContext对象
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class ServletContext02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html"); // 设置响应文件的类型
resp.setCharacterEncoding("UTF-8"); // 设置响应文件编码格式
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("username"); // 根据key读取ServletContext中的信息
resp.getWriter().print("名字:"+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
// web.xml 文件
<servlet>
<servlet-name>ServletContext01</servlet-name>
<servlet-class>servlet.ServletContext01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext01</servlet-name>
<url-pattern>/context01</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletContext02</servlet-name>
<servlet-class>servlet.ServletContext02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext02</servlet-name>
<url-pattern>/context02</url-pattern>
</servlet-mapping>
结果:
名字:张三
注意:必须先访问ServletContext01保存数据到ServletContext对象,然后才能在ServletContext0中读取到对应数据,否则读取结果为null
② 获取全局配置参数
// web.xml 文件
<!-- 配置初始化参数(键值对形式)-->
<context-param>
<param-name>baidu</param-name>
<param-value>www.baidu.com</param-value>
</context-param>
// Servlet 文件
String baidu = context.getInitParameter("baidu"); // 获取全局配置参数
resp.getWriter().print("百度:"+baidu);
结果:
百度:www.baidu.com
③ 请求转发
public class ServletContext03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html"); // 设置响应文件的类型
resp.setCharacterEncoding("UTF-8"); // 设置响应文件编码格式
resp.getWriter().println("这是ServletContext03页面");
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/context01").forward(req,resp); // 转发到/context01
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注意:与 request.getRequestDispatcher("/url").forward(request, response) 效果一致