1. ServletConfig

Servlet是开发动态web的技术,而web.xml是Tomcat工程中最基础也最重要的配置文件,Tomcat启动项目的时候会加载并读取这个文件,其中web.xml中在servlet标签中会有关于servlet的配置,可以使用一个或多个<init-param></init-param>标签为servlet配置一些初始化参数。

1.1  如下为servlet配置一些初始化参数。

1.2 通过ServletConfig获取servlet的初始化参数

可以通过如下程序获得servlet的初始化参数。

  1. package MyServletDemo;
  2.  
  3. import java.io.IOException;
  4. import java.util.Enumeration;
  5. import javax.servlet.ServletConfig;
  6. import javax.servlet.ServletException;
  7. //import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. /**
  13. * Servlet implementation class MyServletDemo
  14. */
  15. //@WebServlet("/ServletDemo1")
  16. public class ServletDemo1 extends HttpServlet {
  17. private ServletConfig config;
  18. @Override
  19. public void init(ServletConfig config) throws ServletException {
  20. this.config = config;
  21. }
  22. public void doGet(HttpServletRequest request, HttpServletResponse response)
  23. throws ServletException, IOException {
  24. //获取在web.xml中配置的初始化参数
  25. String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数
  26. response.getWriter().print(paramVal);
  27.  
  28. response.getWriter().print("<hr/>");
  29. //获取所有的初始化参数
  30. Enumeration<String> e = config.getInitParameterNames();
  31. while(e.hasMoreElements()){
  32. String name = e.nextElement();
  33. String value = config.getInitParameter(name);
  34. response.getWriter().print(name + "=" + value + "<br/>");
  35. }
  36. }
  37.  
  38. public void doPost(HttpServletRequest request, HttpServletResponse response)
  39. throws ServletException, IOException {
  40. this.doGet(request, response);
  41. }
  42. }

当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

运行后显示以下结果。

需要注意,在servlet3.0之后的版本,可以通过@WebServlet直接映射,即@WebServlet相当于web.xml中的<servlet-mapping></servlet-mapping>这个标签的作用。在上面的获取servlet的初始化参数的例子中,已经在web.xml中有了<servlet-mapping></servlet-mapping>这个映射标签,所以ServletDemo1.java这个程序中就不需要再使用@WebServlet("/ServletDemo1")了。

2. ServletContext对象

2.1 为什么需要ServletContext?

①访问某个网站时候,往往都会看到网站的首页面显示您是第几位浏览者(网站计数器),这是如何实现的?

②显示论坛在线人数

2.2 什么是ServletContext?

要理解ServletContext先来和cookie,session做一个对比。

  • cookie:是指存储在客户端上的信息,浏览器一旦关闭cookie就被清除。每个用户都有独立的存储cookie的空间,互相独立,只能自己访问自己的cookie。
  • session:是指存储在服务器端的信息。每个用户都有独立的存储session的空间,互相独立,只能自己访问自己的session。
  • servletContext:servletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图。ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承GenericServlet的关系,GenericServlet类和HttpServlet类同时具有该方法。所有用户都可以访问servletContext,比如说我用谷歌给ServletContext 传递了信息,不仅在谷歌页面能获得ServletContext中的信息,在IE浏览器输入正确的网址也能得到ServletContext中的信息。

下图可以很好的说明他们之间的关系。

什么是ServletContext?

  • ServletContext是一个用于和servlet容器交流的servlet类,它定义一个方法的集合,例如获得文件的类型,分派调遣request对象或者写一个日志文件。
  • web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
  • ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig().getServletContext()方法获得ServletContext对象。
  • 由于一个web应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

2.3 ServletContext的应用

2.3.1 多个servlet通过ServletContext对象实现数据共享

上面提到过servlet之间可以通过ServletContext对象来实现通讯,下面两个程序ServletContextDemo1和ServletContextDemo2通过ServletContext对象实现了数据共享。

