JavaEE-Servlet,ServletConfig,ServletContext

一.Servlet(Server Applet 服务器小程序)

Servlet生命周期: 
    当第一次访问servlet时创建,或配置load-on-startup随服务器启动而创建,调用init();      
    当WEB应用结束时销毁,调用destroy();
    默认只创建一个servlet对象,多个网络连接共享同一个servlet,
    也可以配成多个servlet对象,一个网络连接独享一个servlet,低效耗内存,不建议!
    
Servlet线程安全
    默认只创建一个Servlet实例,多个网络连接(多线程)共享同一个Servlet对象
    若使用Servlet成员变量保存数据,则多线程并发修改该成员变量,数据被覆盖丢失,出现线程安全问题!
    所以除了必要的共享数据,慎用Servlet成员变量!
                        
在 WEB应用/WEB-INF/web.xml 配置  
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>win.lioil.MyServlet</servlet-class>
        <load-on-startup>1</load-on-startup>  <!-- 随服务器启动而创建,其中数值指定启动顺序,0~5,越小优先级越高-->
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
        <url-pattern>/aaa/MyServlet</url-pattern>
        <url-pattern>/aaa/*</url-pattern>
        <url-pattern>/*</url-pattern>     <!-- /* 路径匹配: 任意路径, 会覆盖 DefaultServlet 和 JspServlet, 无法访问静态资源和jsp文件-->
        <url-pattern>/</url-pattern>      <!-- /  路径匹配: 任意路径(*.jsp除外), 会覆盖 DefaultServlet, 无法访问静态资源-->
        <url-pattern>*.mp3</url-pattern>  <!-- *.mp3 后缀名匹配: 以mp3为后缀的任意路径-->
    </servlet-mapping>
    
    匹配范围越大,优先级越低, 优先级: /MyServlet > /aaa/* > *.mp3 > /*
    路径匹配 和 后缀名匹配 不能混合使用, 例如: /*.txt
                
在 Tomcat/conf/web.xml 默认配置 DefaultServlet.java, 用于处理WEB项目中的静态资源(html,css,js,png等文件), 输出错误页面
在 Tomcat/conf/web.xml 还默认配置 JspServlet.java, 用于处理WEB项目中的jsp文件
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
    
    <!-- 注意: 在 WEB应用/WEB-INF/web.xml 不应该配置"/", "/*", "*.jsp", "*.jspx"等任意路径, 
               因为它们都会覆盖 DefaultServlet 或 JspServlet, 使默认功能失效-->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

二.ServletConfig

在 WEB应用/WEB-INF/web.xml 配置serlet的初始化参数(其它servlet不能访问)
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>win.lioil.MyServlet</servlet-class>
        <init-param>
            <param-name>name1</param-name>
            <param-value>value1</param-value>
        </init-param>
    </servlet>
    
在 MyServlet.java 获取初始化参数
    getServletConfig().getInitParameter("name1");
    getServletConfig().getInitParameterNames();
    getServletConfig().getServletName();
    
ServletConfig-常用方法
    String getInitParameter(String name) 获取servlet初始化参数值
    Enumeration getInitParameterNames()  获取servlet所有初始化参数名
    String getServletName()              获取servlet名称 (<servlet-name>MyServlet</servlet-name>)
    ServletContext getServletContext()   获取ServletContext对象

三.ServletContext(Application)

1.概念

ServletContext 是 Application 域对象, 代表整个WEB应用, 在整个WEB应用范围内共享数据, 服务器组件之间的通讯。
作用域: 整个WEB应用
生存期: 当WEB应用启动时创建, 当WEB应用结束时销毁

2.WEB应用-Attribute

在WEB应用中共享数据,例如: 在不同servlet间共享数据
getServletContext().setAttribute(String name, Object value);
getServletContext().removeAttribute(String name);
getServletContext().getAttribute(String name);
getServletContext().getAttributeNames();

3.WEB应用-初始化参数

在 WEB应用/WEB-INF/web.xml 配置WEB应用的初始化参数
    <context-param>
        <param-name>user</param-name>
        <param-value>password</param-value>
    </context-param>
    
在 MyServlet.java 获取WEB应用的初始化参数
    getServletContext().getInitParameter("user");
    getServletContext().getInitParameterNames();

4.WEB请求-转发

Servlet转发: 在服务器内部转发,不涉及客户端(一次Http请求和响应)
    getServletContext().getRequestDispatcher("/OtherServlet").forward(request, response);
    
Http重定向: 要求客户端重新请求(两次Http请求和响应)
    状态码 302
    响应头 Location: http://www.lioil.win

5.WEB资源-本地路径

在Servlet类中
    getServletContext().getRealPath("")  获取WEB应用目录的绝对路径

在非Servlet类中
    Class.getResource(String path)          
        当 path 不以'/'开头: 从类所在目录开始
        当 path 以'/'开头:   从类加载目录ClassPath开始(WEB应用的classes目录)
            
        getClass().getResource("")       当前类所在目录
        getClass().getResource("/")      WEB应用的classes目录
        getClass().getResource("/..")    WEB应用的WEB-INF目录(..表示上一级目录)
        getClass().getResource("/../..") WEB应用目录
        
        假设当前类是win.lioil.Util.java, 获取相同目录下的config.txt,有两种方法,如下:
        getClass().getResource("config.txt") 等价于 getClass().getResource("/win/lioil/config.txt")
    
    Class.getClassLoader().getResource(String path)
        path 只能 从类加载目录ClassPath开始(WEB应用的classes目录)
        
        getClass().getClassLoader().getResource("")      WEB应用的classes目录
        getClass().getClassLoader().getResource("..")    WEB应用的WEB-INF目录(..表示上一级目录)
        getClass().getClassLoader().getResource("../..") WEB应用目录
        
        假设当前类是win.lioil.Util.java, 获取相同目录下的config.txt
        getClass().getClassLoader().getResource("win/lioil/config.txt")

简书: http://www.jianshu.com/p/55e934b5d68a
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54618638
GitHub博客:http://lioil.win/2017/01/19/Servlet.html
Coding博客:http://c.lioil.win/2017/01/19/Servlet.html

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

推荐阅读更多精彩内容