Servlet学习知识总结

什么是Servlet

Servlet是一个功能,如果你希望你的项目功能多一些,那就要多写一此Servlet;

Servlet是JavaWeb三大组件之一,也是最重要的组件!

Ø 三大组件:Servlet、Filter、Listener

Servlet是一个我们自定义的Java类,它必须要实现javax.servlet.Servlet接口。

Servlet是动态资源!

Servlet必须在web.xml中进行配置后,才能被访问。(把Servlet与一个或多个路径绑定在一起)

2如何实现Servlet

实现Servlet有三种方式:

Ø 实现Servlet接口;

Ø 继承GenericServlet类;

Ø 继承HttpServlet类(最佳选择)。

3Servlet的生命周期

3.1 生命周期相关方法

Servlet接口中一共是5个方法,其中有三个是生命周期方法。

Ø void init(ServletConfig):这个方法会在Servlet被创建后,马上被调用。只会被调用一次!我们可以把一些初始化工作放到这个方法中,如果没有什么初始化工作要做,那么这个方法就空着就可以了。

Servlet有两个时间点会被创建:一是在第一次被请求时,会被创建;二是Tomcat启动时被创建,默认是第一种,如果希望在tomcat启动时创建,这需要在web.xml中配置。

Ø void destroy():这个方法会在Servlet被销毁之前被调用。如果你有一些需要释放的资源,可以在这个方法中完成,如果没有那么就让这个方法空着。这个方法也只会被调用一次!

Servlet轻易不会被销毁,通常会在Tomcat关闭时会被销毁。

Ø void service(ServletRequest,ServletResponse):它会在每次被请求时调用!这个方法会被调用0~N次。

Ø String getServletInfo():它不是生命周期方法,也就是说它不会被tomcat调用。它可以由我们自己来调用,但我们一般也不调用它!你可以返回一个对当前Servlet的说明性字符串。

Ø ServletConfig getServletConfig():这个方法返回的是ServletConfig,这个类型与init()方法的参数类型相同。它对应的是web.xml中的配置信息,即<servlet>

3.2 ServletConfig、ServletContext、ServletRequest、ServletResponse

ServletRequest:封装了请求信息;

ServletResposne:用于向客户端响应;

ServletContext:它可以在多个Servlet中共享数据。

ServletConfig:它与<servlet>对应!

Ø 在<servlet>中可以配置<init-param>,即初始化参数,可以使用ServletConfig的getInitParameter(String),方法的参数是初始化参数名,方法的返回值是初始化参数值。

Ø getInitParameterNames(),该方法返回一个Enumeration对象,即返回所有初始化参数的名称。

Ø String getServletName(),它返回的是<servlet-name>元素的值

Ø ServletContext getServletContext(),它可以获取Servlet上下文对象。

4GenericServlet

它代理了ServletConfig的所有功能。所有使用ServletConfig才能调用的方法,都可以使用GenericServlet的同名方法来完成!

不能覆盖父类的init(ServltConfig)方法,因为在父类中该方法内完成了this.config=config,其他的所有ServletConfig的代理方法都使用this.config来完成的。一旦覆盖,那么this.config就是null。

如果我们需要做初始化工作,那么可以去覆盖GenericServlet提供的init()方法。

5HttpServlet

它提供了与http协议相关的一些功能。

只需要去覆盖doGet()或doPost()即可。这两个方法,如果没有覆盖,默认是响应405!

6Servlet细节

6.1 Servlet单例、线程不案例

Servlet是的单例的。所以一个Servlet对象可能同时处理多个请求;

Servlet不是线程安全的。

Ø 尽可能不创建成员变量,因为成员变量多个线程会共享!

Ø 如果非要创建,那么创建功能性的,只读!

6.2 Servlet的创建时间:第一次被请求、启动创建

* Servlet可以在第一次请求时被创建,还可以在容器启动时被创建。默认是第一次请求时!

* 在<servlet>添加一个<load-on-startup>大于等于0的整数</load-on-startup>

* 如果有多个Servlet在容器启动时创建,那么<load-on-startup>的值就有用了,创建的顺序使用它的值来排序!

6.3 <url-pattern>的配置

<url-pattern>中可以使用“*”表示所有字符,但它不匹配“/”。它的使用要求:

