ServletConfig和ServletContext 的介绍和代码实现

简介: ServletConfig和ServletContext 的介绍和代码实现

ServletConfig

ServletConfig 基本介绍

ServletConfig 类是为 Servlet 程序的配置信息的类

Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建

Servlet 程序默认是第 1 次访问的时候创建,ServletConfig 在 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象

ServletConfig 类能干什么

获取 Servlet 程序的 servlet-name 的值

获取初始化参数 init-param

获取 ServletContext 对象

为什么需要 ServletContext

先看一个需求:如果我们希望统计某个 web 应用的所有 Servlet 被访问的次数,怎么办?

1. 方案 1-DB

2. 方案 2-ServletCntext

代码实战

● 需求: 编写 DBServlet.java 完成如下功能

1. 在 web.xml 配置连接 mysql 的用户名和密码

2. 在 DBServlet 执行 doGet()/doPost() 时,可以获取到 web.xml 配置的用户名和密

1. public class DBServlet extends HttpServlet {
2. 
3. 
4. /**
5.      * 梳理ServletConfig config 使用流程
6.      * 1. 当DBServlet对象初始化时, tomcat会同时创建一个 ServletConfig对象
7.      * 2. 这时如果DBServlet init() 方法中你调用 super.init(config);
8.      * 3. 调用 父类 GenericServlet
9.      * public void init(ServletConfig config) throws ServletException {
10.      * this.config = config;
11.      * this.init();
12.      * }
13.      * 这时就会把 Tomcat创建的 ServletConfig对象赋给 GenericServlet的属性 config
14.      * 4. 因此如果你重写init()方法,记住如果你想在其它方法通过 getServletConfig() 方法获取ServletConfig
15.      * , 则一定要记住 调用  super.init(config);
16.      * @param config
17.      * @throws ServletException
18.      */
19. 
20. @Override
21. public void init(ServletConfig config) throws ServletException {
22. //ConcurrentHashMap, 是一个线程安全的容器.
23.         System.out.println("init" + config);
24. super.init(config);
25.     }
26. 
27. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
28. 
29. //在DBServlet 执行 doGet()/doPost() 时,可以获取到web.xml配置的用户名和密码
30. 
31. //DBServlet的父类GenericServlet有getServletConfig()
32. /**
33.          * 解读
34.          * 1. getServletConfig() 方法是 GenericServlet
35.          * 2. 返回的 servletConfig对象是 GenericServlet private transient ServletConfig config;
36.          * 3. 当一个属性被 transient 修饰,表示该属性不会被串行化(有些重要信息,不希望保存到文件)
37.          */
38. ServletConfig servletConfig = getServletConfig();
39.         System.out.println("doPost=" + servletConfig);
40. String username = servletConfig.getInitParameter("username");
41. String pwd = servletConfig.getInitParameter("pwd");
42.         System.out.println("初始化参数username= " + username);
43.         System.out.println("初始化参数pwd= " + pwd);
44. 
45.     }
46. 
47. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
48.         doPost(request, response);
49.     }
50. }

xml配置

1. <!--配置DBServlet-->
2. <servlet>
3. <servlet-name>DBServlet</servlet-name>
4. <servlet-class>com.servlet.DBServlet</servlet-class>
5. <!--配置信息,而不是硬编码到程序-->
6. <init-param>
7. <param-name>username</param-name>
8. <param-value>xxx</param-value>
9. </init-param>
10. <init-param>
11. <param-name>pwd</param-name>
12. <param-value>123456</param-value>
13. </init-param>
14. </servlet>
15. 
16. <servlet-mapping>
17. <servlet-name>DBServlet</servlet-name>
18. <url-pattern>/db</url-pattern>
19. </servlet-mapping>

ServletContext

ServletContext 基本介绍

1. ServletContext 是一个接口,它表示 Servlet 上下文对象

2. 一个 web 工程,只有一个 ServletContext 对象实例

3. ServletContext 对象 是在 web 工程启动的时候创建,在 web 工程停止的时销毁

