Servlet

一.Servlet概述

Servlet是JavaWeb的三大组件之一,它属于动态资源。
三大组件:Servlet,filter,listener

1.Servlet的作用
Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据
  • 处理请求
  • 完成响应

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!每个Servlet必须实现javax.servlet.Servlet接口。

2.实现Servlet的方式

  • 实现javax.servlet.Servlet接口;
  • 继承javax.servlet.GenericServlet类;
  • 继承javax.servlet.http.HttpServlet类;

我们现在最常用的实现Servlet的方式就是继承HttpServlet类。

3.Servlet接口
Servlet.java

public interface Servlet{

    public void init(ServletConfig config) throws ServletException;
    /*
    *  getServletConfig这个方法可以用来获取Servlet的配置信息
    */
    public ServletConfig getServletConfig();

    public  void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    /*
    *  getServletInfo这个方法获取Servlet的信息
    */
    public String getServletInfo();

    public  void destroy();

}

Servlet中的方法大多数不由自己来调用,而是由Tomcat来调用。并且Servlet的对象也不由自己来创建,由Tomcat来创建!

  • 生命周期方法
    • void init(ServletConfig servletConfig)
      这个方法会在Servlet对象创建之后马上执行,并只执行一次。初始化!
    • void destroy()
      这个方法会在Servlet被销毁之前调用,并且只会被调用一次
    • void service(ServletRequest request, ServletResponse response)
      这个方法会被调用多次,每次处理请求都是调用这方法。

二.Servlet的生命周期

服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)

该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

Servlet的生命周期

1.浏览器访问Servlet
a.给Servlet指定一个路径,让Servlet和一个路径绑定在一起
b.浏览器访问Servlet路径

在web.xml中对Servlet进行配置

<?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>xxx</servlet-name>
    <servlet-class>demo/cn.edu.web.servlet/AServlet.java</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>xxx</servlet-name>
        <url-pattern>/AServlet</url-pattern>
    </servlet-mapping>
</web-app>
浏览器访问Servlet

<url-pattern>
<url-pattern>是<servlet-mapping>的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头!

  • 可以在<servlet-mapping>中给出多个<url-pattern>
<servlet-mapping>
    <servlet-name>AServlet</servlet-name>
    <url-pattern>/AServlet</url-pattern>
    <url-pattern>/BServlet</url-pattern>
  </servlet-mapping>

这说明一个Servlet绑定了两个URL,无论访问/AServlet还是/BServlet,访问的都是AServlet。

  • 在<url-pattern>中使用通配符
    通配符就是星号“*”,星号可以匹配任何URL前缀或后缀,使用通配符可以命名一个Servlet绑定一组URL
    • <url-pattern>/servlet/*<url-patter>:/servlet/a、/servlet/b,都匹配/servlet/*;
    • <url-pattern>*.do</url-pattern>:/abc/def/ghi.do、/a.do,都匹配*.do;
    • <url-pattern>/*<url-pattern>:匹配所有URL;

三.HttpServlet

1.HttpServlet概述
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。

2.HttpServlet的方法

HttpServlet的方法

3.HttpServlet的原理

HttpServlet的原理

也就是Servlet类要继承HttpServlet,重写doGet()或doPost()方法
重写doGet()或doPost()方法,如果没有重写doGet()或doPost()方法,并且被调用了doGet()或doPost()方法,会出现405。

四.ServletContext

1.ServletContext概述
一个项目只有一个ServletContext对象,可以给多个Servlet传递数据

ServletContext对象在服务器启动时创建,在服务器关闭时销毁。

2.获取ServletContext

  • 在void init(ServletConfig config)中:
    ServletContext context = config.getServletContext();
    ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;

  • 在GenericeServlet或HttpServlet中获取ServletContext对象:
    GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;

3.域对象的功能
域对象就是用来在多个Servlet中传递数据。

  • 域对象必须有要存数据功能
  • 域对象必须要有取数据功能

域对象内部有一个Map,用来存储数据

ServletContext是JavaWeb四大域对象之一:
四大域:

  • page(PageContext)
  • request(ServletRequest)
  • session(HttpSession)
  • application(ServletContext)

4.ServletContext对象操作数据的方法

  • void setAttribute(String name, Object value)
    用来存储一个对象,也可以说是存储一个域属性
    eg:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同
  • Object getAttribute(String name)
    用来获取ServletContext中的数据,在获取之前需要先去存储才行
    eg:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
  • void removeAttribute(String name)
    用来移除ServletContext中的域属性。一对一对的删除。如果参数name指定的域属性不存在,那么本方法什么都不做。
  • Enumeration getAttributeNames()
    获取所有域属性的名称

5.获取应用初始化参数
可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同
Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备。

web.xml

<web-app ...>

 ...

  <context-param>

  <param-name>paramName1</param-name>

  <param-value>paramValue1</param-value>  

  </context-param>

  <context-param>

  <param-name>paramName2</param-name>

  <param-value>paramValue2</param-value>  

  </context-param>

用ServletContext获取公共的初始化参数

//获取ServletContext对象
 ServletContext context =this.getServletContext();
  
//通过参数名获取参数值
 String value1 = context.getInitParameter("paramName1");
 String value2 = context.getInitParameter("paramName2");
 System.out.println(value1 + ", " + value2);
//paramValue1,paramValue2

//获取所有应用初始化参数名称
 Enumeration names = context.getInitParameterNames();

  while (names.hasMoreElements()) {

 System.out.println(names.nextElement());

 }

6.使用ServletContext获取资源路径
1)获取真实路径
使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。

  • 获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt

2)获取资源流
可以通过ServletContext获取资源流,即把资源以输入流的方式获取

  • eg:获取a.txt资源流:
    InputStream in = servletContext.getResourceAsStream(“/a.txt”);

3)获取当前路径下所有资源的路径
使用ServletContext获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径

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

推荐阅读更多精彩内容

  • 本文包括: Servlet简介关于Servlet的一些类 Servlet生命周期 ServletConfig获得初...
    廖少少阅读 3,875评论 1 67
  • Servlet学习的大纲 servlet概念及相关接口简介 servet 执行过程 servlet映射路径 缺省s...
    奋斗的老王阅读 1,203评论 1 51
  • 前言 这篇文章的出发点是为了整理Servlet相关知识点,以免在相关概念混淆或分不清的时候到处查阅资料。 一、什么...
    maxwellyue阅读 3,470评论 2 35
  • 本文内容什么是Servlet与Servlet是如何执行的了解Servlet实现关系手动和自动开发Servlet s...
    Vincilovfang阅读 595评论 1 1
  • Part 1 @Description:Report of Servlet Basic, Part 1 @Date...
    susu2016阅读 649评论 0 3