• Servlet


    Servlet

    简介

    1.Java Servlet是和平台无关的的服务器组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
    2.Servlet可完成如下功能:
    -创建并返回基于客户请求的动态HTML页面。
    -创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
    -(主要功能)与其他服务器资源(如数据库或基于Java的应用程序)进行通信。

    API

    1.Servlet的框架由两个Java包组成:
    -java.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
    -javax.servlet.http,定义了采用Http协议通信的HttpServlet类。
    2.Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一个接口。在Servlet接口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:
    -init方法:负责初始化Servlet对象;
    -service方法:负责相应客户的请求;
    -destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。
    3.ServletRequest接口:封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等;该接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream;ServletRequest的子类可以为Servlet提供更多和特定协议相关的数据,例如:HttpServlrtRequest提供了读取Http Head信息的方法。

    4.ServletResponse接口:为Servlet提供了返回响应结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutpuStream;ServletResponse子类可以为Servlet提供更多和特定协议相关的数据,例如:HttpServlrtRequest提供了读取Http Head信息的方法。

    实现机制

    1.每一个Servlet都必须实现Servlet接口GenericServlet是个通用的、不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要继承HttpServlet父类即可。
    2.Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现,实现方式就是将ServletRequest与ServletResponse转换为HttpServletRequest与HttpServletResponse。

    3.转换完毕后,会调用HttpServlet类中自己定义的service方法:

    4.在该service方法中,首先得到请求的方法名,然后根据方法名调用对应的doXXX方法,比如说请求方法为GET,那么就去调用doGet方法;请求方法为POST,那么就调用doPost方法.

    5.在HttpServlet类中所提供的的doGet,doPost等方法都是直接返回错误信息,所以我们需要在自己定义的Servlet类中override这些方法。

    生命周期

    1.三个阶段:初始化阶段(init方法),相应客户请求阶段(service),终止阶段(destroy方法)。



    某些Servlet在web.xml文件中只有元素而没有< servlet-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在< servet>元素中配置一个< load-on-startup>子元素,让容器在服务器启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。

    定义自己的HttpServlet类的步骤


    ServletContext和web应用关系

    Servlet的多线程同步问题(重要)


    Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即反映到客户端的数据不一样。
    解决方案:
    1.Servlet实现javax.servlet.SingleThreadModel(Servlet2.4中已经废弃该接口),此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service方法。
    2.去除成员变量,使用局部变量。(最好的方式)
    3.使用同步代码块:synchronized{...}

    Cookie的英文原意是点心,它是用户访问Web服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给客户的点心,服务器可以根据Cookie来跟踪用户,这对于需要区别用户的场合(如电子商务)特别有用;一个Cookie包含一对Key/Value,可用代码生成一个Cookie并将它写到用户的硬盘上:Cookie theCookie = new Cookie(“cookieName”,“cookieValue”);response.addCookie(theCookie)

    Servlet和JSP比较

    1.都可以生成动态网页
    2.JSP的有点是擅长于网页制作,生成动态页面,比较直观,但不易跟踪和排错。
    3.Servlet是纯Java语言,擅长处理流程和业务逻辑,但生成动态网页不直观。

  • 相关阅读:
    NLP(七):textCNN
    pandas(一):选取部分(行、列)写入到另一个文件
    (二) PCA的数学原理
    NLP(六):BiLSTM_Attention实现
    python(三):collection模块
    tensorflow(二十五):Tensorboard可视化
    推荐系统(二):基于pytorch的textdeepfm
    引用相关
    带缺省参数的重复声明
    运算符优先级
  • 原文地址:https://www.cnblogs.com/huangzefeng/p/9260950.html
Copyright © 2020-2023  润新知