GenericServlet(java自己编写好了)

  • 我们编写一个Servlet类直接实现Servlet接口有什么缺点?
    • 我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。
  • 适配器设计模式Adapter
    • 手机直接插到220V的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个适配器。手机连接适配器。适配器连接220V的电压。这样问题就解决了。
  • 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service
    • GenericServlet实现Servlet接口。
    • GenericServlet是一个适配器。
    • 以后编写的所有Servlet类继承GenericServlet,重写service方法即可。
  • 思考:GenericServlet类是否需要改造一下?怎么改造?更利于子类程序的编写?
    • 思考第一个问题:我提供了一个GenericServlet之后,init方法还会执行吗?
      • 还会执行。会执行GenericServlet类中的init方法。
    • 思考第二个问题:init方法是谁调用的?
      • Tomcat服务器调用的。
    • 思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?
      • 都是Tomcat干的。
      • Tomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象传给了init方法。
    • 思考一下Tomcat服务器伪代码:
public class Tomcat {
    public static void main(String[] args){
        // .....
        // Tomcat服务器伪代码
        // 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)
        Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");
        Object obj = clazz.newInstance();
        /*newInstance方法主要作用?
        通过 Class 类的 newInstance() 方法创建对象,该方法要求该 Class 对应类有无参构造		方法
  		 */     
        
        // 向下转型
        Servlet servlet = (Servlet)obj;
        
        // 创建ServletConfig对象
        // Tomcat服务器负责将ServletConfig对象实例化出来。
        // 多态(Tomcat服务器完全实现了Servlet规范)
        ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();
        
        // 调用Servlet的init方法
        servlet.init(servletConfig);
        
        // 调用Servlet的service方法
        // ....
        
    }
}

ServletConfig接口

ServletConfig

  • ServletConfig是什么?

     jakarta.servlet.ServletConfig(ServletConfig是Servlet规范中的一员。)
     ServletConfig对象中封装了标签中的配置信息。(web.xml文件中servlet的配置信息)
     ServletConfig是一个接口。(jakarta.servlet。Servlet是一个接口)
    
  • 谁去实现了这个接口呢?

public class org.apache.catalina.core.StandardWrapperFacade implements Servlet{}
结论:Tomcat服务器实现了ServletConfig接口。
思考:如果把Tomcat服务器换成jetty服务器,输出ServletConfig对象,还是这个结果吗?
不一定一样,包名类名可能和Tomcat不一样。但是他们都实现了ServletConfig这个规范。

  • 一个Servlet对象中有一个ServletConfig对象。(Servlet和ServletConfig对象是一对一。

100个Servlet,就应该有100个ServeltConfig对象。

  • ServletConfig对象是谁创建的? 什么时候创建的?
    • Tomcat服务器(WEB服务器) 创建了ServletConfig对象。
    • 在创建Servllet对象的时候,同时创建了ServletConfig对象

ServletConfig接口到底是干啥的?有什么用?

Config是Configuration单词的缩写?
servletConfig对象被翻译为:Servlet对象的配置信息对象。
一个Servlet对象就有一个配置信息对象。
两个Servlet对象就有两个配置信息对象。

ServletConfig对象中到底包装了什么信息呢?
Tomcat小猫咪解析web.xml文件,将web.xml文件中标签中的配置信息自动包装到ServletConfig对象中。

  <servlet>
        <servlet-name>ServletConfig</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class>
    </servlet>
    ServletConfig对象中包装的信息是:
     web.xml文件中M<servlet></servlet>标签的配置信息。
  • 7、ServletConfig接口中有哪些方法

         <servlet>
            <servlet-name>ServletTest02</servlet-name>
            <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet2</servlet-class>
      
            <!--这里是可以配置一个Servlet对象的初始化信息的-->
            <init-param>
                <param-name>url</param-name>
                <param-value>jdbc:mysql://localhost:3306/bjpowernode</param-value>
            </init-param>
            <init-param>
                <param-name>driver</param-name>
                <param-value>com.mysql.jdbc.Driver</param-value>
            </init-param>
            <init-param>
                <param-name>user</param-name>
                <param-value>root</param-value>
            </init-param>
            <init-param>
                <param-name>password</param-name>
                <param-value>root</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletTest02</servlet-name>
            <url-pattern>/test02</url-pattern>
        </servlet-mapping>
        以上<servlet></servlet>标签中<init-param></init-param>是初始化参数,这个初始化参数信息会自动被小猫咪自动封装到ServletConfig当中
        通过ServletConfig对象的两个方法,可以获取到web.xml文件中的配置信息。
        //获取所有初始化参数的name 返回一个集合
        java.util.Enumeration<java.lang.String> getInitParameterNames()
        //通过名字获取web.xml配置文件中的value属性
        java.lang.String getInitParmaneter(java.lang.String name)
    
  • 以上标签中是初始化参数,这个初始化参数信息会自动被小猫咪自动封装到ServletConfig当中,通过ServletConfig对象的两个方法,可以获取到web.xml文件中的配置信息。

  • ServletConfig两个方法:

    1. getInitParameterNames() :
      获取所有初始化参数的name 返回一个集合:
      全称: java.util.Enumeration<java.lang.String> getInitParameterNames()
    2. getInitParmaneter() :
      通过名字获取web.xml配置文件中的value属性
      全称:java.lang.String getInitParmaneter(java.lang.String name)</java.lang.String>

8、ServletConfig接口中有4个方法:

      第1个方法:
          public String getInitParameter(String name);//通过初始化参数的name获取value
      第2个方法:
          public Enumeration<String> getInitParameterNames();//获取所有的初始化参数的name
      第3个方法:
          public ServletContext getServletContext();//获取ServletContext对象
      第4个方法:
          public String getServletName();//获取Servlet的name
      以上的4个方法,在自己编写的Servlet类当中也可以使用this去调用。(因为GenericServlet实现了ServletConfig接口)

原文地址:http://www.cnblogs.com/atao-BigData/p/16804986.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性