JavaEE复习计划

对于这一块,也只是用到了 Web 开发的相关技术,而且不少技术已通过时或者被民间更好的取代,因此侧重于最基础的 Servlet API、会话机制。java

Servlet API

顶级接口:Servlet、ServletConfig、ServletContextweb

最经常使用的类:HttpServletapi

Servlet 接口

广义上说,一个类实现了 Servlet 接口那么就称这个类是 Servlet,也就是说 该接口中定义了全部 servlet 都必须实现的方法浏览器

方法一览:tomcat

  • init(ServletConfig)
  • service(ServletRequest, ServletResponse)
  • destroy()
  • getServletConfig()
  • getServletInfo()

根据官方 API 的解释,简单翻译过来就是这么个意思:服务器

Servlet 是一个运行在服务器端的小的 JAVA 程序,Servlet 接受和响应来自客户端的请求(一般是 HTTP协议);网络

为了实现该接口,能够继承 javax.servlet.GenericServlet 也能够继承 javax.servlet.http.HttpServlet.app

该接口定义了初始化、处理请求、删除 Servlet 的方法,这些方法被称做生命周期方法,以以下的顺序调用:webapp

  • Servlet 被构造,调用 init() 方法初始化
  • 全部请求交给 service 方法处理
  • 处理完毕以后使用 destroy 方法销毁资源,等待 GC 回收

除了生命周期方法以外该接口还提供了一个 getServletConfig 方法,Servlet 得到一些启动信息。this

ServletConfig接口

ServletConfig 的对象是由容器构造的。

初始化 Servlet 的时候,该对象传递一些启动的参数给 Servlet (以 init() 方法参数的形式)

能够简单理解:ServletConfig 中封装了 web.xml 中给 Servlet 配置的参数 ( <init-param>

方法一览:

  • getInitParameter(String name)
  • getInitParameterNames()
  • getServletContext()
  • getServletName()

Servlet 和 ServletConfig 是一一对应的,一个 Servlet 都跟着一个 config 对象

ServletContext接口

Servlet 上下文封装了与 Servlet 所在容器通讯的一些方法。

对此其实应该很熟悉,是咱们经常使用的四大存储域之一,是范围最大的一块。

ServletContext 与容器对应的;一个 ServletContext 能够对应多个 Servlet.

其中定义了不少经常使用的方法,好比获取绝对路径的 getRealpath,存储数据的 get/set Attrbiute.

得到 ServletContext 的集中方式:

  1. ServletConfig.getServletContext();
  2. HttpSession.getServletContext();
  3. FilterConfig.getServletContext();
  4. ServletContextEvent.getServletContext();

PS:既然 ServletConfig 能够拿到,那么它的实现类也都是能够的~

GenerciServlet抽象类

它实现了以前说的 Servlet 和 ServletConfig 接口,可是毕竟是个抽象类,只有一个方法未实现,因此上面有八个方法均可以使用,此外还有他本身的一些方法。

下面说说重要的几个:

  • init(ServletConfig)
    默认的实现能够总结为两句:{this.config = config;init();} ,能够看出此类确定有个 ServletConfig 类型的属性,在 init 中进行保存 config 的引用方便后续方法的使用。
    而后直接又调用了一个空参的 init 方法,这个方法就是 GenerciServlet 本身定义的,默认空实现,若是有本身的初始化逻辑,重写这个空参方法便可,而且不须要再调用 super.init(config) 方法。

  • abstract service(ServletRequest, ServletResponse)
    是的,惟一的一个抽象方法,惟一的一个未实现的。
    服务器收到请求会调用 service 进行处理,怎么处理也应该由开发者去实现,注意参数为 ServletRequest,通常咱们须要强转成 HttpServletRequest ,通常也就是处理 Http 请求吧。

而后还有两个打印日志的方法,这就是所有的方法了。

HttpServlet类

它继承自 GenericServlet ,并实现了它未实现的 service 方法,从名字能够看出是专门处理 Http 请求的,开发者写的 Servlet 通常也是继承自这个类。

而后它实现的方法作了两件事:

  1. 将 ServletRequest/ServletResponse 强转为 HttpServletRequest/HttpServletResponse
  2. 调用本身定义的 service(HttpServletRequest, HttpServletResponse) 方法(此方法是 protected 的)

那么,它本身定义的这个 service 方法到底干了什么呢?

简单说就是经过 request.getMethod() 获取到请求方式,而后根据这个请求方式来分别调用 doXXX 方法,因此开发者通常都会重写其 doGet 和 doPost。

PS:protected 修饰的方法能够覆盖,可是权限不能变小。

API 总结

从实现者、调用者、构造者的角度来看就是:

API名字 实现者 调用者 构造者(new)
Servlet 开发者 容器 容器
ServletConfig 容器 开发者 容器
ServletContext 容器 开发者 容器
Request 容器 开发者 容器
Response 容器 开发者 容器
RequestDispatcher 容器 开发者 容器
Cookie 容器 开发者 开发者
HttpSession 容器 开发者 容器
Filter 开发者 容器 容器
Listener 开发者 容器 容器

一个请求的流程

服务器以 Tomcat 为例,那么一个请求的过程大概能够分为下面几步:

  1. 服务器启动阶段
    Tomcat 启动时检测自身配置文件 conf 目录,若是配置有问题,则没法启动。
    Tomcat 检查 webapps 下工程的全部的 web.xml 文件,若是该文件有问题,则 tomcat 报错,启动正常(报错的工程没法访问,其余工程能够正常使用)。

  2. 浏览器地址栏输入地址,回车

  3. 浏览器将地址信息打包成标准的 HTTP 请求字符串

  4. 若是输入的是域名,那么进行 DNS 解析,而后经过网络发送到服务器地址

  5. 服务器接受到请求并解析,将请求信息打包到 HttpServletRequest/response 对象中

  6. web.xml 中寻找指定的 url-pattern ,根据 servlet-name 找到 Servlet-class

  7. 容器检测内存中是否有该 Servlet 的对象,若是有则使用原来的对象,若是没有则使用反射构造 Servlet 对象

  8. 【没有找到对象】容器调用 init() --> 方法初始化

  9. 容器调用 service(ServletRequest) --> doXx

  10. 咱们重写 DOXxx 方法 完成业务逻辑

  11. 容器将 response 对象转换成标准的 HTTP 响应字符串,再经过网络回送给浏览器

  12. 浏览器接受标准的响应信息,解析,显示

固然上面的每一步其实还能够细分,可是这里就先不分的过于细了。

相关文章
相关标签/搜索