• Java Web学习笔记----详解ServletAPI


    昨天聊了一大堆乱七八糟的东西。今天给大家分享一下当初我学习JavaWeb的笔记吧。
    Servlet技术是JavaWeb中的核心技术,emmmmmmmm。。。。
    太枯燥了,还是先从API开始说吧,
    首先ServletAPI中有4个Java包:
    1、javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口
    2、javax.servlet.http:其中包含定义HTTPServlet和Servlet容器之间契约的类和接口
    3、javax.servlet.annotation: 其中包含Servlet、Filter、Listener的标注,它还为被标注元件定义元数据
    4、javax.servlet.descriptor :其中包含提供程序化登录web应用程序的配置信息的类型。
      二. Servlet技术概述
      Servlet技术的核心是Servlet接口,他是所有Servlet类必须直接或间接实现的一个接口,在编写实现Servlet的Servlet类的时候是直接实现它,在扩展实现这个接口的类的时候就是间接实现它。
      Servlet接口中定义了Servlet与Servlet容器之间的契约,这个契约归结起来就是:Servlet容器将Servlet类加载到内存,并在Servlet类的实例上调用具体的方法。在一个应用程序中每种Servlet类种只能有一个实例。
      用户请求致使Servlet容器调用了Servlet类种的service方法,并且传入一个ServletRequest实例和一个ServletResponse的实例,ServletRequest中封装了当前的HTTP请求,
    因此Servlet开发人员不必解析和操作原始的HTTP请求数据.ServletResponse表示=当前用户的HTTP响,使得将响应发回客户端变得十分容易.
      对于每一个应用程序,Servlet容器还会创建一个Servlet Context的实例,这个对象中封装了上下文的环境详情,每个上下文只有一个ServletContext.每个Servlet示例也都有一个封装Servlet配置的ServletConfig
      三, Servlet接口
    Servlet接口中定义了5个方法:

    1、void init(ServletConfig config) throws ServletException
    2、void service(ServletRequest request, ServletResponse response) throws ServletException,java.ioi.IOException
    3、void destroy()
    4、java.lang.String getServletInfo()
    5、ServletConfig getServletConfig()
      这里需要注意的是,在编写Java方法签名的时候,对于与包含该方法的类型不处于同一个包中的类型的时候要使用类的全名.所以在service方法中javax.servlet.ServletException的签名中可以不用写包的名称,但是java.io.IOException则要编写完整的类名称.
      在这五个方法中,init、service和destroy是生命周期方法.Servlet容器根据以下规则调用这三个方法:
    init: 当Servlet第一次被请求的时候Servlet容器会调用这个方法,在后续的请求中不会被再次调用
    service: 每当请求Servlet的时候多会调用一次
    destroy: 当销毁Servlet的时候,该方法被调用.

    一、ServletRequset接口
      对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将他传递给service方法。ServletRequset封装了关于这个请求的信息。
      ServletRequset接口中定义了一些方法:
      

       getParameter是在ServletRequest中最常用的方法。该方法通常是用来返回HTML表单域的值,getParameter也可以用于获取查询字符串的值。
     二、ServletResponse接口

      javax.servlet.ServletResponse接口表示一个Servlet响应,在调用service方法之前Servlet容器首先创建一个ServletResponse的实例,并将他作为第二个参数传入到service方法中,ServletResponse隐藏了像浏览器发送响应的复杂过程。
      在ServletResponse接口中,定义的方法之一是getWriter方法,该方法返回了一个可以向客户端发送文本的java.io.aPrintWriter。默认的情况下该对象采用的是ISO-8859-1的编码方式。
    三、ServletConfig
    当Servlet容器初始化Servlet的时候,Servlet容器会给Servlet的init方法传入一个ServletConfig的实例,该实例中封装了可以通过@WebServlet或者部署描述符传递给Servlet的配置信息
    这样传入的每一条信息就是一个初始参数,一个初始参数有key合 value两个元件
    为了从Servlet内部获取到初始参数的值,要在Servlet容器传给Servlet的init方法的ServletConfig中调用getInitParameter方法,getInitParameter方法的签名如下:

    此外,getInitParameterNames方法则是返回所有初始化参数名称的一个Enumeration:

    举个例子,当要获取contactName参数的值,要使用下面的方法签名

    除了getInitParameter和getInitParameterNamespace之外,ServletConfig还提供了一个很有用的方法:getServletContext。利用这个方法可以从Servlet内部获取ServletContext。

    四、ServletContext
    ServletContext表示Servlet应用程序,每个应用程序只有一个上下文对象,当把一个应用程序同时部署到多个容器的分布式环境中的时候,每个jvm上面的Web应用程序都会有一个ServletContext对象。
    通过ServletConfig中调用getServletContext方法,可以获得ServletContext实例,有了ServletContext就可以共享从应用程序中所有资料处访问到的信息,并且可以动态的注册web对象,前者将对象保存在ServletContext内部的Map中,
    保存在ServletContext中的对象被称作为属性
    ServletContext中的以下的方法负责处理属性:

    五、GenericServlet抽象类
    GenericServlet实现了Servlet和ServletConfig两个接口,并且完成了以下任务:
    1、将init方法中的ServletConfig付给一个类级的变量,以便可以通过调用getServletConfig获取,
    2、将接口中的所有方法提供默认实现,
    3、提供方法,包围ServletConfig中的方法

    六、HttpServlet
    HttpServlet类覆盖了javax.servlet.GenericServletl类,在使用HttpServlet的时候,还要借助分别代表Servlet请求和Servlet响应的HttpServletRequest和HttpServletResponse对象。
    HttpServletRequest接口扩展了javax.servlet.ServletRequest,HttpServletResponse接口扩展了javax.servlet.ServletResponse。
    HttpServlet覆盖了GenericServlet中的service方法,并且通过下面的签名再添加一个service方法:
    protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,java.io.IOException
    新的service方法和javax.servlet.Servlet中的service方法之间的区别在于参数列表不同

    HttpServletRequest :表示Http环境中的Servlet请求,它扩展了javax.servlet.ServcletRequest接口,中年服装你并添加了几个扩展的方法

    HttpServletResponse: 表示Http环境中的响应,该接口同样的扩展了javax.servlet.ServletResponse接口,新增了以下的几种方法:

    Servlet小结
    Servlet技术是javaEE技术的一部分,所有的Servlet都运行在Servlet容器中,容器和Servlet间的接口为javax.servlet.Servlet.javax.servlet包下还提供了一个名为GenericServlet的Servlet实现类,该类是一个辅助类。
    以便可以更加方便的创建一个Servlet。不过由于大部分的Servlet都运行在Http的环境中,因此就派生出来了一个javax.servlet.http.HttpServlet的子类更加实用。注意,HttpServlet也是GenericServlet的子类。
    emmmmm。。。。。。

    一定很枯燥吧,但是没有办法,这些干货就是这样,学技术的话还是要耐得住性子。好了,下一篇博客给大家用Servlet写一个小Demo,希望能缓解一下大家的枯燥

  • 相关阅读:
    Java中equals和==的区别
    Mybatis中#{}和${}
    AJAX发送带Header的请求
    golang定时任务
    mysql中一条insert语句批量插入多条记录
    golang 从mysql取datetime类型数据
    MySQL 慢查询日志
    mysql日志文件开启及详解:General_log 和 Binlog
    如何在普清的屏上调试CSS样式二倍图背景
    transition、animation在macbook air上图片动画边缘抖动
  • 原文地址:https://www.cnblogs.com/zhanglixina/p/9614420.html
Copyright © 2020-2023  润新知