ServletContextDemo1.java

  1. package MyServletDemo;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class ServletContextDemo1 extends HttpServlet{
  11. public void doGet(HttpServletRequest request,HttpServletResponse response)
  12. throws ServletException,IOException{
  13. String data = "servletcontextdemodata";
  14. //通过ServletConfig.getServletContext方法获得ServletContext对象
  15. ServletContext context = this.getServletConfig().getServletContext();
  16. //将data存储到ServletContext对象中
  17. context.setAttribute("data", data);
  18. }
  19. public void doPost(HttpServletRequest request, HttpServletResponse response)
  20. throws ServletException, IOException {
  21. doGet(request, response);
  22. }
  23. }

ServletContextDemo2.java

  1. package MyServletDemo;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class ServletContextDemo2 extends HttpServlet {
  11.  
  12. public void doGet(HttpServletRequest request, HttpServletResponse response)
  13. throws ServletException, IOException {
  14. ServletContext context = this.getServletContext();
  15. //从ServletContext对象中取出数据
  16. String data = (String) context.getAttribute("data");
  17. response.getWriter().print("data="+data);
  18. }
  19.  
  20. public void doPost(HttpServletRequest request, HttpServletResponse response)
  21. throws ServletException, IOException {
  22. doGet(request, response);
  23. }
  24. }

先运行ServletContextDemo1,将数据data存储到ServletContext对象中,然后运行ServletContextDemo2就可以从ServletContext对象中取出数据了,这样就实现了数据共享,如下图所示:

注意要在web.xml中进行配置:

2.3.2 通过ServletContext获取web应用的初始化参数

在web.xml文件使用<context-param>标签配置web应用的初始化参数,

编写代码ServletContextDemo3获得web的初始化参数,

  1. package MyServletDemo;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class ServletContextDemo3 extends HttpServlet {
  11.  
  12. public void doGet(HttpServletRequest request, HttpServletResponse response)
  13. throws ServletException, IOException {
  14.  
  15. ServletContext context = this.getServletContext();
  16. //获取整个web站点的初始化参数
  17. String contextInitParam = context.getInitParameter("URL链接");
  18. response.getWriter().print(contextInitParam);
  19. }
  20.  
  21. public void doPost(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25.  
  26. }

在web.xml中进行配置servlet,

运行后显示如下结果:

2.3.3 用ServletContext实现请求转发

ServletContextDemo4.java

  1. package MyServletDemo;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import javax.servlet.RequestDispatcher;
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class ServletContextDemo4 extends HttpServlet {
  13.  
  14. public void doGet(HttpServletRequest request, HttpServletResponse response)
  15. throws ServletException, IOException {
  16. String data = "<h1><font color='red'>servletcontextDemo4</font></h1>";
  17. response.getOutputStream().write(data.getBytes());
  18. //获取ServletContext对象
  19. ServletContext context = this.getServletContext();
  20. //获取请求转发对象(RequestDispatcher)
  21. RequestDispatcher rd = context.getRequestDispatcher("/ServletContextDemo5");
  22. //调用forward方法实现请求转发
  23. rd.forward(request, response);
  24. }
  25.  
  26. public void doPost(HttpServletRequest request, HttpServletResponse response)
  27. throws ServletException, IOException {
  28. }
  29. }

ServletContextDemo5.java

  1. package MyServletDemo;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8.  
  9. public class ServletContextDemo5 extends HttpServlet {
  10.  
  11. public void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. response.getOutputStream().write("servletDemo5".getBytes());
  14. }
  15.  
  16. public void doPost(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18. this.doGet(request, response);
  19. }
  20.  
  21. }

先来看看ServletContextDemo4.java代码中的RequestDispatcher,看API帮助文档。

也就是说,RequestDispatcher定义一个对象,该对象接收来自客户端的请求,并将它们发送到服务器上的任何资源(例如servlet,HTML文件或JSP文件)。 servlet容器创建RequestDispatcher对象,该对象用作位于特定路径或由特定名称给定的服务器资源的包装器。此接口旨在包装servlet,但servlet容器可以创建RequestDispatcher对象来包装任何类型的资源。

