前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet学习知识总结

Servlet学习知识总结

作者头像
Java帮帮
发布2018-03-19 14:59:46
4690
发布2018-03-19 14:59:46
举报

什么是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)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档