Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet生命周期
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
init()方法
它只在第一次创建Servlet时被调用。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。
init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init方法定义如下:
1 | public void init() throws ServletException { |
service方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用
doGet、doPost、doPut,doDelete 等方法。在实际操作中,我们只需根据客户端的请求类型重写doGet()或doPost()即可。
- doGet()的请求来自一个url的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
- doPost()方法中POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。如
<form action="HelloForm" method="POST">
就是在实例html中一个调用HelloForm中POST方法的表单,web在处理时就会产生新线程并调用HelloForm中的POST服务。
service方法定义如下:
1 | public void service(ServletRequest request, |
destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。
destroy方法定义如下:
1 | public void destroy() { |
ServletRequest,ServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的ServletRequest对象、和代表响应的ServletResponse对象。获取网页提交过来的数据,只需要找ServletRequest对象就行了。要向网页输出数据,只需要找ServletResponse对象。
ServletResponse文档:https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html
ServletRequest文档:https://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html
异常处理
当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置。
您必须在 web.xml 中使用 error-page 元素来指定对特定异常 或 HTTP 状态码 作出相应的 Servlet 调用。
1 | <!-- 对所有的异常有一个通用的错误处理程序 --> |
请求属性 - 错误/异常
以下是错误处理的 Servlet 可以访问的请求属性列表,用来分析错误/异常的性质。
column0 | column1 |
---|---|
序号 | 属性 & 描述 |
1 | javax.servlet.error.status_code. 该属性给出状态码,状态码可被存储,并在存储为 java.lang. Integer 数据类型后可被分析。 |
2 | javax.servlet.error.exception_type. 该属性给出异常类型的信息,异常类型可被存储,并在存储为 java.lang. Class 数据类型后可被分析。 |
3 | javax.servlet.error.message. 该属性给出确切错误消息的信息,信息可被存储,并在存储为 java.lang. String 数据类型后可被分析。 |
4 | javax.servlet.error.request_uri. 该属性给出有关 URL 调用 Servlet 的信息,信息可被存储,并在存储为 java.lang. String 数据类型后可被分析。 |
5 | javax.servlet.error.exception. 该属性给出异常产生的信息,信息可被存储,并在存储为 java.lang. Throwable 数据类型后可被分析。 |
6 | javax.servlet.error.servlet_name. 该属性给出 Servlet 的名称,名称可被存储,并在存储为 java.lang. String 数据类型后可被分析。 |
POST,GET
最后我想介绍一下POST与GET方法之间的异同。
POST,GET属于两种常见的请求方法。
在浏览器中直接输入 URL 并回车,这便发起了一个 GET 请求,请求的参数会直接包含到 URL 里。例如,在百度中搜索 Servlet ,这就是一个 GET
请求,链接为 https://www.baidu.com/s?wd=Servlet ,其中 URL 中包含了请求的参数信息,这里参数 wd 表示要搜寻的关键字。POST
请求大多在表单提交时发起。比如,对于一个登录表单,输入用户名和密码后,点击 “登录” 按钮,这通常会发起一个 POST 请求,其数据通常以表单的形式传输,而不会体现在 URL 中。
GET 和 POST 请求方法有如下区别。
- GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到,而 POST 请求的 URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
- GET 请求提交的数据最多只有 1024 字节,而 POST 方式没有限制。
一般来说,登录时,需要提交用户名和密码,其中包含了敏感信息,使用 GET 方式请求的话,密码就会暴露在 URL 里面,造成密码泄露,所以这里最好以 POST 方式发送。上传文件时,由于文件内容比较大,也会选用 POST 方式。