• Servlet总结


    目录

    Tomcat:

    Tomcat的作用

    Tomcat配置环境变量

    Tomcat的目录

    Tomcat配置文件(conf目录下)

    context.xml文件:

    web.xml文件:

    server.xml文件:

    tomcat-users.xml文件:

    启动Tomcat控制台乱码问题

    修改Tomcat监听端口

    Tomcat工作原理

    Tomcat的组成

    组件:

    Server组件

    Service组件

    Connector组件

    Engine组件

    Host组件

    Context组件

    Servlet:

    部署运行Servlet编写顺序

    Tomcat处理请求大致过程

    Servlet继承结构

    Servlet生命周期

    Servlet处理请求的原理

    Servlet的作用

    web.xml文件

    Servlet常用类(HttpServletRequest、HttpServletResponse、ServletContext、ServletConfig)

    Cookie和HttpSession

    基于注解@WebServlet开发Servlet

    filter过滤器

    Filter对象的创建

    例子:

    设置编码:

    FilterConfig对象:

    FilterChain(过滤器链)

    Filter过滤器链的执行顺序

    基于注解@WebFilter开发filter过滤器

    Listener监听器

    ServletContext对象监听器:

    生命周期监听器:

    属性监听器:

    HttpSession对象监听器:

    生命周期监听器:

    属性监听器:

    ServletRequest对象监听器:

    生命周期监听器:

    属性监听器:


    声明部分图片来自百战程序员

    Tomcat:

    Tomcat的作用

    Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范(如Servlet,Jsp,JNDI),属于轻量级应用服务器。

    Tomcat配置环境变量

    Tomcat是用Java语言开发的Web容器,所以在使用Tomcat时需要在操作系统中正确配置环境变量。

    JAVA_HOME:C:\ProgramFiles\Java\jdk1.8.0_171

    PATH:%JAVA_HOME%\bin;

    CLASS_PATH:%JAVA_HOME%\lib;

    我的是jdk8的版本,你用你的jdk版本的目录

    Tomcat的目录

    bin目录:主要是用来存放命令文件的,开启和关闭Tomcat的文件在bin目录中

    conf目录:主要是用来存放配置文件的

    lib目录:目录用来存放Tomcat运行需要加载的jar包

    logs目录:用来存放tomcat运行过程中产生的日志文件

    temp目录:用来存放tomcat在运行过程中产生的临时文件

    work目录:用来存放tomcat在运行时的编译后文件

    webapp目录:用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序,可以以文件夹,war包的形式发布应用

    Tomcat配置文件(conf目录下)

    context.xml文件:

    context.xml 是 Tomcat 公用的环境配置。 Tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。

    web.xml文件:

    Web应用程序描述文件,都是关于web应用程序的配置文件,所有Web应用的web.xml文件的父文件     

    server.xml文件:

    是 tomcat 服务器的核心配置文件,server.xml的每一个元素都对应了 tomcat中的一个组件,通过对xml中元素的配置,实现对 tomcat中的各个组件和端口的配置。

    tomcat-users.xml文件:

    配置访问Tomcat的用户以及角色的配置文件。

    启动Tomcat控制台乱码问题

    因为Tomcat在启动后会输出日志,而日志中使用的是UTF-8编码,

    而我们中文的Windows操作系统使用的是GBK编码。

    由于编码格式不统一,所以出现了乱码的问题

    如何解决这种问题:

    在conf文件夹下,有一个logging.properties文件,通过这个文件更改Tomcat日志使用的编码,将原本的utf-8更改为GBK

    修改Tomcat监听端口

    Tomcat的默认监听端口为8080,可以通过conf文件夹下的server.xml文件更改Tomcat监听端口

    Tomcat工作原理

    Tomcat是一个能够处理请求并产生响应的应用程序,Tomcat实现了JavaEE平台下的一些规范,所以我们可以在Tomcat中运行我们所编写的Servlet、JSP

    Tomcat的组成

    Tomcat是由很多的组件构成的

    组件:

    Server组件

    启动一个server实例(即一个JVM进程),它监听在8005端口以接收shutdown命令,一旦收到就会关闭Tomcat。Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。

    port:

    接收shutdown指令的端口,默认为8005;

    shutdown:

    发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;

    Service组件

    Service主要用于关联一个引擎(engine)和与此引擎相关的连接器(Connector),每个连接器通过一个特定的端口和协议接收请求并将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。

    Connector组件

    支持处理不同请求的组件,一个引擎可以有一个或多个连接器,以适应多种请求方式。默认只开启了处理Http协议的连接器。如果需要使用其他协议,需要在Tomcat中配置该协议的连接器。

    在Tomcat中连接器类型通常有4种:

    1. HTTP连接器
    2. SSL连接器
    3. AJP 1.3连接器
    4. proxy连接器

    port:监听的端口,Connector通过这个端口接收请求

    protocol:连接器使用的协议,默认为HTTP/1.1;

    connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒;

    redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;

    maxThreads:支持的最大并发连接数,默认为200个;

    Engine组件

    Engine是Servlet处理器的一个实例,即servlet引擎,定义在server.xml中的Service标签中。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的Host组件。

    Host组件

    Host组件(虚拟主机)

    虚拟主机(英语:virtual hosting)或称共享主机(shared web hosting),又称虚拟服务器,是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。

    Host组件位于Engine容器中用于接收请求并进行相应处理的虚拟主机。通过该容器可以运行Servlet或者JSP来处理请求。

    name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

    name:

    虚拟主机的名称,Tomcat通过在请求URL中的域名与name中的值匹配,用于查找能够处理该请求的虚拟主机。如果未找到则交给在Engine中defaultHost指定的主机处理;

    appBase:

    此Host的webapps目录,即指定存放web应用程序的目录的路径;

    autoDeploy:

    在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;

    默认为true;

    unpackWARs:

    在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

    Context组件

    Context是Host的子组件,代表指定一个Web应用,它运行在某个指定的虚拟主机(Host)上;每个Web应用都是一个WAR文件,或文件的目录。如果是在host的appBase中指定的目录,那么就不需要配置Context组件,Context组件是当Servlet不在appBase指定的目录中而配置的。

    path="/test" docBase="D:\bjsxt\itbaizhan.war"/>

    path:

    context path既浏览器访问项目的访问路径。

    docBase:

    相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;

    Servlet:

    Servlet简介

    Servlet是Server Applet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。 Web 容器或应用服务器实现了Servlet标准所以Servlet需要运行在Web容器或应用服务器中。Servlet主要功能在于由服务器执行处理请求并生成数据响应。

    Servlet技术特点

    单进程多线程

    部署运行Servlet编写顺序

    1、创建一个Servlet类,继承HttpServlet类,因为HttpServlet类不是javase的内容,所以编译servlet类需要提供-classpath httpServlet路径        

    2、创建web.xml配置文件,配置两点:

            第一点:servlet的全名

            第二点:servlet与url的映射

    3、将servlet部署到web中

    5、执行 

    Tomcat处理请求大致过程

    1、用户访问localhost:8888/test/helloword.do,请求被发送到本机的8888端口,被监听的8888端口并处理http1.1 协议的Connector连接器获得

    2、连接器获取到请求,如果这个域名通过hosts文件发现我们的域名有映射IP,那么就直接向这个IP的8888端口发送数据包(假设我们给的是8888端口)

    3、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应

    4、Engine获得请求localhost/test/helloword.do,匹配所有虚拟主机host的name

    5、Engine匹配到名为localhost的Host虚拟主机,随即叫该Host虚拟主机来处理这个请求

    6、匹配到的Context获得请求/helloword.do。

    7、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloWorld的doGet()或doPost().执行业务逻辑、数据存储等程序。

    8、Context执行完之后结果通过HttpServletResponse对象返回给Host

    9、Host把HttpServletResponse返回给Engine

    10、Engine把HttpServletResponse对象返回给Connector

    11、Connector将HttpServletResponse对象返回给客户端

    Servlet继承结构

    Servlet接口

    1. init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
    2. service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。
    3. destroy(),在销毁Servlet对象之前调用该方法,释放资源。
    4. getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
    5. getServletInfo(),获取servlet相关信息。

    ServletConfig接口

    1. String getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
    2. ServletContext getServletContext(),返回一个代表当前 Web 应用的 ServletContext 对象。
    3. String getInitParameter(String name),根据初始化参数名返回对应的初始化参数值。
    4. Enumeration getInitParameterNames(),返回一个 Enumeration 对象,其中包含了所有的初始化参数名。 

    GenericServlet抽象类

    GenericServlet是实现了Servlet接口的抽象类。在GenericServlet中进一步的定义了Servlet接口的具体实现,其设计的目的是为了和应用层协议解耦,在GenericServlet中包含一个Service抽象方法。

    HttpServlet类

    继承自 GenericServlet,针对于处理 HTTP 协议的请求所定制。在 HttpServlet的service() 方法中已经把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转。实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可。

    Servlet生命周期

    Servlet的生命周期是由容器管理的,分别经历三各阶段:

    init():初始化

    service():服务

    destroy():销毁

    当客户端浏览器第一次请求Servlet时,容器会实例化这个Servlet

    然后调用一次init()方法,并在新的线程调用service()方法处理请求并相应

    service()方法执行完毕后容器不会销毁这个Servlet,而是对这个Servlet进行缓存处理,当客户端浏览器再次请求这个Servlet时,容器会先从缓存中找到Servlet对象并再一次在新的线程调用service()方法

    当容器在销毁Servlet之前调用一次destroy()方法

    Servlet处理请求的原理

    当浏览器基于get的方式请求Servlet时,Servlet的doGet方法会被执行,doGet方法能被执行并处理请求的原因是:

    1、容器在启动时会解析web工程中WEB-INF目录中的web.xml文件,在改文件中我们配置了Servlet与URL的绑定

    2、容器通过对请求的解析可以获取请求资源的URL,然后找到与该URL绑定的Servlet并做实例化处理(注意:Servlet只会被实例化,实例化之后将会被缓存,如果在缓存中能够找到这个Servlet就不会再做次实例化处理)               

    3、在实例化时是以Servlet接口作为引用类型,并调动一次init()方法,由于GenericServlet抽象类中重写了init()方法,所以调用了是该抽象类的init()方法(GenericServlet抽象类中的init方法是一个空方法)

    4、然后在新的线程调用service()方法,在HttpServlet中重写了service()方法,所以调用的是HttpServlet中的service()方法

    5、在service()中通过request.getMethod()方法获取到请求方式进行判断

    6、如果是Get方式请求就执行doGet方法,如果是POST请求就执行doPost方法。如果是基于GET方式提交的,并且在我们的Servlet中又重写了HttpServlet中的doGet方法,那么最终会根据Java的多态特性转而执行我们自定义的Servlet中的doGet方法。

    Servlet的作用

    • 获取用户提交的数据
    • 获取浏览器附加的信息
    • 处理数据(访问数据库或调用接口)
    • 给浏览器产生一个响应
    • 在响应中添加附加信息

    web.xml文件

    Tomcat在启动时会解析web工程中WEB-INF目录中的web.xml文件,在该文件中我们配置了Servlet与URI的绑定 

            

    Servlet常用类(HttpServletRequest、HttpServletResponse、ServletContext、ServletConfig)

    Servlet常用类https://blog.csdn.net/cccccccmmm/article/details/126737659

    Cookie和HttpSession

    Cookie对象和HttpSession对象https://blog.csdn.net/cccccccmmm/article/details/126755447

    基于注解@WebServlet开发Servlet

    学到这里大家有没有发现,servlet写的越多,web.xml就越来越臃肿,程序的可读性很差,所以Idea通过注解的方式解决url与Servlet的映射

    在Servlet3.0以及之后的版本中支持注解式开发Servlet。对于Servlet的配置不再依赖于web.xml配置文件,而是使用@WebServlet注解完成Servlet的配置。

    @WebServlet

    属性名

    类型

    作用

    initParams

    WebInitParam[]

    Servlet的init参数

    name

    String

    Servlet的名称

    urlPatterns

    String[]

    Servlet的访问URL,支持多个

    value

    String[]

    Servlet的访问URL,支持多个

    loadOnStartup

    int

    自启动Servlet

    description

    String

    Servlet的描述

    displayName

    String

    Servlet的显示名称

    asyncSupported

    boolean

    声明Servlet是否支持异步操作模式

    例子:

    @WebServlet(urlPatterns="/initParam.do",

    initParams={@WebInitParam(name="key1",value="一拳超人"),

    @WebInitParam(name="key2",value="蜘蛛侠")},loadOnStartup=1)

    filter过滤器

    Filter过滤器是Servlet2.3中所提供的一个过滤请求与响应的对象

    Filter过滤器既可以对客户端向服务器端发送的请求进行过滤,也可以对服务器端向客户端产生的响应进行过滤处理

    Filter对象的创建

    创建一个Class实现Filter接口并实现接口中三个抽象方法

    init()方法:初始化方法,在创建Filter后立即调用。可用于完成初始化动作。

    doFilter()方法:拦截请求与响应方法,可用于对请求和响应实现预处理。

    destroy()方法:销毁方法,在销毁Filter之前自动调用。可用于完成资源释放等动作

    当Tomcat启动过后Filter对象就会被创建初始化

    例子:

    实现Filter接口并实现接口下的抽象方法,doFilter()方法相当于service()方法,但是doFilter方法多了一个FilterChain对象,该对象是用来给请求放行的,通过FilterChain对象下的doFilter(ServletRequest,ServletResponse)方法对请求放行,请求放行过后以下的代码就是对响应的过滤,该方法执行完响应放行

    设置编码:

    请求编码肯定是得在请求过滤之前设置,那么响应编码可以在响应过滤的时候设置吗?

    答案是不行的,因为处理请求和响应都是放行过后在servlet中的service方法进行处理的,如果在处理过滤的时候设置响应编码,此时已经响应完了,你怎么设置响应编码都没用了

    但是:

    这里不建议在过滤器中设置响应编码,因为响应的结果是根据业务进行决定的。

    FilterConfig对象:

    FilterConfig对象的使用

    FilterConfig对象是用来读取中初始化参数的对象。该对象通过参数传递到init方法中,用于读取初始化参数。

    filterConfig.getInitParameter("name")

    通过name获取对应的value。

    filterConfig.getInitParameterNames()

    返回该Filter中所有中的值。

    获取filter标签中init-param标签中的值

    FilterChain(过滤器链)

    Filter技术的特点是在对请求或响应做预处理时,可实现“插拔式”的程序设计。我们可以根据自己需求添加多个Filter,也可以根据需求去掉某个Filter,通过修改web.xml文件即可实现。那么如果有多个过滤器对某个请求及响应进行过滤,那么这组过滤器就称为滤器链

    Filter过滤器链的执行顺序

    则按照在web.xml文件中配置的上下顺序来决定先后在上的先执行,在下的后执行

    基于注解@WebFilter开发filter过滤器

    Filter支持注解式开发,通过@WebFilter注解替代web.xml中Filter的配置。

    属性名

    类型

    作用

    filterName

    String

    指定过滤器的 name 属性

    urlPatterns

    String[]

    拦截请求的URL,支持多个

    value

    String[]

    拦截请求的URL,支持多个

    description

    String

    过滤器的描述

    displayName

    String

    过滤器的显示名称

    initParams

    WebInitParam[]

    指定一组过滤器初始化参数,等价于 标签。

    使用注解式开发Filter时,执行顺序会根据Filter的类名称进行排序(按字典顺序排序)排序的结果决定调用的顺序。

    Listener监听器

    监听器用于监听web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器会自动调用监听器对象中的方法。

    监听器分类

    按监听的对象划分,可以分为:

    • ServletContext对象生命周期监听器与属性操作监听器;
    • HttpSession对象生命周期监听器与属性操作监听器;
    • ServletRequest对象生命周期监听器与属性操作监听器;

    ServletContext对象监听器:

    生命周期监听器:

    ServletContext对象的生命周期监听器

    通过实现ServletContextListener接口实现ServletContext对象生命周期的监听行为。通过实现ServletContextListener接口成为该对象的监听

    void contextInitialized(ServletContextEvent sce)

    ServletContext对象创建之后会触发该监听方法,并将ServletContext对象传递到该方法中。

    void contextDestroyed(ServletContextEvent sce)

    ServletContext对象在销毁之前会触发该监听方法,并将ServletContext对象传递到该方法中。

    环境配置:

    在web.xml文件中添加listener标签,标签中添加监听器的类(一个监听器配置一个listener标签)

    属性监听器:

    通过实现ServletContextAttributeListener接口实现对于ServletContext对象属性操作的监听行为。

    void attributeAdded(ServletContextAttributeEvent scae)

    ServletContext对象中添加属性时会触发该监听方法,并将ServletContext对象传递到该方法中。触发事件的方法servletContext.setAttribute("key","value")。

     

    void attributeRemoved(ServletContextAttributeEvent scae)

    当从ServletContext对象中删除属性时会触发该监听方法,并将ServletContext对象传递到该方法中。触发事件方法servletContext.removeAttribute("key")。

    void attributeReplaced(ServletContextAttributeEvent scae)

    当从ServletContext对象中属性的值发生替换时会触发该监听方法,并将ServletContext对象传递到该方法中。触发事件的方法servletContext.setAttribute("key","value")。

     

    例子:

     

    在web.xml文件中添加listener标签,标签中添加监听器的类(一个监听器配置一个listener标签)

    HttpSession对象监听器:

    生命周期监听器:

    通过实现HttpSessionListener接口实现HttpSession对象生命周期的监听行为。

    void sessionCreated(HttpSessionEvent se)

    HttpSession对象创建后会触发该监听方法,并将已创建HttpSession对象传递到该方法中。

    void sessionDestroyed(HttpSessionEvent se)

    HttpSession对象在销毁之前会触发该监听方法,并将要销毁的HttpSession对象传递到该方法中。

    属性监听器:

    通过实现HttpSessionAttributeListener接口实现对于HttpSession对象属性操作的监听行为。

    void attributeAdded(HttpSessionBindingEvent se)

    向HttpSession对象中添加属性时会触发该监听方法,并将HttpSession对象传递到该方法中。触发事件的方法HttpSession.setAttribute("key","value")。

    void attributeRemoved(HttpSessionBindingEvent se)

    当从HttpSession对象中删除属性时会触发该监听方法,并将HttpSession对象传递到该方法中。触发事件方法HttpSession.removeAttribute("key")。

    void attributeReplaced(HttpSessionBindingEvent se)

    当从HttpSession对象中属性的值发生替换时会触发该监听方法,并将HttpSession对象传递到该方法中。触发事件的方法HttpSession.setAttribute("key","value")。

    ServletRequest对象监听器:

    生命周期监听器:

    通过实现ServletRequestListener接口实现ServletRequest(是HttpServletRequest接口的父接口类型)对象生命周期的监听行为。(为了解耦合所以以父类接口类型作为引用类型)

    void requestInitialized(ServletRequestEvent sre)

    HttpServletRequest对象创建后会触发该监听方法,并将已创建HttpServletRequest对象传递到该方法中。

    void requestDestroyed(ServletRequestEvent sre)

    HttpServletRequest对象在销毁之前会触发该监听方法,并将要销毁HttpServletRequest对象传递到该方法中。

    属性监听器:

    通过实现ServletRequestAttributeListener接口实现对于HttpServletRequest对象属性操作的监听行为。

    void attributeAdded(ServletRequestAttributeEvent srae)

    向HttpServletRequest对象中添加属性时会触发该监听方法,并将HttpServletRequest对象传递到该方法中。触发事件的方法HttpServletRequest.setAttribute("key","value")。

    void attributeRemoved(ServletRequestAttributeEvent srae)

    当从HttpServletRequest对象中删除属性时会触发该监听方法,并将HttpServletRequest对象传递到该方法中。触发事件方法HttpServletRequest.removeAttribute("key")。

    void attributeReplaced(ServletRequestAttributeEvent srae)

    当从HttpServletRequest对象中属性的值发生替换时会触发该监听方法,并将HttpServletRequest对象传递到该方法中。

    触发事件的方法HttpServletRequest.setAttribute("key","value")。

  • 相关阅读:
    你写过的最蠢的代码是?
    性能学习笔记--k8s下mysql的连接数分析和调优
    【敏捷那些事儿 06期】选敏捷还是瀑布?
    SQL 数据更新
    分布式ID详解(5种分布式ID生成方案)
    软考高级系统架构设计师系列论文二十八:论需求分析方法及应用
    C#中关于 object,dynamic 一点使用心得
    华为云 云耀云服务器L实例评测|使用宝塔一键部署自己专属网站
    使用前端技术实现静态图片局部流动效果 🌊
    ffmpeg基础三:H264,从MP4文件获取(av_bsf_get_by_name(“h264_mp4toannexb“))和从TS流获取保存H264
  • 原文地址:https://blog.csdn.net/cccccccmmm/article/details/126775567