Servlet是客户端发过来请求,服务器使用Servlet技术对客户端发过来的请求进行解析,并在必要的时候,发起相应。Servlet是Java的一项必备技能,Servlet的内容是javaEE的内容,它是企业开发中常常会用到的一项技术。
servlet开发要经过的步骤
1. 编写servlet类
编写servlet类一共有三种方法
- 实现javax.servlet.Servlet接口
- 继承GenericServlet类
- 继承HttpServlet抽象类 实现开发中使用这种方法
1. 实现javax.servlet.Servlet接口
public class Aservlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2. 继承GenericServlet类
public class CServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
3. 继承HttpServlet抽象类
public class DServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
第三个方法很多人以为要重写service(),
这样子是错误的,我们可以去看看HttpServlet类的源码
当有客户发起网络请求的时候,第三种方法的运行顺序是
-
运行周期方法:
service()
上面代码很多小伙伴感觉他是方法的递归,但是呢我们仔细一看,它有个向下转型的操作,他在调用service()
方法的时候,该方法的参数列表发生了变化,所以不是方法的递归,而是调用了其他重载方法。我们仔细看他的源码还有一个protected方法service()
-
调用protected方法
service()
由上面的代码可以知道,会根据提交方式来决定调用哪个方法 -
调用提交方法
我们以get方法为例
-
调用sendMethodNotAllowed()方法
上面的方法仅仅是发送失败的状态码
我们从上面可以知道,我们不重写直接改动的话,是不行的,因为总是失败的状态码,所以我们要重写提交方法,可以根据实际情况来选择重写的提交方法,如果我们单纯重写周期service()方法的话,他上面的代码全都没有意义了
在WEB-INF/web.xml文件中进行配置
2. servlet的周期
我们在理解servlet的周期的时候,可以结合第一种编写servlet方法来理解生命周期
客户端第一次对我们编写的Servlet发起请求的时候,我们的服务器(tomcat)创建servlet对象,并调用初始化方法
init()
,init()
方法是初始化方法,只会调用一次。调用完init()
方法服务器才会运行service()
方法,同时服务器会对该servlet对象进行保存,而不是直接销毁该对象
用户发起第二次或者第二次以上请求的时候,服务器会使用保存的servlet对象,而不会创建一个新的servlet对象,再调用service()
当我们要关闭服务器的时候,服务器会销毁所有的对象,包括servlet对象,在关闭服务器之前会调用destroy()
方法
上面的周期方法不需要我们自己调用,服务器会自己调用这些方法,servlet对象也不需要我们创建,服务器会自己创建