• Servlet基础(GenericServlet)


    GenericServlet

    1,GenericServlet是什么?

            它也是一个Servlet类,是一个抽象类。

            下面是它的源代码。

    public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {}

    2,GenericServlet有什么作用?已经有了Servlet为什么还需要提供GenericServlet?

    2.1,直接实现Servlet接口有什么缺点?

    从上一章得Servlet基础中得例子可以看出:

    要想完成一个webapp的创建,必须的满足Servlet规范。也就是说一定得实现Servlet接口,

    我们知道一个类要实现一个接口必须要实现接口的所有方法。问题就来了,我们程序员在编写servlet类的时候,其实最主要是要用service方法,其它方法很少用到。这样代码是很不理想的。        

    2.2,使用模板方法设计模式解决Servlet的缺点

            创建一个类(这个类就是GenericServlet)实现Servlet接口,把经常使用的方法改成抽象方法(所以这个类也得变成抽象类),其它的方法可以默认实现 。当然 还可以补充方法。

    当你想创建一个Servlet类的时候就可以直接继承该类,serviece方法是一定要重写的。其它方法可以选择重不重写。

    ServletConfig

    从上面我们可以看到GenericServlet不仅实现了Servlet接口,还实现类ServletConfig接口。

    而且Servlet类中还有一个getServletConfig的方法。那么ServletConfig究竟是什么呢?

    1,ServletConfig是什么?

    ServletConfig接口在:javax.servlet.ServletConfig 

                                        显然ServletConfig是Servlet规范中的一员                                  

    2,ServletConfig是干嘛的?

     Config是哪个单词的缩写:configuration(配置) 

    ServletConfig对象被翻译为:Servlet对象的配置信息对象。 

    一个Servlet对象就有一个配置信息对象。

    3,ServletConfig对象当中包装类什么信息呢?  

     

            configTest 

            com.javaweb.servlet.ConfigTestServlet 

     

    ServletConfig对象中包装的信息是:

     web.xml文件中标签的配置信息 

     Tomcat解析web.xml文件,将web.xml文件中的标签的配置信息自动包装到ServletConfig对象中。

     4,ServletConfig对象是谁创建的?在什么时候创建的?

     Tomcat服务器(WEB服务器)创建了ServletConfig对象。

     在创建Servlet对象的时候,同时创建了ServletConfig对象

    注意:一个Servlet对象对应一个ServletConfig对象

    5,ServletConfig接口有哪些常用方法

    注意:以下方法在代码中体现作用

    1. Enumeration getInitParameterNames();
    2. String getInitParameter(String name);
    3. ServletContext getServletContext();
    4. String getServletName();
    5. 以上的四个方法,在自己编写的Servlet类中可以使用this调用,(这个Servlet继承了GenericServlet)

     6,ServletConfig接口方法代码示例:

    6.1,web.xml的配置

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>configTestservlet-name>
    8. <servlet-class>com.javaweb.servlet.ConfigTestServletservlet-class>
    9. <init-param>
    10. <param-name>driverparam-name>
    11. <param-value>com.mysql.cj.jdbc.Driverparam-value>
    12. init-param>
    13. <init-param>
    14. <param-name>urlparam-name>
    15. <param-value>jdbc:mysql://localhost:3306/db2?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTCparam-value>
    16. init-param>
    17. <init-param>
    18. <param-name>userparam-name>
    19. <param-value>rootparam-value>
    20. init-param>
    21. <init-param>
    22. <param-name>passwordparam-name>
    23. <param-value>123456param-value>
    24. init-param>
    25. servlet>
    26. <servlet-mapping>
    27. <servlet-name>configTestservlet-name>
    28. <url-pattern>/testurl-pattern>
    29. servlet-mapping>
    30. web-app>
    1. package com.javaweb.servlet;
    2. import javax.servlet.*;
    3. import java.io.IOException;
    4. import java.io.PrintWriter;
    5. import java.util.Enumeration;
    6. public class ConfigTestServlet extends GenericServlet {
    7. @Override
    8. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    9. servletResponse.setContentType("Text/html;charset=UTF-8");
    10. PrintWriter out = servletResponse.getWriter();
    11. //获取ServletConfig
    12. ServletConfig servletConfig = this.getServletConfig();
    13. //输出该对象
    14. System.out.println(servletConfig);//org.apache.catalina.core.StandardWrapperFacade@5321de25
    15. out.print("ServletConfig对象是:"+servletConfig);
    16. out.print("
      "
      );
    17. //获取
    18. String name = servletConfig.getServletName();
    19. out.print(""+name+"");//configTest
    20. out.print("
      "
      );
    21. //通过ServletConfig的两个方法,可以获取到web.xml文件中的初始化参数配置信息
    22. //Enumeration getInitParameterNames()
    23. //String getInitParameter(String name)
    24. Enumeration initParameterNames = servletConfig.getInitParameterNames();
    25. //遍历集合
    26. while (initParameterNames.hasMoreElements()){
    27. String parameterName = initParameterNames.nextElement();
    28. out.print(parameterName+"
      "
      );
    29. //password driver user url
    30. }
    31. //通过初始化参数的name获取value
    32. String driver = servletConfig.getInitParameter("driver");
    33. out.print(driver);//com.mysql.cj.jdbc.Driver
    34. //怎么获取ServletContext对象?
    35. //第一种通过ServletConfig对象获取ServletContext对象
    36. ServletContext application = servletConfig.getServletContext();
    37. //输出
    38. out.print("
      "
      +application);//org.apache.catalina.core.ApplicationContextFacade@5dae17d8
    39. //第二种方式:通过this(继承了GenericServlet)获取,
    40. ServletContext application2 = this.getServletContext();
    41. out.print("
      "
      +application2);//org.apache.catalina.core.ApplicationContextFacade@5dae17d8
    42. }
    43. }

    ServletText

    从上面我们可以看到,ServletConfig和GenericServlet都有getServletContext()的方法。

    那么ServletContext是什么呢?

    1,ServletContext是什么?

    ServletConfig是接口,也是Servlet规范中的一员。

    全路径名称:javax.servlet.ServletContext

    2,ServletContext有什么用呢?

    ServletContext怎么理解:

    context是什么意思:context:上下文/环境 

    ServletContext:Servlet对象的环境对象/Servlet对象的上下文对象 

    ServletContext对象其实对应的是整个web.xml文件。

            

    50个学生,每个学生都是一个Servlet,这50个对象都在一个教室中,那么这个教室就相当于ServletContext对象 

    放在ServletContext对象中的数据,说有Servlet一定是共享的 

    比如:一个教室中的空调是说有学生共享的,一个教室的语文老师是说有学生共享的。

            

    ServletContext是应用级对象 

    Tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp(应用)对应一个ServletContext对象

    3,ServletContext由谁创建?什么时候创建?

    1,ServletContext是谁实现的: 

    Tomcat服务器(WEB服务器),实现了ServletContext接口。  public class org.apache.catalina.core.ApplicationContextFacade implements ServletContext{} 

    2,ServletContext对象是什么时候创建的,在什么时候销毁的的:

    ServletContext对象在WEB服务器启动的时候创建的。

    ServletContext对象是WEB服务器创建的。 

    对应一个webapp来说,ServletContext对象只有一个。 

    ServletContext对象在服务器关闭的时候销毁

    4,ServletContext接口中有哪些常用的方法?

    注意:虽然都是初始化参数,但是这里是上下文的初始化参数,在所有标签外面 *

    public String getInitParameter(String name);//通过初始化参数的name获取value 

    public Enumeration getInitParameterNames();//获取所有的初始化参数name 

    * 以上两个方法获取的是以下信息 *

    *  

            pageSize 

             

            10 

     

     

             startIndex 

            0 

    *

    注意:以上的配置信息属于应用级的配置信息,一般一个项目中共享的配置信息会被放到以上的标签中。 

    如果你的配置信息只想给某一个servlet作为参考,那么你只需要配置到servlet标签中,使用标签 

    使用ServletConfig对象来获取 

    //public String getContextPath();   获取context path(获取应用上下文的根) 

    //public String getRealPath(String path);  获取文件的绝对路径(真实路径) *

    *通过ServletContext对象也是可以记录日志的 *

    public void log(String message); 

    public void log(String message,Throwable t);

    代码示例:

    1. package com.javaweb.servlet;
    2. import javax.servlet.*;
    3. import java.io.IOException;
    4. import java.io.PrintWriter;
    5. import java.util.Enumeration;
    6. public class AServlet extends GenericServlet {
    7. @Override
    8. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    9. response.setContentType("text/html;charset=utf-8");
    10. PrintWriter out = response.getWriter();
    11. //获取ServletContext对象
    12. ServletContext application = this.getServletContext();
    13. out.print("ServletContext对象是:"+application);
    14. out.print("
      "
      );
    15. //获取上下文的初始化参数
    16. Enumeration initParameterNames = application.getInitParameterNames();
    17. while (initParameterNames.hasMoreElements()){
    18. String name=initParameterNames.nextElement();
    19. String value = application.getInitParameter(name);
    20. out.print(name+"="+value+"
      "
      );
    21. //startIndex=0
    22. //pageSize=10
    23. }
    24. //获取context path(获取应用上下文的根);
    25. //public String getContextPath(); 很重要:因为在Java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态的获取应用的根路径
    26. //在Java源码当中,不要将应用的根路径写死,因为你有冤都不知道这个应用在最终部署的时候,起一个什么名字。
    27. String contextPath = application.getContextPath();
    28. out.print(contextPath+"
      "
      );// "/servlet04"
    29. // public String getRealPath(String path);
    30. // 获取文件的绝对路径(真实路径)
    31. //后面加”/“,代表是从web的根下开始找
    32. // String realPath = application.getRealPath("/index.html");//可以
    33. //后面不加”/“,默认也是从web的根下开始找
    34. String realPath = application.getRealPath("index.html");//不加”/“也可以
    35. out.print(realPath+"
      "
      );
    36. String realPath1 = application.getRealPath("/common/common.html");
    37. out.print(realPath1+"
      "
      );
    38. //准备数据
    39. User user = new User("jack", "123");
    40. //向ServletContext应用域中存储数据
    41. application.setAttribute("userObj",user);
    42. //取出来(在A中取)
    43. Object userObj = application.getAttribute("userObj");
    44. //输出到浏览器
    45. out.print(userObj+"
      "
      );
    46. }
    47. }

    1. package com.javaweb.servlet;
    2. import javax.servlet.*;
    3. import java.io.IOException;
    4. import java.io.PrintWriter;
    5. public class BServlet extends GenericServlet {
    6. @Override
    7. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    8. response.setContentType("text/html;charset=utf-8");
    9. PrintWriter out = response.getWriter();
    10. //获取ServletContext对象
    11. ServletContext application = this.getServletContext();
    12. out.print("ServletContext对象是:"+application);
    13. //log记录日志
    14. //这个日志会记录在哪里?
    15. //CATALINA_HOME/logs目录下
    16. //如果使用的是原始的你方法,没有集成开发工具 ,是可以记录到tomcat的logs目录下的
    17. //但是,使用集成开发工具,会记录到相关的文件中
    18. application.log("大家好,我是一个学习IT的小萌新。");
    19. //我的原始的tomcat的路径是:D:\apache-tomcat-9.0.68
    20. //Using CATALINA_BASE: "C:\Users\cxvqq\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat\6b4fb480-0ba5-4dee-b2f7-1287a36abb30"
    21. //该目录下的logs文件的catalina...文件是记录:服务器端Java程序运行的控制台信息
    22. //localhost_access...文件记录的是:访问的日志(一次请求一次记录)
    23. //localhost..文件记录的是:ServletConfig对象的log方法记录的日志信息
    24. // 就是application.log("大家好,我是一个学习IT的小萌新。"),
    25. out.print("
      "
      );
    26. //取出来(如果直接访问会是null,需要先发送A请求把数据存进去)
    27. Object userObj = application.getAttribute("userObj");
    28. //输出到浏览器
    29. out.print(userObj+"
      "
      );
    30. }
    31. }

  • 相关阅读:
    学习CentOS7系统安装nginx环境,以及相关配置命令
    互连芯片浪潮席卷AI服务器:突破瓶颈,再创辉煌
    MapStruct代码生成器实现对象转换
    给你安利一款带有AI功能的数据库管理工具
    web基础与http协议
    【QT开发(15)】QT在没有桌面的系统中可以使用
    电脑怎么保存网页到桌面上使用
    ts知识点——基础积累
    混合灰狼和布谷鸟搜索优化算法(Matlab完整代码实现)
    如何绑定 Webhook 推送
  • 原文地址:https://blog.csdn.net/qq_52215881/article/details/127416876