Servlet(2) Servlet的继承体系

1 Servlet继承体系

1.1 Servlet的继承体系

Servlet只是一个接口,我们创建的Servlet程序都是继承于HttpServlet类,通过查看源码,可以看到Servlet的整个继承体系:

在这里插入图片描述

Servlet接口:
	提供几个抽象方法负责Servlet程序的规范

GenericServlet类:
	实现了Servlet接口,但对Servlet接口中的抽象方法进行了空实现
	持有一个ServletConfig接口的对象
	并对ServletConfig对象进行了一些方法调用

HttpServelt类:
	主要实现了service方法,完成了请求的分发处理
	即将来自客户端的请求分类为get,post由doGet和doPost处理
	想要正常的处理get和post请求,需要重写doGet和doPost方法

MyServlet类:
	继承了HttpServlet类,根据自己的业务逻辑重写doGet和doPost方法

1.2 ServletConfig

每个Servlet程序都会有一个自己的ServletConfig对象,Servlet程序和ServletConfig对象都是由Tomcat直接创建的,ServletConfig是当Servlet程序被创建时,为其创建一个对应的ServletConfig对象,一个Servlet程序对应一个ServletConfig对象,不能获取其它Servlet程序的信息

ServletConfig对象的功能:

1,获取Servlet程序的别名
	即web.xml中的servlet-name
	
2,获取Servlet程序的初始化参数
	即web.xml中的init-param
	
3,获取ServletContext对象

web.xml中的Servlet程序配置:

    <!--  演示4 ServletConfig  -->
    <servlet>
        <servlet-name>MyServlet4</servlet-name>
        <servlet-class>com.coisini.servlet.MyServlet4</servlet-class>

        <!-- 
        	初始化Servlet程序参数 
        	这些参数是MyServlet4独有的 其它Servlet程序无法得到
        	可以通过ServletConfig对象来获取
        -->
        <init-param>
            <param-name>userName</param-name>
            <param-value>root</param-value>
        </init-param>

        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet4</servlet-name>
        <url-pattern>/MyServlet4</url-pattern>
    </servlet-mapping>

获取ServletConfig对象,得到其对应的Servlet程序的信息:

/**
 * @author 雫
 * @date 2021/4/27 - 15:00
 * @function
 */
public class MyServlet4 implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    	
        // 获取Servlet程序对象的别名
        System.out.println(servletConfig.getServletName());

        // 获取初始化参数
        System.out.println(servletConfig.getInitParameter("userName"));
        System.out.println(servletConfig.getInitParameter("password"));

        // 获取ServletContext对象
        System.out.println(servletConfig.getServletContext());
	}

    @Override
    public ServletConfig getServletConfig() { return null; }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}

    @Override
    public String getServletInfo() { return null; }
    
    @Override
    public void destroy() {}

}

在这里插入图片描述

1.3 ServletContext

ServletContext是一个接口,表示Servlet程序的上下文,一个工程中只有一个ServletContext对象,整个ServletContext对象是一个域对象,在Web工程启动时创建,Web工程停止时销毁

域对象
	可以像Map一样存储数据的对象,域就是存取数据的操作范围
	ServletContext对象的域是整个Web工程
	可以通过setAttribute getAttribute removeAttribute存储数据

ServletContext对象的功能:

1,像Map一样存取数据
	可以通过setAttribute getAttribute removeAttribute存取数据
	当前工程下的所有Servlet程序都能操作同一个ServletContext对象中的数据

2,获取当前的工程路径
	即web项目的虚拟路径

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

4,获取工程部署后,在服务器磁盘上的绝对路径
	映射到IDEA代码的webapp目录

web.xml中的配置:

<!-- 上下文参数(属于整个Web工程) 可由ServletContext获取 -->
    <context-param>
        <param-name>id</param-name>
        <param-value>1999</param-value>
    </context-param>

    <context-param>
        <param-name>nick</param-name>
        <param-value>coisini</param-value>
    </context-param>

	<!--  演示5 ServletContext  -->
    <servlet>
        <servlet-name>MyServlet5</servlet-name>
        <servlet-class>com.coisini.servlet.MyServlet5</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet5</servlet-name>
        <url-pattern>/MyServlet5</url-pattern>
    </servlet-mapping>

任意一个Servlet程序中获取ServletContext对象,得到整个web工程的信息:

/**
 * @author 雫
 * @date 2021/4/27 - 15:26
 * @function
 */
public class MyServlet5 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取ServletContext对象
        ServletContext servletContext = getServletConfig().getServletContext();

        // 获取web.xml中的上下文参数
        System.out.println(servletContext.getInitParameter("id"));
        System.out.println(servletContext.getInitParameter("nick"));

        // 获取当前工程路径 由于设置了虚拟路径为/ 这里没有值
        System.out.println("path: " + servletContext.getContextPath());

        // 获取工程部署后在磁盘上的绝对路径 及工程下文件的路径
        System.out.println("realPath: " + servletContext.getRealPath("/"));
//        System.out.println("工程下的img1文件的绝对路径" + servletContext.getRealPath("/img/1.jpg"));

        // 像Map一样存取数据
        servletContext.setAttribute("var1", "xyz");
        System.out.println("var1: " + servletContext.getAttribute("var1"));
        servletContext.removeAttribute("var1");
        System.out.println("var1: " + servletContext.getAttribute("var1"));

        servletContext.setAttribute("var2", "123");

    }


}


/**
 * @author 雫
 * @date 2021/4/24 - 16:50
 * @function 处理表单3的Servlet程序
 */
public class MyServlet3 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单3的数据以post的方式提交");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单3的数据以get的方式提交");

        // ServletContext对象只有一个且其中的数据共享给所有Servlet程序
        ServletContext servletContext = getServletContext();
        System.out.println("var2: " + servletContext.getAttribute("var2"));
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值