4. ServletContext 对象可以通过 ServletConfig.getServletContext 方法获得对 ServletContext对象的引用,也可以通过 this.getServletContext()来获得其对象的引用。

5. 由于一个 WEB 应用中的所有 Servlet 共享同一个 ServletContext 对象,因此 Servlet 对象之间可以通过 ServletContext 对象来实现多个 Servlet 间通讯。ServletContext 对象通常也被称之为域对象。【示意图】

ServletContext 可以做什么

1. 获取 web.xml 中配置的上下文参数 context-param [信息和整个 web 应用相关,而不是属于某个 Servlet]

2. 获取当前的工程路径,格式: /工程路径 =》 比如 /servlet

3. 获取工程部署后在服务器硬盘上的绝对路径如D:\xx\xx\xx\xx

4. 像 Map 一样存取数据多个 Servlet 共享数据

代码实战

● 需求如下:

1. 获取 web.xml 中配置的上下文参数 context-param

2. 获取当前的工程路径,格式: /工程路径

3. 获取工程部署后在服务器硬盘上的绝对路径

1. public class ServletContext_ extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3. //获取web.xml的context-parameter
4. 
5. //1.获取到ServletContext对象
6. ServletContext servletContext = getServletContext();
7. //2. 获取website
8. String website = servletContext.getInitParameter("website");
9. String company = servletContext.getInitParameter("company");
10. //3. 获取项目的工程路径
11. String contextPath = servletContext.getContextPath();
12. //4. 获取项目发布会,正在的工作路径
13. //   /表示我们的项目(发布后)的 根路径
14. String realPath = servletContext.getRealPath("/");
15.         System.out.println("项目路径= " + contextPath);// /servlet
16.         System.out.println("website= " + website);
17.         System.out.println("company= " + company);
18.         System.out.println("项目发布后的绝对路径= " + realPath);
19. 
20.     }
21. 
22. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
23.         doPost(request, response);
24.     }
25. }

代码实战2

网站访问次数计数器

创建PayServlet

1. public class PayServlet extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3. 
4. //获取到ServletContext对象
5. ServletContext servletContext = getServletContext();
6. // System.out.println("PayServlet servletContext= " +
7. //         servletContext + " 运行类型=" + servletContext.getClass());
8. //
9. // //从servletContext获取 visit_count 属性 k-v
10. // Object visit_count = servletContext.getAttribute("visit_count");
11. // //判断visit_count是否为null
12. // if (visit_count == null) {//说明是第1次访问网站
13. //     servletContext.setAttribute("visit_count", 1);
14. //     visit_count = 1;
15. // } else { //是第二次或以后
16. //     //取出visit_count属性的值+1
17. //     visit_count = Integer.parseInt(visit_count + "") + 1;
18. //     //放回到servletContext
19. //     servletContext.setAttribute("visit_count", visit_count);
20. // }
21. Integer visit_count = WebUtils.visitCount(servletContext);
22. //输出显示
23.         response.setContentType("text/html;charset=utf-8");
24. PrintWriter writer = response.getWriter();
25.         writer.print("<h1>新网站被访问的次数是" + visit_count + "</h1>");
26.         writer.flush();
27.         writer.close();
28.     }
29. 
30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
31.         doPost(request, response);
32.     }
33. }

创建OrderServlet

1. public class OrderServlet extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3. 
4. //获取到ServletContext对象
5. ServletContext servletContext = getServletContext();
6. // System.out.println("OrderServlet servletContext= " +
7. //         servletContext + " 运行类型=" + servletContext.getClass());
8. 
9. // //从servletContext获取 visit_count 属性 k-v
10. // Object visit_count = servletContext.getAttribute("visit_count");
11. // //判断visit_count是否为null
12. // if (visit_count == null) {//说明是第1次访问网站
13. //     servletContext.setAttribute("visit_count", 1);
14. //     visit_count = 1;
15. // } else { //二次或以后
16. //     //取出visit_count属性的值+1
17. //     visit_count = Integer.parseInt(visit_count + "") + 1;
18. //     //放回到servletContext
19. //     servletContext.setAttribute("visit_count", visit_count);
20. // }
21. 
22. Integer visit_count = WebUtils.visitCount(servletContext);
23. 
24. //输出显示
25.         response.setContentType("text/html;charset=utf-8");
26. PrintWriter writer = response.getWriter();
27.         writer.print("<h1>新网站被访问的次数是" + visit_count + "</h1>");
28.         writer.flush();
29.         writer.close();
30. 
31. 
32.     }
33. 
34. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35.         doPost(request, response);
36.     }
37. }