它要么在头,要么在尾。不能在中间;

如果不使用通配符,那么必须使用“/”开头。

如果一个访问路径,匹配了多个<url-pattern>,那么谁更加明确就匹配谁。

6.4 web.xml的继承

每个项目都有一个web.xml,但tomcat下也有一个web.xml,在${CATALINA_HOME}\conf\web.xml

conf\web.xml是所有项目的web.xml父文件,父文件中的内容等于同写在子文件中。

ServletContext

Servlet三大域对象:

ServletContext:范围最大,应用范围!

HttpSession :会话范围!

HttpServletRequest:请求范围!

域对象之一

域对象都有存取功能:

setAttribute(“attrName”, attrValue );//put

Object attrValue = getAttribute(“attrName”);//get

removeAttribute(“attrName”);//remove

1 ServletContext的作用

存取域属性,ServletContext是一个域对象;

可以用来获取应用初始化参数;

获取资源

2 ServletContext的生命周期

ServletContext在容器启动时就被创建了;

ServletContext在容器关闭时才会死!

一个项目只有一个ServletContext对象。

3 获取ServletContext

通过ServletConfig的getServletContext()方法来获取!

ServletConfig是init()方法的参数,那只能在init()方法中获取了;

GenericServlet代理了ServletConfig的所有方法,而且还提供了getServletConfig(),所以在GenericServlet的子类中可以使用如下方式来获取ServletContext对象:

this.getServletContext()

this.getServletConfig().getServletContext()

HttpSession也有这个方法,session.getServletContext()。

4 域对象:ServletContext

void setAttribute(String name, Object value):存储属性;

Object getAttribute(String name):获取属性;

void removeAttribute(String name):移除属性;

Enumeration getAttributeNames():获取所有属性名称;

5 获取初始化参数

一个 项目不只是可以配置servlet的初始化参数,还可以配置应用初始化参数

下面就是在web.xml中配置应用的初始化参数,这些参数需要使用ServletContext来获取

<context-param>

<param-name>p1</param-name>

<param-value>v1</param-value>

</context-param>

<context-param>

<param-name>p2</param-name>

<param-value>v2</param-value>

</context-param>

String getInitParameter(String name):通过参数名获取参数值;

Enumeration getInitParameterNames():获取所有参数的名称;

6 获取资源

获取真实路径:getRealPath(String path):路径必须以“/”开头!它相对当前项目所在路径的。

获取指定路径下的所有资源路径:Set set = sc.getResourcePaths(“/xxx”)

获取资源流:InputStream in = sc.getResourceAsStream(“/xxx”)

7 Class和ClassLoader获取资源

User.class如何变成Class<User>的呢,由ClassLoader完成的!把硬盘上的User.class加载到内存,变成Class对象。

使用它们获取资源流!它们相对类路径(classpath)

本文分享自微信公众号 - Java帮帮(javahelp)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何自动化测试 React Native 项目 (上篇) - 核心思想与E2E自动化

    React Native (RN) 是 Facebook 开源的跨平台应用开发框架,由于 RN 提供的高效直观的跨平台开发模式和不错的性能,我们在开发 Glow...

    Java帮帮
  • Oracle存储过程

    Oracle存储过程 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数...

    Java帮帮
  • 在Windows上用Java代码模仿破解WIFI密码【大牛经验】

    本文纯属技术探索,与真正的破解还有很大差距,请广大网友切勿利用本文内容做出任何危害网络安全的行为。若有违法行为,均与本人无关。

    Java帮帮
  • JavaWeb(四)Servlet-1

    leeqico
  • 你以为 Servlet 过时了?

      Servlet 的命名可以看出 sun 命名的特点,如 Applet 表示小应用程序;Scriptlet = Script + Applet,表示小脚本程序...

    Demo_Null
  • 走进JavaWeb技术世界4:Servlet 工作原理详解

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • 走进JavaWeb技术世界4:Servlet 工作原理详解

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • 关于Servlet的一些内容

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特...

    无言
  • Servlet学习补充

    黑泽君
  • 创建Servlet实例1 创建 Servlet 对象2 初始化 Servlet

    JavaEdge

扫码关注云+社区

领取腾讯云代金券