Servlet、ServletConfig、ServletContext

每一个Servlet都必须由web容器读取了该Servlet的配置信息(web部署描述符中或@WebServlet中配置的信息)并初始化,才算是一个Servlet。
对于每个Servlet的配置信息,web容器都会为其生成一个ServletConfig对象,你可以从ServletConfig对象中取得Servlet的初始参数以及代表整个web应用程序的ServletContext对象

GenericServlet

在Servlet接口中,定义了init()、service()、destroy()管理Servlet生命周期的方法

1. web容器启动后,会读取Servlet配置信息,将Servlet加载并实例化,为每一个Servlet生成一个对应的ServletConfig对象,用于维护对应Servlet的初始化参数
2. 调用init()方法,将ServletConfig对象传入,这一步由GenericServlet帮我们实现了,GenericServlet主要的作用就是封装ServletConfig对象,GenericServlet中init()方法如下:
public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}

public void init() throws ServletException {
}
3. GenericServlet在实现顶层接口Servlet的init()方法,还调用了一个无参的init()方法;在编写Servlet时候,如果有一些在初始化需要额外运行的动作,可以重新定义这个无参数的init()方法,而不是直接重新定义带参数的init()方法
4. 有一点需要注意,一般对象想在初始化的时候就定义额外运行的动作,会在构造器中进行,而在Servlet却不行,因为Servlet在初始化的时候还没有调用init()方法,所以定义Servlet构造器是获取不到ServletConfig对象,只能重新定义init()方法
5. GenericServlet中也有一些操作ServletConfig对象的方法,如下:
public String getInitParameter(String name) {
    return this.getServletConfig().getInitParameter(name);
}

public Enumeration<String> getInitParameterNames() {
    return this.getServletConfig().getInitParameterNames();
}

public ServletConfig getServletConfig() {
    return this.config;
}

public String getServletName() {
    return this.config.getServletName();
}

public ServletContext getServletContext() {
    return this.getServletConfig().getServletContext();
}
6. GenericServlet还定义一些log方法,用于打印日志,一般很少用这些方法,因为功能简单

使用ServletConfig

/**
 * 每个Servlet对象都会有对应的ServletConfig对象,
 * 该对象维护了每个Servlet的初始化参数信息和表示整个web容器环境的ServletContext
 */
@WebServlet(name = "ServletConfigServlet",
        urlPatterns = "/useServletConfig",
        initParams = {
                @WebInitParam(name = "key", value = "每个Servlet的初始参数"),
                @WebInitParam(name = "say", value = "我是一个没什么卵用的初始化参数")
        })
public class ServletConfigServlet extends HttpServlet {

    /**
     * 自定义init()初始化方法,用于操作ServletConfig对象
     */
    public void init() throws ServletException {
        // 在Servlet实例化后调用初始化方法,维护ServletConfig信息,此时需要注意的就是引用需要定义成全局变量
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取ServletConfig对象
        ServletConfig config = getServletConfig();

        // 2、获取自身Servlet的初始化参数
        Enumeration<String> initParams = config.getInitParameterNames();

        // 3、获取具体的初始化参数,值:我是一个没什么卵用的初始化参数
        String initValue = config.getInitParameter("say");

        // 4、获取当前Servlet的名称,值:ServletConfigServlet
        String servletName = config.getServletName();

        // 5、获取表示整个web容器的ServletContext
        ServletContext context = config.getServletContext();
    }

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

    }
}
可以在Servlet初始化的时候就获取初始化参数,不过需要自定义init()方法,也可以直接获取ServletConfig对象,GenericServlet已经帮我们初始化了ServletConfig对象;自定义init()比较麻烦但十分灵活
初始化参数也可以在web部署描述符中定义,如下:
<servlet>
    <servlet-name>ServletConfigServlet</servlet-name>
    <servlet-class>ServletConfigServlet</servlet-class>
    <init-param>
        <param-name>key</param-name>
        <param-value>每个Servlet的初始参数</param-value>
    </init-param>
    <init-param>
        <param-name>say</param-name>
        <param-value>我是一个没什么卵用的初始化参数</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ServletConfigServlet</servlet-name>
    <url-pattern>/useServletConfig</url-pattern>
</servlet-mapping>

使用ServletContext

ServletContext维护了web容器环境的数据,web容器每次启动只会实例化一个ServletContext对象,ServletConfig提供了获取ServletContext示例的接口方法,由GenericServlet实现了。
/**
 * ServletContext中的一些方法
 */
@WebServlet(name = "ServletContextServlet", urlPatterns = "/context")
public class ServletContextServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 1、获取ServletContext实例
        ServletContext context = getServletContext();

        // 2、获取RequestDispatcher示例,此时的URL的开头必须包含ContextPath,
        // 如果没有设置ContextPath就是“/”,此时的ContextPath为“/web”
        // 以“/”开头的URL称为环境相对路径,context.getRequestDispatcher()通过环境实例获取
        // 没有则称为请求相对路径,request.getRequestDispatcher()通过请求实例获取
        context.getRequestDispatcher("/web/xxx");

        // 3、获取应用程序中某个目录中的资源文件,可以使用getResourcePaths()
        // 此时获取WEB-INF目录中所有资源路径的路径
        Set<String> ress = context.getResourcePaths("/WEB-INF");
        ress.forEach(System.out::println);

        // 4、如果想在应用程序中读取某个文件的内容,则可以使用getResourceAsStream()方法,
        // 使用时必须以ContextPath开头,或者相对/WEB-INF目录的路径
        InputStream in = context.getResourceAsStream("/WEB-INF/pdf/dsaj.pdf");

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Servlet、GenericServlet、HttpServlet Servlet 对于web容易来说,所有se...
    六尺帐篷阅读 1,360评论 0 4
  • 目标 servlet的生命周期 servletConfig与ServletContext定义,及其二者的区别 监听...
    arkulo阅读 962评论 0 5
  • 本文包括: Servlet简介关于Servlet的一些类 Servlet生命周期 ServletConfig获得初...
    廖少少阅读 3,855评论 1 67
  • http://blog.csdn.net/luman1991/article/details/52678559 基...
    Nic_ofh阅读 1,830评论 0 3
  • 即将步入二十一岁,在事业还未起步,人际关系不稳定的阶段,现在的一份工作可能是一种历练,可不能靠打工,终其一生,劳劳...
    宛夏如阅读 279评论 0 1