Servlet在Javaweb学习研究中起着重要的作用。学好它是后续Javaweb学习的良好基础。无论是SSH、SSM还是微服务Javaweb技术,都要先学好Servlet,事半功倍。本文将主要分析Servlet的运行原理。
一、UML
下图为Servletet UML关系图。
从图中可以看出:
1. 抽象Httpservlet继承抽象Genericservlet有两种关键方法,doGet()和dopost()
2. 实现接口Servlet的Genericservlet,ServletConfig,Serializable
3. MyServlet(用户自定义Servlet)继承HttpServlet,重写抽象HttpServletdoget()和dopost()方法
注:任何用户自定义Servlet,只需重写抽象HttpServlet的dopost()和doget(),如上图所示
二、Servlet在容器中的执行过程
Servlet只能在容器中执行,Servlet容器种类繁多,如Tomcat、Weblogic等。下图简单 请求响应 模型。
分析:
1. 浏览器向服务器发出GET请求(请求服务器Servleta)
2. 服务器上的容器逻辑接收到url,根据url判断为servlet请求。此时,容器逻辑将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)
3. 根据URL找到目标Servlet(本示例目标Servlet为ServletA),并创建一个线程A
4. 将刚刚创建的请求对象和响应对象传递给线程A
5. 容器逻辑调用Servletservice()方法
6. service()根据要求类型(本示例为GET请求)调用doget()(本示例调用doget())或dopost()
7. doGet()执行后,将结果返回给容器逻辑
8. 线程A在线程池中被销毁或放置
注意:
1.原则上,容器中的每个Servlet只有一个例子
2.每个请求对应一个线程
3.多个线程可以作用于同一个Servlet(这是Servlet线程不安全的根本原因)
4.一旦每个线程完成任务,它将被销毁或放置在线程池中等待回收
Servlet在Javaweb中扮演的角色
在Javaweb中,Servlet扮演两个角色:页面角色和控制器角色。
Servlet拥有jsp等动态页面技术后,更注重控制器角色,jsp+servlert+model 形成基本的三层结构
(1)页面Page角色
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); out.println("Hello!Servlet."); }
(二)控制器角色
jsp扮演页面角色,servlet扮演控制器角色,两者结合构建基本的MVC三层架构模式
Servlet在容器中的生命周期
下图是Servlet生命周期的简要概图
分析:
第一步:容器首先加载Servlet类
步骤2:实例化Servlet(Servlet不参构造函数执行)
第三步:执行init()方法(Service()方法执行前只执行一次)
第四步:执行service()方法,处理客户请求,doPost()或doget()
第五步:执行destroy(),销毁线程
