2019年最新alexa排名前100w的域名
时间:2023-02-10 16:12:01 | 来源:建站知识
时间:2023-02-10 16:12:01 来源:建站知识
2019年最新alexa排名前100w的域名,文件格式是csv,第一列是域名的id,第二列是域名名称; 更改分数为3,不允许动态调分
文件:n459.com/file/25127180-477232455以下内容无关:
-------------------------------------------分割线---------------------------------------------
最近工作中有部分整改老接口的任务,大部分与Spring的拦截器,Tomcat相关,改到一些底层的代码发现,对基础J2EE的知识有些遗忘,需要频繁查阅,索性从头系统的整理一下Servlet和Filter的知识。
1|0Servlet是什么
Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序。具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。通常来说,Servlet 是指所有实现了 Servlet 接口的类。Servlet的主要工作流程如下图:
Servlet 的请求首先会被 HTTP 服务器(如 Apache)接收,HTTP 服务器只负责静态 HTML 页面的解析,而 Servlet 的请求会转交给 Servlet 容器,Servlet 容器会根据 web.xml 文件中的映射关系,调用相应的 Servlet,Servlet 再将处理的结果返回给 Servlet 容器,并通过 HTTP 服务器将响应传输给客户端。
Servlet 主要用于处理客户端传来的 HTTP 请求,并返回一个响应,它能够处理的请求有 doGet() 和 doPost() 等。 Servlet 由 Servlet 容器提供,Servlet 容器是指提供了 Servlet 功能的服务器(如 Tomcat)。 Servlet 容器会将 Servlet 动态加载到服务器上,然后通过 HTTP 请求和 HTTP 应与客户端进行交互。
2|0Servlet的相关类及接口
Sun 公司提供了一系列的接口和类用于 Servlet 技术的开发,其中最重要的接口是 javax.servlet.Servlet。在 Servlet 接口中定义了 5 个抽象方法,具体如下表:
Servlet 接口中的五个方法,其中 init()、service() 和 destroy() 方法可以表现 Servlet 的生命周期,它们会在某个特定的时刻被调用。 针对 Servlet 的接口,Sun 公司提供了两个默认的接口实现类:
GenericServlet 和
HttpServlet。其中,
GenericServlet 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理。
HttpServlet 是
GenericServlet 的子类,它继承了
GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型提供了具体的操作方法。通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用最多的也是 HttpServlet 对象。
3|0Servlet的生命周期
在java程序中,任何对象都有其生命周期,Servlet也不例外;
图 中描述了 Servlet 的生命周期。Servlet容器加载之后,按照功能的不同,大致可以将 Servlet 的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。
3|1初始化阶段
当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会解析请求,检查内存中是否已经有了该 Servlet 对象,如果有,则直接使用该 Servlet 对象,如果没有,则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作。需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次。
3|2运行阶段
这是 Servlet 生命周期中最重要的阶段,在这个阶段中,Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 响应的 ServletResponse 对象,然后将它们作为参数传递给 Servlet 的 service() 方法。 service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。 在 Servlet 的整个生命周期内,对于 Servlet 的每一次访问请求,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象,也就是说,service() 方法在 Servlet 的整个生命周期中会被调用多次。
3|3销毁阶段
当服务器关闭或 Web 应用被移除出容器时,Servlet 随着 Web 应用的关闭而销毁。在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源。在 Servlet 的整个生命周期中,destroy() 方法也只能被调用一次。 在这里,Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁。
4|0Servlet作用位置及主要工作流程
Servlet 的每次请求,Web 服务器在调用 service() 方法之前,都会创建 HttpServletRequest 和
HttpServletResponse 对象。其中,
HttpServletRequest 对象用于封装 HTTP 请求消息,简称 request 对象。
HttpServletResponse 对象用于封装 HTTP 响应消息,简称 response 对象(后面会详细介绍该部分)。详细流程见下图:
根据图中可见,当浏览器中发生了请求事件,
- 会向 Web 服务器发送了一个 HTTP 请求;
- Web 服务器根据收到的请求,会先创建一个 HttpServletRequest 和 HttpServletResponse 对象,然后再调用相应的 Servlet 程序。
- 在 Servlet 程序运行时,它首先会从 HttpServletRequest 对象中读取数据信息,然后通过 service() 方法处理请求消息,并将处理后的响应数据写入到 HttpServletResponse 对象中。最后,Web 服务器会从 HttpServletResponse 对象中读取到响应数据,并发送给浏览器。
注:在 Web 服务器运行阶段,每个 Servlet 都只会创建一个实例对象,针对每次 HTTP 请求,Web 服务器都会调用所请求 Servlet 实例的 service(HttpServletRequest request,HttpServletResponse response)方法,并重新创建一个 request 对象和一个 response 对象。
5|0HttpServletRequest基础
5|1关于Request对象
前面讲了很多关于request对象的信息,下面就来详细说一下request对象。在网络中,我们的数据都是基于协议传输的,在web应用中,流通最多的就是http协议,
一个浏览器请求web服务器,其实本质是向web服务器发送一个http请求,而web服务器为了能更好的在web应用中使用这个http,就封装了一个HttpServletRequest的类,并为此建立了一系列的方法及方案来创建request对象;
HttpServletRequest 接口继承自 ServletRequest 接口,其主要作用是封装 HTTP 请求消息。由于 HTTP 请求消息分为请求行、请求消息头和请求消息体三部分。因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。
当访问 Servlet 时,所有请求消息将被封装到 HttpServletRequest 对象中,请求消息的请求行中包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,HttpServletRequest 接口定义了一系列方法,如下表所示:
获取请求行信息的常用方法方法声明功能描述String getMethod()该方法用于获取 HTTP 请求消息中的请求方式(如 GET、POST 等)String getRequestURI()该方法用于获取请求行中的资源名称部分即位于 URL 的主机和端门之后、参数部分之前的部分String getQueryString()该方法用于获取请求行中的参数部分,也就是资源路径后问号(?)以后的所有内容String getContextPath()该方法用于获取请求 URL 中属于 Web 应用程序的路径,这个路径以 / 开头,表示相对于整个 Web 站点的根目录,路径结尾不含 /。如果请求 URL 属于 Web 站点的根目录,那么返回结果为空字符串("")String getServletPath()该方法用于获取 Servlet 的名称或 Servlet 所映射的路径String getRemoteAddr()该方法用于获取请求客户端的 IP 地址,其格式类似于 192.168.0.3String getRemoteHost()该方法用于获取请求客户端的完整主机名,其格式类似于
http://pcl.mengma.com。需要注意的是,如果无法解析出客户机的完整主机名,那么该方法将会返回客户端的 IP 地址int getRemotePort()该方法用于获取请求客户端网络连接的端口号String getLocaIAddr()该方法用于获取 Web 服务器上接收当前请求网络连接的 IP 地址String getLocalName() 该方法用于获取 Web 服务器上接收当前网络连接 IP 所对应的主机名int getLocalPort()该方法用于获取 Web 服务器上接收当前网络连接的端口号String getServerName()该方法用于获取当前请求所指向的主机名,即 HTTP 请求消息中 Host 头字段所对应的主机名部分int gctServcrPort()该方法用于获取当前请求所连接的服务器端口号,即 HTTP 请求消息中 Host 头字段所对应的端口号部分StringBuffcr getRequestURL()该方法用于获取客户端发出请求时的完整 URL,包括协议、服务器名、端口号、 资源路径等信息,但不包括后面的査询参数部分。注意,getRequcstURL() 方法返冋的结果是 StringBuffer 类型,而不是 String 类型,这样更便于对结果进行修改
获取请求消息头的方法方法声明功能描述String getHeader(String name)该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,则 getHeader() 方法返回 null;如果请求消息中包含多个指定名称的头字段,则 getHeader() 方法返回其中第一个头字段的值Enumeration getHeaders(String name) 该方法返回一个 Enumeration 集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时可能会出现多次Enumeration getHeaderNames()该方法用于获取一个包含所有请求头字段的 Enumeration 对象int getIntHeader(String name)该方法用于获取指定名称的头字段,并且将其值转为 int 类型。需要注意的是,如果指定名称的头字段不存在,则返回值为 -1;如果获取到的头字段的值不能转为 int 类型,则将发生 NumberFormatException 异常long getDateHeader(String name)该方法用于获取指定头字段的值,并将其按 GMT 时间格式转换为一个代表日期/时间的长整数,该长整数是自 1970 年 1 月 1 日 0 时 0 分 0 秒算起的以毫秒为单位的时间值String getContentType()该方法用于获取 Content-Type 头字段的值,结果为 String 类型int getContentLength()该方法用于获取 Content-Length 头字段的值,结果为 int 类型String getCharacterEncoding()该方法用于返回请求消息的实体部分的字符集编码,通常是从 Content-Type 头字段中进行提取,结果为 String 类型
5|2请求转发
当一个 Web 资源收到客户端的请求后,如果希望服务器通知另外一个资源处理请求,可以通过RequestDispatcher 对象来解决, ServletRequest 接口中定义了一个获取 RequestDispatcher 对象的方法。
- RequestDispatcher getRequestDispatcher (String path)
返回封装了某条路径所指定资源的 RequestDispatcher 对象。其中,参数 path 必须以“/”开头,用于表示当前 Web 应用的根目录。需要注意的是,WEB-INF 目录中的内容对 RequestDispatcher 对象也是可见的。因此,传递给 getRequestDispatcher(String path) 方法的资源可以是 WEB-INF 目录中的文件RequestDispatcher 接口定义了两个相关方法。
6|0HttpServletResponse基础
6|1关于Response对象
HttpServletnse 接口继承自 ServletResponse 接口,主要用于封装 HTTP 响应消息。由于 HTTP 响应消息分为状态行、响应消息头、消息体三部分。因此,在 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。
当 Servlet 向客户端回送响应消息时,需要在响应消息中
设置状态码。因此,HttpServletResponse 接口定义了两个发送状态码的方法。
1)setStatus(int status)方法
该方法用于设置 HTTP 响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而 HTTP 版本由服务器确定,因此,只要通过 setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,在正常情况下,Web 服务器会默认产生一个状态码为 200 的状态行。
2)sendError(int sc)方法
Servlet 向客户端发送的响应消息中包含
响应头字段,由于 HTTP 协议的响应头字段有很多种,因此,HttpServletResponse 接口定义了一系列设置 HTTP 响应头字段的方法。
于在 HTTP 响应消息中,大量的数据都是通过
响应消息体传递的,因此,ServletResponse 遵循以 I/O 流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法。
1)getOutputStream() 方法
该方法所获取的字节输出流对象为 ServletOutputStream 类型。由于 ServletOutputStream是OutputStream 的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。
2)getWriter() 方法
该方法所获取的字符输出流对象为 PrintWriter 类型。由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全部为字符文本的网页文档,则需要使用 getWriter() 方法。 注意:虽然 response 对象的 getOutputStream() 和 getWriter() 方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生 IllegalStateException 异常。
6|2请求重定向
在某些情况下,针对客户端的请求,一个 Servlet 类可能无法完成全部工作。这时,可以使用请求重定向完成这一工作。 请求重定向指 Web 服务器接收到客户端的请求后,可能由于某些条件的限制,不能访问当前请求 URL 所指向的 Web 资源,而是指定了一个新的资源路径,让客户端重新发送请求。
为了实现请求重定向,HttpServletResponse 接口定义了一个 sendRedirect() 方法,该方法用于生成 302 响应码和 Location 响应头,从而通知客户端重新访问 Location 响应头中指定的 URL
sendRedirect() 方法的工作原理如图
当客户端访问 Servlet1 时,由于在 Servlet1 中调用了 sendRedirect() 方法将请求重定向到 Servlet2,因此,浏览器收到 Servlet1 的响应消息后,立刻向 Servlet2 发送请求,Servlet2 对请求处理完毕后,再将响应消息回送给客户端浏览器并显示。