ServletContext

保存一个数据并显示在页面上

  1. public class HelloServlet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. //this.getInitParameter() 初始化参数
  5. //this.getServletConfig() Servlet配置
  6. //this.getServletContext() Servlet上下文
  7. //ServletContext作用就是保存数据
  8. //通过 getServletContext()方法获得
  9. ServletContext context1 = this.getServletContext();
  10. resp.setContentType("text/html");
  11. resp.setCharacterEncoding("UTF-8");
  12. //将一个数据保存到 ServletContext中,名字为:username,值为username
  13. String username = "shilin.z";
  14. context1.setAttribute("username",username);
  15. }
  16. @Override
  17. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  18. doGet(req, resp);
  19. }
  20. }

ServletContext作用就是保存数据
通过 getServletContext()方法获得 一个ServletContext容器
ServletContext context1 = this.getServletContext();
然后通过setAttribute()方法将数据存储到ServletContext对象中
image.png

将保存的数据显示在另一个页面上

  1. public class GetServlet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. ServletContext context = this.getServletContext();
  5. //从ServletContext对象中取出数据,赋值给一个变量
  6. String username = (String)context.getAttribute("username");
  7. resp.setContentType("text/html");
  8. resp.setCharacterEncoding("utf-8");
  9. //将刚才取出的数据输出
  10. resp.getWriter().print("名字:"+username);
  11. }
  12. @Override
  13. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. doGet(req, resp);
  15. }
  16. }

从ServletContext中取出数据需要用到 getAttribute("数据名") 这里的 数据名 是前面放数据的时候定义的,要和放数据的Servlet对应着看。

总结:

感觉ServletContext像是一个可以保存数据的大容器,每个web程序都有一个这样的容器,
通过 this.getServletContext() 方法可以获取一个这样的容器(对象)
通过 setAttribute("数据名","数据值") 方法往里写入数据,
通过 getAttribute("数据名") 方法从中读取数据
一轮复习遇到的一些问题 - 图2

请求转发

  1. <!-- 配置一些web应用的初始化参数-->
  2. <context-param>
  3. <param-name>url</param-name>
  4. <param-value>jdbc:mysql://local:3306/mybatis</param-value>
  5. </context-param>
  1. public class ServletDemo04 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. ServletContext context = this.getServletContext();
  5. System.out.println("进入ServletDemo04");
  6. //转发的请求路径
  7. //ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径;
  8. //void forward(ServletRequest request,ServletResponse response)
  9. // RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");用来传递request的
  10. // requestDispatcher.forward(req,resp); //调用forward实现请求转发
  11. //合并上面两句话
  12. context.getRequestDispatcher("/gp").forward(req,resp);
  13. }

RequestDispatcher(String url) 让两个servlet相互通信成为可能,就像是浏览器发送request请求一样。
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
通过这段代码,我们可以得到一个映射到/gp(URL)的Servlet的RequestDispatcher
requestDispatcher.forward(req,resp);
然后通过 forward() 方法来调用RequsetDispather

  1. <servlet>
  2. <servlet-name>gp</servlet-name>
  3. <servlet-class>com.dyq.servlet.ServletDemo03</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>gp</servlet-name>
  7. <url-pattern>/gp</url-pattern>
  8. </servlet-mapping>
  9. <servlet>
  10. <servlet-name>s4</servlet-name>
  11. <servlet-class>com.dyq.servlet.ServletDemo04</servlet-class>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>s4</servlet-name>
  15. <url-pattern>/s4</url-pattern>
  16. </servlet-mapping>

总结:

从xml文件可以看到,这是一个网页(/s4)向另一个网页(/gp)请求转发
这个转发是,s4网页向ServletContext请求获得gp的资源,之后再转发给自己。

转发和重定是不一样的!
一轮复习遇到的一些问题 - 图3

请求读取文件资源

文件资源(db.properties

  1. username=root
  2. password=123456
  1. public class ServletDemo05 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. //把资源变成一个流
  5. InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
  6. Properties prop = new Properties();
  7. prop.load(is);
  8. String username = prop.getProperty("username");
  9. String password = prop.getProperty("password");
  10. resp.getWriter().print(username+":"+password);
  11. }
  12. @Override
  13. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. super.doPost(req, resp);
  15. }
  16. }

ServletContext. getResourceAsStream(String path)默认从WebAPP根目录下取资源
Properties类表示一组持久的属性。Properties可以保存到流中或从流中加载。属性列表中的每个键及其对应的值都是一个字符串。
void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)。
String getProperty(String key) 使用此属性列表中指定的键搜索属性。