Servlet学习
一. Servlet概述
Servlet(Server + Applet) 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
二. Servlet API
主要Servlet API介绍
- javax.servlet.Servlet接口:
所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集 - javax.servlet.GenericServlet类
是Servlet的通用版本,是一种与协议无关的Servlet - javax.servlet.http.HttpServlet类
在GenericServlet基础上扩展的基于Http协议的Servlet
通常使用HttpServlet来处理Http请求:
public class MyServlet extends HttpServlet {
}
三. Serlvet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
生命周期 | 谁来做 | 何时做 |
---|---|---|
实例化 | Serlvet容器 | 当Servlet容器启动或者容器检测到客户端请求时 |
初始化 | Serlvet容器 | 实例化后, 容器调用Servlet的init()初始化对象 |
处理请求 | Serlvet容器 | 得到客户端请求并做出处理时 |
销毁 | Serlvet容器 | 当程序中的Servlet对象不再使用的时候, 或者Web服务器停止运行的时候 |
1. init方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。
2. doGet() 方法
doGet()方法用来处理GET请求
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// Servlet 代码
}
3. doPost() 方法
doPost()方法用来处理POST请求
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// Servlet 代码
}
4.service()方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// Servlet 代码
}
5. destory()方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。通常将代码的清理和关闭代码写在其中
public void destroy() {
// 终止化代码...
}
示例:
public class MyServlet extends HttpServlet {
public void init() throws ServletException{
// 执行必需的初始化
}
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
// 处理GET请求
}
public void doPostt(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
// 处理POST请求
}
public void destroy(){
// Servlet销毁时执行
}
}
四. Servlet的部署
现在我们创建了Servlet类, 但是服务器如何知道用户的请求要交给哪个Servlet来处理呢? 创建了Servlet之后, 还需要web.xml文件中配置相关信息
在xml文件中进行如下配置
<!--配置servlet类路径 -->
<servlet>
<servlet-name>ms</servlet-name> <!-- 对Servlet相对路径起个别名 -->
<servlet-class>com.MyServlet</servlet-class> <!-- Servlet的相对路径 -->
<load-on-startup>1</load-on-startup> <!-- 数字表示加载顺序,该Servlet在服务器启动时就会初始化完成 -->
</servlet>
<!--配置访问方式 -->
<servlet-mapping>
<servlet-name>ms</servlet-name> <!-- Servlet的别名,已经在上方定义 -->
<url-pattern>/hello</url-pattern> <!-- 请求地址 -->
</servlet-mapping>
如何理解: 浏览器请求url地址后, url比对XML中的url-pattern中的地址, 如果有对应的url-pattern, 则在servlet中找到与url-pattern成对的servlet-name, 最后就可以得到
servlet-name对应的唯一的servlet-class, 获取了这个Servlet的相对路径, 就可以让这个Servlet来处理响应的请求了
注意:
- servlet-name和servlet-class 必须一一对应
- url-pattern中必须有斜杠
- servlet-class必须是正确的相对路径
任何配置信息的错误都有可能让Tomcat无法启动或无法处理请求. 配置web.xml后必须重启服务器.