1. 简介
- ServletContext对象又叫全局上下文对象。Web服务器会为每一个工程创建一个ServletContext对象,这个对象全局唯一并且掌管当前项目下所有的Servlet、项目资源、项目配置…
-
ServletContext对象也是当前Web项目下所有Servlet通信交互的桥梁,Servlet1写入ServletContext的数据,Servlet2通过ServletContext可以获取到数据。
//设置一个key-value的键值对,向ServletContext中写入数据 public void setAttribute(String name, Object object); //通过key取到value,注意类型转换 public Object getAttribute(String name); //通过key删除一个键值对。 public void removeAttribute(String name); //请求转发,传入一个地址进行页面的转发。(非重定向) public RequestDispatcher getRequestDispatcher(String path); //通过参数name,获取web.xml中的初始配置数据 public String getInitParameter(String name);
2. ServletContext常见用法
-
使用ServletContext对象进行Serlvet之间的数据读取
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.*; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); ServletContext servletContext = this.getServletContext(); //获得全局上下文对象 servletContext.setAttribute("username","hello"); //写入数据 System.out.println("HelloServlet请求成功, key = username, value = hello!"); resp.getWriter().println("请求成功!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
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; public class WorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); ServletContext servletContext = this.getServletContext(); String user = (String)servletContext.getAttribute("username"); System.out.println("WorldServlet请求成功, key = username, value = " + user + "!"); resp.getWriter().println("WorldServlet取到数据: " + user); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
-
ServletContext获得配置文件中的数据资源。下面是写在web.xml配置文件中的数据
<context-param> <param-name>path</param-name> <param-value>这是初始化配置中的数据</param-value> </context-param>
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; public class ServletContext01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* 通过参数name, 调用getInitParameter去请求xml中初始化的配置文件。 */ resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); ServletContext context = this.getServletContext(); String path = context.getInitParameter("path"); System.out.println(path); resp.getWriter().println(path); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
ServletContext对象对请求进行转发。注意转发是不会改变url地址的,依旧是最初请求的地址。但是重定向会。
import javax.servlet.RequestDispatcher; 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; public class ServletContext02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); //RequestDispatcher dispatcher = context.getRequestDispatcher("/hello"); //请求的地址 //dispatcher.forward(req,resp); //非重定向请求转发 System.out.println("转发成功! 即将转到/hello页面"); context.getRequestDispatcher("/hello").forward(req,resp); //转发到/hello路径下 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
ServletContext对象对项目中的资源进行加载,这里需要使用Properties类,点击了解此类
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.InputStream; import java.util.Properties; public class ServletContext03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); ServletContext context = this.getServletContext(); InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties"); //加载一个资源转为流的形式 Properties prop = new Properties(); prop.load(is); //从字节流中加载数据 String user = prop.getProperty("username"); //获得key-value值 String pwd = prop.getProperty("password"); //获得key-value值 resp.getWriter().println(user + ": " + pwd); System.out.println(user + ": " + pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }