首页 > 其他分享 >ServletContext接口规约

ServletContext接口规约

时间:2022-09-30 11:45:57浏览次数:71  
标签:4.4 String 规约 Servlet 接口 添加 ServletContext servlet

Servlet4.0的ServletContext对象

4.1 ServletContext接口简介

ServletContext是定义Servlet运行的WebApplication的视图。ServletContainer

有义务提供ServletContext实现类。Servlet可以使用ServletContext对象记录日志,读取URI,存储属性,该属性可以处于其他ServletContext的Servlet对象读取。

一个ServletContexts 是WebServer的已知的根path。如一个ServletContext是被引导至http://localhost/catlog,则所有以/catlog开头的请求都将路由至该ServletContext。

4.2 ServletContext的作用域

在一个WebApplication中,至存在一个ServletContext对象。这种情况,WebApplication可以分布式部署,则意味着一个WebApplication的一个JVM虚拟机只拥有一个ServletContext。

4.3 初始化参数

在ServletContext的下面方法中Servlet可以获取到部署时传递给应用程序的初始化参数。

  • getInitParameter()
  • getInitParameterNames()

初始化参数包括研发传递给应用程序的邮件地址,系统名称等等。

4.4 配置方法

从Servlet3.0开始加入了以下方法支持编程式定义Servlet、Filter、以及URL。

这些方法只能在初始化应用的时候调用,如在ServletContextListener的contextinitalezed()方法中调用,或者是在ServletContainerInitializer的实现类的onStartup的方法。除了可以添加Servlet和Filter,还可以寻找Registration实例。

4.4.1 编程式添加Servlet

编程式添加Servlet对框架开发者是很有用的。框架开发者可以使用这个方法声明控制器Servlet。该方法返回值是ServletRegistration或者是ServletRegistration.Dynamic允许你可以自定义Servlet的初始化参数和URL映射。

下面是这个方法的重载版本。

4.4.1.1 addServlet(String servletName, String className)

这个方法声明Servlet,并且给定名称和类名称添加到ServletContext中。

4.4.1.2 addServlet(String servletName, Servlet servlet)

这个方法声明Servlet,并且给定名称和Servlet实例添加到ServletContext中。

4.4.1.2 addServlet(String servletName, Class <? extends Servlet> servletClass)

这个方法声明Servlet,并且给定名称和Servlet类实例添加到ServletContext中。

4.4.1.4 addJspFile(String servletName, String jspfile)

这个方法声明Servlet,并且给定名称和jspfile实例化Serlet对象添加到ServletContext中。

4.4.1.5 <T extends Servlet> T createServlet(Class<T> clazz)

该方法创建Servlet实例,这种方法需要支持除了@WebServlet以外的所有注解。

方法返回Servlet实例,该实例可以自定义配置,再调用ServletContext.add(String,Servlet)方法添加到ServletContext中。

4.4.1.6 ServletRegistration getServletRegistration(String servletName)

这个方法返回ServletRegistration实例,如果没有则返回Null。

4.4.1.7 Map<String, ? extends ServletRegistration> getServletRegistrations()

这个方法键值对的map对象,值类型是ServletRegistration实例,如果没有则返回Null。

4.4.2 编程式添加Filter

4.4.2.1 addFilter(String filterName, String className)

这个方法声明filter,并以指定的名称添加到ServletContext中。

4.4.2.2 addFilter(String filterName, Filter filter)

这个方法声明filter,并以指定的名称和Filter实例添加到ServletContext中。

4.4.2.3 addFilter(String filterName, Class <? extends Filter> filterClass)

这种方法声明filter,并以指定的名称和Filter类实例添加到ServletContext中。

4.4.2.4 <T extends Filter> T createFilter(Class<T> clazz)

创建一个Filter对象,这个方法支持所有的注解。该方法返回的Filter对象,可以再次自定义,并且调用ServetletContext.addFilter(String,Filter)添加到ServletContext中。

4.4.2.5 FilterRegistration getFilterRegistration(String filterName)

这个方法返回对应filter名称的FilterRegistration,可能返回NULL如果该名称下没有FilterRegistration。

4.4.2.6 Map<String, ? extends FilterRegistration> getFilterRegistrations()

这个方法返回filter名称为key的map.

4.4.3 编程式添加和配置监听者

4.4.3.1 void addListener(String className)

使用指定类名添加监听者到ServletContext。该类会被应用程序的加载器加载。该类至少需要实现以下一个接口:

  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionIdListener
4.4.3.2 <T extends EventListener> void addListener(T t)

添加监听者到ServletContext,监听者需要是以任意接口的实例:

  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionIdListener
4.4.3.3 void addListener(Class <? extends EventListener> listenerClass)

添加监听者到ServletContext,这个类需要是继承以下任意的接口:

  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionIdListener
4.4.3.4 <T extends EventListener> void createListener(Class<T> clazz)

使用指定的EventListener类创建监听者,EventListener类需要继承以下任意一个接口:

  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionIdListener
4.4.3.5 以编程方式添加Servlet、Filter和Listener的注解要求

以编程的方式添加或者创建Servlet,除了添加Servlet实例的情况之外,都需要在类上声明下面的注解:@ServletSecurity, @RunAs, @DeclareRoles, @MultipartConfig。

Filter和Listeners不需要注解。

除了添加实例以外,以编程的方式添加Servlet、Filter、Listener,这些组件的资源注入的前提是组件是CDI Managed Bean。

4.4.4 编程方式配置超时时间

ServletContext接口支持以编程的方式设置Servlet的执行超时时间,单位为分钟,设置0或者小于0的数字,意味着Servlet不超时。

  • getSessionTimeout()
  • setSessionTimeout(int timeout)

4.4.5 以编程的方式配置字符集编码

下述方法ServletContext允许WebApplication设置和自定义request和response的编码字符集。

  • getRequestCharacterEncoding()
  • setRequestCharacterEncoding(String encoding)
  • getResponseCharacterEncoding()
  • setResponseCharacterEncoding(String encoding)

若部署时没有指定request字符集,或者是容器配置也没有指定字符集,则getRequestCharacterEncoding()返回NULL。

若部署时没有指定response字符集,或者是容器配置也没有指定字符集,则getResponseCharacterEncoding()返回NULL。

4.5 上下文的属性

Servlet可以绑定一个包含属性的对象到ServletContext中,这样,同一个WebApplication不同ServletContext的上下文就可以访问该属性了。ServletContext提供如下的方法访问属性:

  • setAttribute
  • getAttribute
  • getAttributeNames
  • removeAttribute

4.5.1 分布式容器中的上下文属性

上下文属性是虚拟机创建的本地属性,分布式部署的WebApplication容器,若希望其他容器访问上下文属性,则需要将上下文存储到Sesion中、数据库中、企业Bean 组件中。

4.6 资源

ServletContext接口只支持访问WebApplication的静态资源,包括HTML、GIF和JPEG文件,如下访问可以访问:

  • getResource
  • getResourceAsStream

将带有/前导符的字符串作为参数,该参数可以是相对于上下文根目录的路径,或者是相对于JAR包内WEB-INF/lib目录下的/META-Inf/Resource的目录。

4.7 多主机和上下文

WebServer支持多个本地主机通信一个机器的IP。这种本地主机叫做虚拟主机。

虚拟主机的Servlet上下文是互相隔离的。

getVirtualServerName()方法会返回虚拟主机的Servlet名称。每个虚拟主机的Servlet名称都是独一无二的。

4.8 重新加载的注意事项

Container 提供者没有提供重新加载的机制,但是要实现重加载,则必须要确保Servlet等相关类需要在同一个加载器里加载。

标签:4.4,String,规约,Servlet,接口,添加,ServletContext,servlet
From: https://www.cnblogs.com/code-for-me/p/16744407.html

相关文章

  • Vue3 从入门到入土(TypeScript接口)
    前言在上一章,我们就写过简单的接口,本章更深入的了解接口接口是对象的状态(属性)和行为(方法)的抽象(描述)接口以例子来了解,我们有这样的需求定义一个对象存放用......
  • 基于信迈AM5728_am5718开发板的LCD触摸屏接口
    1开发套件简介 基于TIAM5728浮点双DSPC66x+双ARMCortex-A15工业控制及高性能音视频处理器;多核异构CPU,集成双核Cortex-A15、双核C66x浮点DSP、双核PRU-ICSS......
  • EasyCVR通过调取接口开启音频,通道条数与实际不符的原因分析
    EasyCVR视频融合平台部署轻快、功能灵活,在视频能力上,可提供视频直播、录像、回放、检索、云存储、级联、告警等功能。平台可支持多协议、多类型设备接入,包括国标GB28181、R......
  • 借用python的flask库写一个mock实现一个自定义接口服务
    mock在接口测试中可以发挥很大的作用,其中之一便是实现自定义接口服务。python中可以使用flask库实现mock,写一个简单的登录接口,以及调用,直接上代码:第一部分:实现登录接口im......
  • 抽象类和接口
    1、抽象方法在介绍抽象类和抽象方法之前,需要先了解一下抽象方法,抽象类,接口的基本概念。抽象方法就是一个方法,其比普通方法多了一个关键字abstract修饰,少了方法体。抽象......
  • EasyCVR通过调取接口开启音频,通道条数与实际不符的原因分析【附完整通道接口字段表】
    EasyCVR视频融合平台部署轻快、功能灵活,在视频能力上,可提供视频直播、录像、回放、检索、云存储、级联、告警等功能。平台可支持多协议、多类型设备接入,包括国标GB28181、RT......
  • Java中抽象类和接口的介绍及二者间的区别
    转载自Java中抽象类和接口的介绍及二者间的区别 接口(Interface)和抽象类(AbstractClass)是支持抽象类定义的两种机制。一、抽象类在Java中被abstract关键字修......
  • 超赞~免费生成国庆风格微信头像API接口
    码动国庆,头像合成头像合成接口,通过设置参数值生成不同风格的头像效果预览: 像素风格 自定义风格   接口地址:https://console-docs.apipost.cn/preview/82d......
  • Springboot自定义工具类中调用mapper或者service接口方式
    1、该类使用@Component注解2、添加一个本类类型的静态字段3、创建一个初始化方法,贴上@PostConstruct标签,用于注入bean4、创建方法调用mapper或service接口5、最后直接......
  • 接口和抽象类
    抽象类抽象方法当多个类中具有共性方法时,我们就会向上抽取形成父类,并在父类中定义这个共性方法。而有时,父类中的方法并不能明确每个子类的具体实现,那么这种方法就称......