Servlet ServletConfig接口、ServletContext接口详解

public class org.apache.catalina.core.StandardWrapperFacade implements ServletConfig {}

**结论:**Tomcat服务器实现了ServletConfig接口。
思考:如果把Tomcat服务器换成jetty服务器,输出ServletConfig对象的时候,还是这个结果吗?不一定一样,包名类名可能和Tomcat不一样。但是他们都实现了ServletConfig这个规范。

(3)一个Servlet对象中有一个ServletConfig对象。

Servlet和ServletConfig对象是一对一,100个Servlet,就应该有100个ServletConfig对象。

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

Tomcat服务器(WEB服务器)创建了ServletConfig对象。
在创建Servlet对象的时候,同时创建ServletConfig对象,然后才能调用init方法把ServletConfig对象传进去。

(5)ServletConfig接口有什么用?

Config是哪个单词的缩写?Configuration(配置),所以ServletConfig对象被翻译为:Servlet对象的配置信息对象。一个Servlet对象就有一个对应的配置信息对象!

(6)ServletConfig对象中包装了什么信息?

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

(7)ServletConfig接口中有哪些方法?ServletConfig接口中有4个方法:

方法1:public String getServletName()

可以获取到web.xml配置文件中里面的名字

方法2: public Enumeration getInitParameterNames()

获取所有的初始化参数的name,返回一个集合

实际上通过上面两种方法的联合使用:可以获取到web.xml文件中Servlet对象的初始化参数配置信息

方法3:public String getInitParameter(String name)

遍历集合,拿到每一个name,然后根据name获取value
方法4:public ServletContext getServletContext(); 后面会重点讲解

ServletConfig对象对应整个web.xml文件
以上的4个方法,有两种方法可以进行调用:

**第一种:**调用getServletConfig()方法获取到ServletConfig对象,然后进行方法的调用

**第二种:**在自己编写的Servlet类当中也可以使用this去调用。因为通过原码发现GenericServlet也实现了ServletConfig接口, 而自己编写的Servlet类又要实现GenericServlet类,所以直接用this调用也行!

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

ConfigTestServlet类继承GenericServlet

package com.bjpowernode.javaweb.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class ConfigTestServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 设置响应的内容类型
        response.setContentType("text/html");
        // 设置输出的位置
        PrintWriter out = response.getWriter();

        // 获取ServletConfig对象
        ServletConfig config = this.getServletConfig();
        // 输出该对象
        // org.apache.catalina.core.StandardWrapperFacade@7d72f398、
        out.print("ServletConfig对象是:"+config.toString());
        out.print("<br>");

        // 获取<servlet-name></servlet-name>
        String servletName = config.getServletName();
        out.print("<servlet-name>"+servletName+"</servlet-name>"); // configTest
        out.print("<br>");

        // <servlet></servlet>标签中的<init-param></init-param>是初始化参数。
        // 这个初始化参数信息会自动被Tomcat封装到ServletConfig对象当中。下面就进行获取
        // 通过ServletConfig对象的两个方法,可以获取到web.xml文件中的初始化参数配置信息。
        // java.util.Enumeration<java.lang.String>	getInitParameterNames() 获取所有的初始化参数的name
        // java.lang.String	getInitParameter(java.lang.String name) 通过初始化参数的name获取value
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        // 遍历集合
        while(initParameterNames.hasMoreElements()){ // 是否有更多元素
            // 取元素(每一个name)
            String parameterName = initParameterNames.nextElement();
            // 通过name获取value
            String parameterVal = config.getInitParameter(parameterName);
            // 进行输出打印
            out.print(parameterName+"="+parameterVal );
            out.print("<br>");
            /*
                password=root1234
                driver=com.mysql.jdbc.Driver
                user=root
                url=jdbc:mysql://localhost:3306/bjpowernode
             */
        }


        // 重点:通过原码发现GenericServlet也实现了ServletConfig接口,
        // 而ConfigTestServlet类又实现了GenericServlet类,所以直接用this掉用也行
        Enumeration<String> names = this.getInitParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            // 通过name获取value
            String value = this.getInitParameter(name);
            // 输出到控制台
            System.out.println(name +"="+value);
        }


    }
}

web.xml配置信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>configTest</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class>

        <!--这里是可以配置一个Servlet对象的初始化信息-->
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/bjpowernode</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>root1234</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>configTest</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

总结:

  • 什么是ServletConfig?

    • Servlet对象的配置信息对象,一个Servlet对象就有一个ServletConfig(配置信息)。
    • ServletConfig对象中封装了标签中的配置信息。(web.xml文件中servlet的配置信息)
  • 一个Servlet对应一个ServletConfig对象。

  • Servlet对象是Tomcat服务器创建,并且ServletConfig对象也是Tomcat服务器创建。并且默认情况下,他们都是在用户发送第一次请求的时候创建。

  • Tomcat服务器调用Servlet对象的init方法的时候需要传一个ServletConfig对象的参数给init方法。

  • ServletConfig接口的实现类是Tomcat服务器给实现的。(Tomcat服务器就是WEB服务器)

  • ServletConfig接口有哪些常用的方法?