上述代码中通过RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");获取请求转发内容。

getRequestDispatcher()返回一个RequestDispatcher对象,该对象充当位于给定路径的资源的包装器。 RequestDispatcher对象可用于将请求转发到资源或将资源包含在响应中。 资源可以是动态的也可以是静态的。

路径名必须以/开头,并且被解释为相对于当前上下文根。 使用getContext为外部上下文中的资源获取RequestDispatcher。
如果ServletContext无法返回RequestDispatcher,则此方法返回null。

运行之前还是要在web.xmLl中进行配置。

运行ServletContextDemo5.java,显示如下结果:

运行ServletContextDemo4.java,实现了通过访问ServletContextDemo4,浏览器显示ServletContextDemo5的内容,也就是实现了请求转发的功能。

未完,待续。

欢迎搜索微信公众号“程序员考拉”,关注更多精彩内容!

Servlet开发(三)之ServletConfig,ServletContext的更多相关文章

  1. javaweb学习总结(六)——Servlet开发(三) 常见问题疑问

    [1]response.getWriter().write()与out.print()的区别http://blog.csdn.net/javaloveiphone/article/details/81 ...

  2. day05 Servlet 开发和 ServletConfig 与 ServletContext 对象

    day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...

  3. Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件

    转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...

  4. JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response

    1.  ServletConfig  有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...

  5. JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...

  6. (转)JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...

  7. JavaWeb学习总结(三):Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  8. Server,Servlet,ServletConfig,ServletContext,Session,Request,Response

    Server流程 解析URL->找到应用->找到Servlet->实例化Servlet->调用init->调用service->返回响应->调用destroy ...

  9. java web学习总结(六) -------------------servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

随机推荐

  1. PHP中预定义超全局数组(变量)

    PHP中许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用.超全局变量除了具有全局变量特点外,在函数或方法中无需执行global $variable:就可以访问它们. 提供超全 ...

  2. Django 允许其他可以访问的设置

    第一步:在run下修改edit 第二步:host改为0.0.0.0 第三步:setting文件中将    ALLOWED_HOSTS 改为 :ALLOWED_HOSTS = ['*',] 这样就可以通 ...

  3. Maven web项目(简单的表单提交) 搭建(eclipse)

    我们将会搭建一个,基于Maven管理的,具有简单的表单提交功能的web项目,使用DAO--service--WEB三层结构,服务器使用Tomcat 1 项目基本结构的搭建 左上角File---> ...

  4. spring测试save方法报错

    用test类测试service的save方法时,报错如下: 2018-08-24 21:52:13,506 - could not read a hi value com.mysql.jdbc.exc ...

  5. django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066

    1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate(*args,**kwargs) : 通过对QuerySet进行计算 ,返回一个聚合值的字典. ...

  6. idea 修改jar包源码的编码

    项目中有些老的jar不是utf8打包的,中文显示乱码 打开的文件上直接右键, 修改只读jar的源码 自己写的文件可以在右下角修改编码,只读文件就要用上面的方法了

  7. Python学习 day11

    一.装饰器 装饰器是在不改变函数调用方式的情况下,需要在函数前后新增功能.有些类似aop,不知道原理是否相同,表现是一样的. 装饰器严格遵守了“开放封闭原则” 1.基本装饰器 def wrapper( ...

  8. myEclipse或eclipse复制或修改项目后的部署名称

    第一种方式: 右键工程-properties-Deployment-Deployment Assembly下 修改Web Content Root名称即可.见下图 第二种方式: 右键工程-proper ...

  9. Rancher 1.6 版本 只能在 linux 下用

    实际操作 启动 , 访问方式 : 在启动过程中会发现没有 image , 然后自动下载 ( 执行 docker pull 命令 ) docker run --rm --privileged -v /v ...

  10. C语言实现链表

    #include<stdio.h>#include<malloc.h>#include<stdlib.h> typedef struct Node {    int ...