Spring源码阅读(八)—SpringMVC基础Servlet
2017-09-02 13:56
465 查看
个人主页:tuzhenyu’s page
原文地址:Spring源码阅读(八)—SpringMVC基础Servlet
Java Servlet 是运行在 Web 服务器上的 Java 类,Servlet 可以使用 javax.servlet 和 javax.servlet.http 包来创建。
Servlet应用程序需要运行在Servlet容器内,如Tomcat,Jetty等
处理接收到的数据并生成结果
发送结果数据到客户端(浏览器),如文本文件HTML,XML等
在web.xml配置文件中注册servlet
在web.xml配置文件中配置servlet的路由URL
init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期
浏览器请求进入Tomacat,会首先检查对应的Servlet实例是否存在,如果存在则直接调用对应实例的service()方法;如果不存在则会首先装载/tomcat/webapps/文件下的对应的Servlet
d0bb
类并创建类实例;然后会调用实例的init()方法初始化ServletConfig具体的配置。
service() 方法是由容器调用,实现一个Servlet类不需要改写service() 方法,只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收.
http://localhost:8080/helloapp/hello,其中localhost是服务器主机名,也可以是IP地址127.0.0.1;8080是tomcat服务器的端口号;helloapp是web工程的上下文地址ContexRoot(一般情况下与web工程名一致);
根据URL定位到具体工程文件夹下的Context容器中的web,xml文件,搜索servlet-mapping标签找出URL对应的Servlet名字
根据Setvlet名称定位具体的Servlet类,查看是否存在该类实例,如果存在则直接调用,如果不存在则创建并初始化
根据具体的请求类型定位Servlet类中具体的doGet()或者doPost()方法
contextInitialized()当Context上下文创建时后触发该方法,可以访问context-param标签数据用于初始化Context时数据库的连接等;
contextDestroyed()当Context上下文销毁时后触发该方法,用于数据库的关闭等
主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法
HttpSessionListener主要监听HttpSession对象,一个web工程可以有多个HttpSession监听器,主要有两个方法:
sessionCreated():创建session对象,一般是一个ip浏览器第一次访问web工程时会创建一个session对象
sessionDestroyed():销毁session对象,浏览器关闭,session超时,Context关闭都会触发session的关闭;
主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法
RequestInitialized():创建ServletRequest对象,用户每一次访问web工程时都会创建一个ServletRequest对象,用于获取请求ServletRequest参数
RequestDestroyed():销毁ServletRequest对象,访问结束会触发ServletRequest的关闭;
主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法
在web.xml文件中注册监听器
原文地址:Spring源码阅读(八)—SpringMVC基础Servlet
(1)Servlet定义
Servlet是运行在应用服务器上的程序,是Web浏览器和服务器数据库或者应用程序的中间层,主要用来连接HTTP请求和后端服务程序;Java Servlet 是运行在 Web 服务器上的 Java 类,Servlet 可以使用 javax.servlet 和 javax.servlet.http 包来创建。
Servlet应用程序需要运行在Servlet容器内,如Tomcat,Jetty等
(2)Servlet的作用
接收客户端(浏览器)发送的HTTP请求,一般包含显式数据如表单数据,隐式数据如cookies等处理接收到的数据并生成结果
发送结果数据到客户端(浏览器),如文本文件HTML,XML等
(3)Servlet的创建
定义Servlet类继承HttpServlet父类重写doPost()方法和doGet()方法public class FirstServlet extends javax.servlet.http.HttpServlet { public void init() throws ServletException { str = "<h1>hello world!</h1>"; } protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { response.setContentType("text/html"); PrintWriter pw = response.getWriter(); pw.write("<h1> hello first servlet!</h1>"); } public void destroy() {} }
在web.xml配置文件中注册servlet
<servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>cn.tzy.FirstServlet</servlet-class> </servlet>
在web.xml配置文件中配置servlet的路由URL
<servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping>
(4)Servlet的生命周期
1.初始化:调用Servlet类的init()方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期
浏览器请求进入Tomacat,会首先检查对应的Servlet实例是否存在,如果存在则直接调用对应实例的service()方法;如果不存在则会首先装载/tomcat/webapps/文件下的对应的Servlet
d0bb
类并创建类实例;然后会调用实例的init()方法初始化ServletConfig具体的配置。
public void init() throws ServletException { // 初始化代码... }
2.具体服务方法:调用Servlet类的service()方法
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。service() 方法是由容器调用,实现一个Servlet类不需要改写service() 方法,只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
3.关闭:调用Servlet类的destroy()方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收.
public void destroy() { // 终止化代码... }
(5)Servlet执行流程
根据浏览器请求URL访问/tomcat/webapps文件夹下的Servlet工程文件夹http://localhost:8080/helloapp/hello
http://localhost:8080/helloapp/hello,其中localhost是服务器主机名,也可以是IP地址127.0.0.1;8080是tomcat服务器的端口号;helloapp是web工程的上下文地址ContexRoot(一般情况下与web工程名一致);
根据URL定位到具体工程文件夹下的Context容器中的web,xml文件,搜索servlet-mapping标签找出URL对应的Servlet名字
<servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
根据Setvlet名称定位具体的Servlet类,查看是否存在该类实例,如果存在则直接调用,如果不存在则创建并初始化
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>org.javathinker.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> //tomcat容器启动时自动加载初始化,数字越小加载优先级越高 </servlet>
根据具体的请求类型定位Servlet类中具体的doGet()或者doPost()方法
(6)Listener监听器的分类
1. ServletContext对象的监听器
ServletContextListener
ServletContextListener主要监听ServletContext对象,一个web工程一般只有一个ServletContextListener监听器主要有两个方法:contextInitialized()当Context上下文创建时后触发该方法,可以访问context-param标签数据用于初始化Context时数据库的连接等;
contextDestroyed()当Context上下文销毁时后触发该方法,用于数据库的关闭等
ServletContextAttributeListener
主要用来监听ServletContext属性的删除或者增加事件主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法
HttpSession对象的监听器
2. HttpSessionListener会话监听器
用户打开浏览器第一次访问该web工程,就会分配一个session,用户可以在session中保存一些信息;关闭浏览器一段时间session会自动销毁;HttpSessionListener主要监听HttpSession对象,一个web工程可以有多个HttpSession监听器,主要有两个方法:
sessionCreated():创建session对象,一般是一个ip浏览器第一次访问web工程时会创建一个session对象
sessionDestroyed():销毁session对象,浏览器关闭,session超时,Context关闭都会触发session的关闭;
HttpSessionAttributeListener
主要用来监听HttpSession属性的删除或者增加事件主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法
3.ServletRequest对象的监听器
ServletRequestListener
ServletRequestListener主要监听ServletRequest对象,一个web工程可以有多个ServletRequest监听器,主要有两个方法:RequestInitialized():创建ServletRequest对象,用户每一次访问web工程时都会创建一个ServletRequest对象,用于获取请求ServletRequest参数
RequestDestroyed():销毁ServletRequest对象,访问结束会触发ServletRequest的关闭;
ServletRequestAttributeListener
主要用来监听ServletRequest属性的删除或者增加事件主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法
(7)Listener监听器的创建和使用
创建监听器类继承ServletContextListener,ServletRequestListener,HttpSessionListen类public class ListenerTest implements HttpSessionListener, ServletContextListener, ServletRequestListener { // 创建 session public void sessionCreated(HttpSessionEvent se) { HttpSession session = se.getSession(); System.out.println("新创建一个session, ID为: " + session.getId()); } // 销毁 session public void sessionDestroyed(HttpSessionEvent se) { HttpSession session = se.getSession(); System.out.println("销毁一个session, ID为: " + session.getId()); } // 加载 context public void contextInitialized(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); System.out.println("即将启动" + servletContext.getContextPath()); } // 卸载 context public void contextDestroyed(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); System.out.println("即将关闭" + servletContext.getContextPath()); } // 创建 request public void requestInitialized(ServletRequestEvent sre) { HttpServletRequest request = (HttpServletRequest) sre.getServletRequest(); String uri = request.getRequestURI(); uri = request.getQueryString() == null ? uri : (uri + "?" + request.getQueryString()); request.setAttribute("dateCreated", System.currentTimeMillis()); System.out.println("IP " + request.getRemoteAddr() + " 请求 " + uri); } // 销毁 request public void requestDestroyed(ServletRequestEvent sre) { HttpServletRequest request = (HttpServletRequest) sre.getServletRequest(); long time = System.currentTimeMillis() - (Long) request.getAttribute("dateCreated"); System.out.println(request.getRemoteAddr() + "请求处理结束, 用时" + time + "毫秒. "); } }
在web.xml文件中注册监听器
<listener> <listener-class>cn.tzy.ListenerTest</listener-class> </listener>
相关文章推荐
- spring-mvc源码阅读(一)servlet
- SpringMVC深度探险(1,2,3,4)Spring源码阅读:Spring MVC 初始化 - 螺 丝 钉 / DispatcherServlet的初始化主线
- SpringMVC(1):基础配置文件web.xml 和 <servlet-name>-servlet.xml / springmvc.xml
- 【Spring in action】SpringMVC的准备工作:Servlet基础
- Spring源码阅读(五)—AOP基础
- Spring源码阅读(九)—SpringMVC的初始化
- springMvc源码学习之:spring源码总结
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
- SpringMVC源码分析--容器初始化(四)FrameworkServlet
- Spring源码解析——如何阅读源码
- 网络基础 — 阅读源码后理解epoll的一个错误纠正
- 学习笔记:springmvc4.3源码学习:spring解析配置文件过程
- Spring源码阅读-ApplicationContext对BeanFactory的增强
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
- Spring,Struts2,Hibernate,SpringMVC,Mybaties基础
- Spring源码阅读4.1-Aspecjt AOP之获取Adivsor
- springMVC配置文件spring-servlet.xml中<mvc:annotation-driven />的意义
- Three.js源码阅读笔记(基础的核心Core对象)
- Spring源码解析——如何阅读源码
- spring源码阅读(2)核心类介绍