public String getInitParameter(String name); // 通过初始化参数的name获取value
public Enumeration getInitParameterNames(); // 获取所有的初始化参数的name
public ServletContext getServletContext(); // 获取ServletContext对象
public String getServletName(); // 获取Servlet的name

* **以上四个方法在Servlet类当中,都可以使用this去调用。因为我们自己编写的类继承了GenericServlet,而GenericServlet又实现了ServletConfig接口。**



二:ServletContext接口

获取ServletContext对象的两种方式:

// 第一种方式:通过ServletConfig对象获取ServletContext对象。
ServletContext application = config.getServletContext();
//org.apache.catalina.core.ApplicationContextFacade@f0fa019
out.print("<br>" + application); 

// 第二种方式:通过this也可以获取ServletContext对象。
ServletContext application2 = this.getServletContext();
//org.apache.catalina.core.ApplicationContextFacade@f0fa019
out.print("<br>" + application2); 

(1)ServletContext是什么?

ServletContext是一个接口,Tomcat服务器对ServletContext接口进行了实现。

(2)ServletContext是谁实现的?

Tomcat服务器(WEB服务器)实现了ServletContext接口。

一个Servlet对象对应一个ServletConfig。100个Servlet对象则对应100个ServletConfig对象。但是只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。

  public class org.apache.catalina.core.ApplicationContextFacade 
implements ServletContext {}

(3)ServletContext对象是谁创建的?在什么时候创建的?

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

ServletContext对象WEB服务器启动的时候创建,在服务器关闭的时候销毁!

这就是ServletContext对象的生命周期,ServletContext对象是应用级对象。
Tomcat服务器中有一个webapps,这个webapps下可以存放webapp,可以存放多个webapp,假设有100个webapp,那么就有100个ServletContext对象。但是总之一个应用,一个webapp肯定是只有一个ServletContext对象。

(4)ServletContext怎么理解?

context是什么意思:Servlet对象的环境对象。(Servlet对象的上下文对象
一个ServletContext对象其实对应的就是整个web.xml文件。
理解:50个学生,每个学生都是一个Servlet,这50个学生都在同一个教室当中。那么这个教室就相当于ServletContext对象。并且放在ServletContext对象当中的数据,所有Servlet一定是共享的。
例如:一个教室中的空调是所有学生共享的,一个教室中的语文老师是所有学生共享的。
Tomcat是一个容器,一个容器当中是可以放多个webapp,但是一个webapp只对应一个ServletContext对象。

(5)验证ServletContext对象是共享的!

定义一个Aservlet和一个Bservlet,通过这两个类都继承GenericServlet,然后调用getServletContext()方法获得ServletContext对象,发现是同一个对象。

Aservlet

package com.bjpowernode.javaweb.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;


public class Aservlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 设置响应代码类型
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        // 获取ServletContext对象
        ServletContext application = this.getServletContext();
        // 输出打印
        // org.apache.catalina.core.ApplicationContextFacade@3d8fcad7
        out.print(application);

    }
}

Bservlet

package com.bjpowernode.javaweb.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;


public class Bservlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 设置响应代码类型
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        // 获取ServletContext对象
        ServletContext application = this.getServletContext();
        // 输出打印
        // org.apache.catalina.core.ApplicationContextFacade@3d8fcad7
        out.print(application);

    }
}

配置文件web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>aservlet</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.Aservlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>aservlet</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>bservlet</servlet-name>
        <servlet-class>com.bjpowernode.javaweb.servlet.Bservlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>bservlet</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>
</web-app>

执行结果

(6)ServletContext接口中有哪些常用的方法?

①public String getInitParameter(String name)  通过初始化参数的name获取value
②public Enumeration getInitParameterNames() 获取所有的初始化参数的name

ServletContext对象中也有这两个方法,这个两个方法获取的是上下文的初始化参数配置信息;这些配置信息用ServletContext对象来获取。

增加配置信息

注意:

①以下的配置信息属于应用级的配置信息(相当于全局的配置信息),一般一个项目中共享的配置信息会放到以下的**标签当中,使用ServletContext对象来获取
②如果你的配置信息只是想给
某一个servlet**作为参考,那么你配置到 ****标签当中即可,使用ServletConfig对象来获取

 <context-param>
        <param-name>pageSize</param-name>
        <param-value>10</param-value>
    </context-param>
    <context-param>
        <param-name>startIndex</param-name>
        <param-value>0</param-value>
    </context-param>
    

增加通过方法调用获取到配置信息

 // 获取上下文的初始化参数
 Enumeration<String> initParameterNames = application.getInitParameterNames();
 while(initParameterNames.hasMoreElements()){
       // 获取每一个对象
       String name = initParameterNames.nextElement();
       // 通过name获取value
       String value = application.getInitParameter(name);
       out.print(name+"="+value);
       out.print("<br>");
 }
/*
    startIndex=0
    pageSize=10
*/

③public String getContextPath() 获取应用的根路径,相当于拿到了项目名!

// 动态获取context path (获取应用上下文的根)
String contextPath = application.getContextPath();
out.print(contextPath+"<br>"); // "/servlet04"

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

例如:我们都知道web是根目录,那么就在web根目录下面创建一个common目录;然后在common目录下在创建一个common.html文件。

后面的这个路径,加了一个“/”,这个“/”代表的是web的根;不加“/”,默认也是从根下开始找



### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料
  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值