创建WebUtils

1. public class WebUtils {
2. 
3. //这个方法就是对访问的次数累积,同时返回次数
4. public static Integer visitCount(ServletContext servletContext) {
5. //从servletContext获取 visit_count 属性 k-v
6. Object visit_count = servletContext.getAttribute("visit_count");
7. //判断visit_count是否为null
8. if (visit_count == null) {//说明是第1次访问网站
9.             servletContext.setAttribute("visit_count", 1);
10.             visit_count = 1;
11.         } else { //二次或以后
12. //取出visit_count属性的值+1
13.             visit_count = Integer.parseInt(visit_count + "") + 1;
14. //放回到servletContext
15.             servletContext.setAttribute("visit_count", visit_count);
16.         }
17. 
18. return Integer.parseInt(visit_count + "");
19.     }
20. }

在web.xml 中配置两个 servle

1. <servlet>
2. <servlet-name>OrderServlet</servlet-name>
3. <servlet-class>com.servlet.servletcontext.OrderServlet</servlet-class>
4. </servlet>
5. 
6. <servlet-mapping>
7. <servlet-name>OrderServlet</servlet-name>
8. <url-pattern>/orderServlet</url-pattern>
9. </servlet-mapping>
10. <servlet>
11. <servlet-name>PayServlet</servlet-name>
12. <servlet-class>com.servlet.servletcontext.PayServlet</servlet-class>
13. </servlet>
14. 
15. <servlet-mapping>
16. <servlet-name>PayServlet</servlet-name>
17. <url-pattern>/payServlet</url-pattern>
18. </servlet-mapping>


目录
相关文章
|
8月前
|
存储 应用服务中间件 数据库
【JavaWeb】知识总结Ⅸ(ServletConfig, ServletContext)
ServletConfig 类是为 Servlet 程序的配置信息的类 2. Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建 3. Servlet 程序默认是第 1 次访问的时候创建, ServletConfig 在 Servlet 程序创建时,就创 建一个对应的 ServletConfig ServletConfig 类能干什么 1. 获取 Servlet 程序的 servlet-name 的值 2. 获取初始化参数 init-param 3. 获取 ServletContext 对象
|
11月前
|
存储 应用服务中间件 测试技术
Servlet中的ServletConfig对象、ServletContext对象以及Servlet3.0
Servlet中的ServletConfig对象、ServletContext对象以及Servlet3.0
54 1
|
11月前
|
应用服务中间件
初识ServletConfig
初识ServletConfig
50 0
|
12月前
|
应用服务中间件 容器
ServletConfig、ServletContext概述、配置及ServletContext的三个作用
ServletConfig、ServletContext概述、配置及ServletContext的三个作用
117 0
Servlet学习(五):ServletConfig类的作用
ServletConfig的作用: 1、可以获取Servlet程序的别名servlet-name的值 2、获取初始化参数init-param 3、获取ServletContext对象
112 0
Servlet学习(五):ServletConfig类的作用
Servlet——ServletContext对象功能
Servlet——ServletContext对象功能
73 0
|
XML Java 应用服务中间件
谈谈 ServletConfig 和 ServletContext
我们都知道Servlet是框架的灵魂,学习web框架最底层离不开Servlet的支持,那么Servlet 是什么呢?如何创建一个Servlet 不是本文的重点,相关文章可以参考
75 0
|
应用服务中间件
|
应用服务中间件
ServletConfig对象
ServletConfig对象介绍