1. 什么是Servlet
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据;
- 处理请求;
- 完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
2. 实现Servlet的方式
实现Servlet有三种方式:
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;(我们使用这一种)
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
3. HttpServlet
HttpServlet概述
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
HttpServlet覆盖了service()方法
当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!
HttpServlet是GenericServlet的子类,它专注HTTP请求
HttpServlet类的方法:
- 实现了void service(ServletRequest,ServletResponse)方法,实现内容是:
把ServletRequest强转成HttpServletRequest
把ServletResponse强转成HttpServletResponse - 调用本类添加的void service(HttpServletRequest,HttpServletResponse)方法
添加了void service(HttpServletRequest,HttpServletResponse)方法,内容是:
调用request的getMethod()获取请求方式
如果请求方式为GET,那么调用本类添加的doGet(HttpServletRequest,HttpServletResponse)方法
如果请求方式为POST,那么调用本类添加的doPost(HttpServletRequest,HttpServletResponse)方法 - 如果是通过继承HttpServlet类来自定义Sevlet的话,那么: * 不要去覆盖void
service(ServletRequest,ServletResponse) * 不要去覆盖void
service(HttpServletRequest, HttpServletResponse) *
而应该去覆盖doGet()或doPost()方法。
HttpServlet.java部分源码的解析
public abstract class HttpServlet extends GenericServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
……
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;//[强转]
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);//[调用上面service()方法]
}
……
}
doGet()和doPost()
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("hello doGet()...");
}
}
public class BServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("hello doPost()...");
}
}