Servlet学习(一)

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
2
3
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
2
3
4
public void service(ServletRequest request, 
ServletResponse response)
throws ServletException, IOException{
}

destroy() 方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。

destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

destroy方法定义如下:

1
2
3
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
2
3
4
5
<!-- 对所有的异常有一个通用的错误处理程序 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>

请求属性 - 错误/异常

以下是错误处理的 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 方式。

谢谢你请我吃糖果
0%