Servlet的生命周期
Servlet的生命周期就是指一个Servlet对象从被创建到销毁。一般来说,Servlet类从第一次接收到请求的时候被创建,且只创建一次(这说明Servlet是单例的),对应到下面的代码,init只会在第一次请求这个Servlet的时候在控制台输出一次,之后再请求就不会输出了,注意我们可以在web.xml的对应servlet配置里使用<load-on-srartup>更改Servlet被创建的优先级。而destroy则是在服务器关闭的时候才会被输出,说明Servlet对象在服务器关闭的时候被销毁。
读者可以使用如下代码自行验证
public class ServletLife extends HttpServlet {
/**
* 在第一次接受到请求的时候创建Servlet对象,且只创建一次,说明Servlet是单例的
* 但是可以用过在web.xml的servlet里配置<load-on-startup></load-on-startup>更改Servlet的创建优先级
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println("init");
}
/**
*当服务器停止的时候,Servlet对象才被销毁
*/
@Override
public void destroy() {
System.out.println("I'm destroyed");
}
}
Servlet常见方法
Servlet里的方法主要以doXXX(XXX是具体的http请求方式)和service为主,下面主要说明以下这些方法的使用情况,以最常见的doGet和doPost为例
- 如果Servlet里doGet,doPost,service方法共存,则会执行service方法
- 如果Servlet里doGet,doPost共存,则会执行页面中指定请求方式的方法
- 如果Servlet里doGet,doPost,service方法共存,且在service中调用了super.service(),则会执行service与对应请求方式的方法
- 如果Servlet里只有service方法,则会执行servlce方法
- 如果Servlet里只有service方法,且在service中调用了super.service(),则会在页面中报405错误
总结:在使用中,尽量不使用service方法,而是使用对应的doGet和doPost方法
读者可以使用如下代码自行更改验证
public class MethodServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("I am post");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("I am get");
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("I am service");
super.service(req, resp);
}
}
<%--该页面命名为method.jap,放在WEB-INF目录下--%>
<%--
Created by IntelliJ IDEA.
User: frank
Date: 2020/2/10
Time: 21:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--这里action的值配置的是对应跳转的Servlet的url-pattern--%>
<form action="method" method="get">
用户名: <input type="text" name="name" value="" /><br>
密码: <input type="text" name="pwd" value="" /><br>
<input type="submit" value="登陆">
</form>
</body>
</html
<servlet>
<servlet-name>MethodServlet</servlet-name>
<servlet-class>home.frank.MethodServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MethodServlet</servlet-name>
<url-pattern>/method</url-pattern>
</servlet-mapping>
在地址栏中输入…/method.jsp,具体的跳转顺序应是 method.jsp -> (点击登陆,根据action写的值)找到method对应的servlet类 -> 根据请求方式执行对应的doGet或者doPost方法
Servlet常见错误
接下来说一下使用Servlet,访问页面时经常出现的一些Http状态码,了解这些状态码,有利于修正错误
- 404: 请求的资源无法访问。出现这个错误时,我们首先应该考虑是不是地址栏中的地址写错了,其次考虑web.xml配置的对应servlet的url-pattern与表单请求的action是否一致
- 405: 请求的方法不支持。请求里配置的方法与servlet中编写的方法不属于同类型
- 500: 服务器内部错误。一般是web.xml配置错误或者servlet类编写错误