文章目录
一、Servlet生命周期
Servlet源码如下,可以看到它是个只有5个方法的interface,所以网络协议、https啥的,servlet根本不管!servlet作为一个接口,就是为了规范。
public interface Servlet {
void init(ServletConfig var1) throws ServletException;//初始化
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;//调用服务
String getServletInfo();
void destroy();//销毁
}
Serlvet接口有两个默认的实现类: HttpServlet,GenericServlet
1.Servlet 生命周期
Servlet生命周期:是指Servlet从创建直到销毁的整个过程。
以下是 Servlet 遵循的过程:
① 执行实现类空参的构造器
② 调用init () 方法初始化
③ 调用service() 方法处理客户端请求
④ 调用destroy() 方法销毁
⑤ 由JVM的垃圾回收器进行垃圾回收
Servlet 生命周期注意:
① init 方法只在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
② service() 方法用于执行实际任务。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法,并将格式化后的响应返回给客户端。
③ destroy() 方法在Servlet停止tomcat服务时只被调用一次,用于结束Servlet的生命周期,执行后Servlet对象被标记为垃圾回收。destroy() 方法可以使得Servlet关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
2.Servlet的工作流程
servlet只是一种规范,并不会直接处理来自客户端(浏览器)的请求,必须将servlet部署到tomcat等服务器上,tomcat才是直接对客户端请求处理,它监听端口,收到请求后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用对应servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。
3.编程演示Servlet的生命周期
HelloServlet.java
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1.执行空参构造器");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.初始化后调用init()方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.调用service()方法来处理客户端的请求。");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4.销毁前调用destroy()方法。");
}
}
web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.jd.servlet.HelloServlet</servlet-class>
</servlet>
<!--指定要请求的路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>i
</servlet-mapping>
将项目部署到tomcat服务器上,然后运行项目,跳转到如下浏览器界面
输入请求地址,回车
查看idea的控制台,可以看到执行了空参构造器、初始化方法init()执行、service()方法执行,并未执行destroy()方法。
再次通过浏览器请求,可以看到idea控制台只执行了service()方法,关闭服务,等待程序结束,可以看到destroy()方法被执行,垃圾被JVM回收。
二、doGet和doPost
HttpServlet类的继承关系,在实际程序中,我们选择继承HttpServlet类而不是实现Servlet接口。
doGet和doPost定义在HttpServlet类中,service() 方法由tomcat服务器(servlet容器)调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,你不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
1.doGet()方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
//doGet()方法源码
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
2.doPost()方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
//doPost()方法源码
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
3.doGet()和doPost()对比
index.jsp
<html>
<body>
<h2>客户登录</h2>
<%--{pageContext.request.contextPath}代表当前的项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" name="登录">
</form>
</body>
</html>
在重写后可以doGet()和doPost()之间相互调用,下面看看对比:
① form运行方式
当form中的method属性为get时,执行doGet方法(默认是get)
当form中的method属性为post时,执行doPost方法
② 生成方式
get方式有四种:1)直接在URL地址栏中输入URL。2)网页中的超链接。3)form中method为get。4)form中method为空时,默认是get提交。
post只有一种:form中method属性为post
③ 传送的数据量
GET方式:数据量长度有限制,一般不超过2kb
POST方式:适合大规模的数据传送
④ 安全性
GET方式:安全性差。直接将数据显示在地址栏中,浏览器有缓冲,可记录用户信息
POST方式:安全性高。因为post方式提交数据时是采用的HTTP post机制,是将表单中的字段与值放置在HTTP HEADER内一起传送到ACTION所指的URL中,用户是看不见的。
⑤ 在用户刷新时
GET方式:不会有任何提示、
POST方式:会弹出提示框,问用户是否重新提交。
在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式。
参考博客
doGet()和doPost()区别