静态web页面:html+css+js,页面是静态的、不变的,显示给每个用户的页面都一样。
动态web页面:php、jsp、asp,根据用户、实时数据(数据库)来动态显示页面,不同的用户,显示的页面可能不同。
浏览器发送HTTP请求,HTTP服务器(比如Apache)接受并解析HTTP请求,对静态资源的请求由HTTP服务器负责处理,对Servlet的请求由HTTP服务器转交给Servlet容器处理。
Servlet容器(比如Tomcat)根据映射关系,调用相应的Servlet来处理请求,Servlet处理完毕将结果返回给Servlet容器,Servlet容器将结果转交给HTTP服务器,HTTP服务器以HTTP响应的形式将结果返回给浏览器。
init()、service()、destroy()三个方法表现了Servlet的声明周期。
Servlet容器解析Servlet请求,根据映射关系确定要调用的Servlet,检查内存中是否已存在该Servlet实例。
若已存在,则直接使用该Servlet实例。
若不存在,先创建该Servlet的实例,再调用init()初始化该Servlet实例。
Servlet容器为每个Servlet请求创建ServletRequest对象、ServletResponse对象,将Servlet请求封装在ServletRequest对象中,把ServletRequest、ServletResponse对象作为参数传递给service()。
service()处理servlet请求,将响应封装在ServletResponse对象中,传回给HTTP服务器。
当Servlet容器(比如Tomcat)关闭,或web应用被移出Servlet容器时,Servlet会随着web应用的销毁而销毁。
在销毁Servlet之前,Servlet容器会调用Servlet实例的destroy()方法。
Servlet实例一旦创建,就会常驻内存,直到服务器被关闭,或web应用被移出Servlet容器,Servlet才会被销毁。
在Servlet生命周期中,init()、destroy()均只调用一次,service()会调用多次。
每次处理Servlet请求,都会创建新的ServletRequest对象、ServletResponse对象,调用一次service()方法。
javax.servlet.Servlet接口有2个默认的实现类:
GenericServlet 这是一个抽象类,未实现许多方法,主要是未实现service(),自己写service()很麻烦。一般不用这个。
HttpServlet 实现了GenericServlet,并在GenericServlet的基础上进行了扩展,我们根据需要重写doGet()、doPost()即可。推荐。doGet()、doPost的权限都是protected,因为它们只在service()中被调用,Servlet容器调用service()来处理Servlet请求,而非直接调用doGet()、doPost()。
1 public class TestServlet extends HttpServlet { 2 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3 doGet(request, response); 4 } 5 6 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 7 PrintWriter writer = response.getWriter(); //获取响应输出流 8 writer.write("ok"); //输出 9 } 10 }
HttpServlet中有2个service():
public void service(ServletRequest req, ServletResponse res)
protected void service(HttpServletRequest req, HttpServletResponse resp)
一个公有的,暴露出来,供外部调用。一个保护的,供类中调用。
public void service(ServletRequest req, ServletResponse res) 公有的这个,先接收2个参数,
把这2个参数分别转换为HttpServletRequest、HttpServletResponse类型,
再调用protected的service(), protected void service(HttpServletRequest req, HttpServletResponse resp) ,把2个参数传进去。
protected的service(),先获取请求类型 String method = req.getMethod(); ,
再判断这个请求类型是get、post,还是其它什么。
根据请求类型来调用对应的方法,是get,就调用doGet()来处理请求;是post,就调用doPost()来处理请求。并将参数传进去:
protected void doPost(HttpServletRequest request, HttpServletResponse response) { } protected void doGet(HttpServletRequest request, HttpServletResponse response){ }
转载于:https://www.cnblogs.com/chy18883701161/p/11396560.html