个人整理,欢迎转载与批评建议,转载请添加索引,谢谢。

---------------------------------------------------------------2017.06.10---------------------------------------------------------------

Servlet简介

  Servlet是Java Web的技术核心之一,而且也是另一技术核心Java Server Pages(JPS)的支撑基础。文章的主要部分将介绍Servlet的使用以及原理,还有Servlet的载体,这里选用Tomcat。

  一个Servlet是一个Java 类,经由Servlet容器创建、调用、销毁,也就是说Servlet容器管理着Servlet的生命周期。它在服务器工作期间将驻留在内存中,响应客户端发来的对应请求。下面是一个Servlet应用的基础架构,其中屏蔽了很多细节,我们将渐渐深入解析。

  ①浏览器接受到用户输入指令,转而生成Http响应指令发送至Servlet容器;

  ②Servlet容器是一种特殊的Http服务器,将分析Http请求是否是静态数据,如果是则直接发送静态数据;

  ③如果对应的是某一Servlet的第一次调用,则交给Servlet容器创建Servlet,并将Request和Response交由Servlet处理;

  ④处理完结果Response返回至Servlet容器,Servlet容器包装Response之后返回Http响应;

  ⑤浏览器接收Http响应并根据结果请求更多内容和渲染画面,一次交互结束。

 Tomcat容器

  Tomcat容器是一种大家比较熟悉的Servlet容器,解析Servlet容器的工作方式有利于大家理解Servlet。

  Tomcat容器采用众多容器来管理,而底层是Servlet容器,Servlet容器又管理着Context容器,Context容器管理着的是Wrapper类。

  Wrapper类是Servlet的包装类,也就是说真正管理Servlet的是Context容器,一个Context容器表示一个application,一个Context容器管理着很多Wrapper类(Servlet)。为了验证这一点,我们看以下Tomcat的一个启动类org.apache.catalina.startup.Tomcat源码:

  1. public Context addWebapp(Host host, String url, String path) {
  2. silence(url);
  3.  
  4. Context ctx = new StandardContext();
  5. ctx.setPath( url );
  6. ctx.setDocBase(path);
  7. if (defaultRealm == null) {
  8. initSimpleAuth();
  9. }
  10. ctx.setRealm(defaultRealm);
  11.  
  12. ctx.addLifecycleListener(new DefaultWebXmlListener());
  13.  
  14. ContextConfig ctxCfg = new ContextConfig();
  15. ctx.addLifecycleListener(ctxCfg);
  16.  
  17. // prevent it from looking ( if it finds one - it'll have dup error )
  18. ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
  19.  
  20. if (host == null) {
  21. getHost().addChild(ctx);
  22. } else {
  23. host.addChild(ctx);
  24. }
  25.  
  26. return ctx;
  27. }

每当新增一个application,Tomcat容器会调用一次addWebapp()函数,也就是每次都会创建一个新的StandardContext;

  1. public static Wrapper addServlet(Context ctx,
  2. String servletName,
  3. String servletClass) {
  4. // will do class for name and set init params
  5. Wrapper sw = ctx.createWrapper();
  6. sw.setServletClass(servletClass);
  7. sw.setName(servletName);
  8. ctx.addChild(sw);
  9.  
  10. return sw;
  11. }

Context可以添加Wrapper类,而Wrapper类接受的参数就可以明白它是一个Servlet的包装类。

Servlet层次结构

java.servlet

javax.servlet.http

掌握上述接口和类就可以熟练地进行servlet编程,下面我们重点描述其中几个,其余就进行功能描述:

  ①Servlet

  所有Servlet都必须实现这一接口,主要用于容器配置Servlet,实现初始化,调用,销毁等功能,也就是servlet的生命周期管理函数;

  1.   void init(ServletConfig config) throws ServletException  //初始化
  2.   ServletConfig getServletConfig()  //获取servletConfig对象
  3.   void service(ServletRequest req,ServletResponse res)throws ServletException,IOException  //当每次有一个对应的servlet请求时,容器会调用service方法
  4.   void destroy()  //销毁servlet

  ②servletconfig和servletcontext

  这两个类是用于配置servlet环境。

  servletconfig是用于配置单独当前servlet环境,主要的功能是获取ServletContext;

  1.   String getInitParameter(String name)  //获取初始化参数,使用者可制定servlet如何初始化
  2.   ServletContext getServletContext()  //获取servletcontext,后面将介绍

  servletcontext是用于配置context环境,还记得刚说过context管理着servlet的包装类?

  1.   void setAttribute(String name,Object object)  //在context上下文中设置保存一个对象
  2.   Object getAttribute(String name)  //获取保存的对象
  3.   Enumeration getInitParameterNames()  //获取初始化参数
  4.   String getRealPath(String path)  //获取对应path的物理路径
  5.   URL getResource(String path)throws MalformedURLException  //获取对应path的相对路径
  6.   void log(String message,Throwable throwable)  //当异常发生时记录日志

  ③HttpServlet

  1.   protected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException
  2.   protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException

  ④RequestDispatcher

  RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。

  1.   void forward(ServletRequest request,ServletResponse response)throws ServletException,IOException //把request转发至服务器中的另一资源
  2.   void include(ServletRequest request,ServletResponse response)throws ServletException,IOException //把资源包含到响应中

  ⑤Cookie和HttpSession

  Http是无状态协议,所以需要有一个“地方”用来保存某些状态信息,Cookie是保存在客户端的“地方”,而Session是服务端的“地方”。

  Cookie和HttpSession是javaBean,被用来进行传输保存的对象,没什么好说的。

  ⑥HttpServletRequest和HttpServletResponse

  HttpServletRequest

  1.   Cookie[] getCookies() //获取浏览器的cookies
  2.   Enumeration getHeaders(String name) //获取requset包含的请求头信息
  3.   HttpSession getSession(boolean create) //create参数为true并没有session创建一个session,有session则获取之前创建的session  
  4.   void setAttribute(String name,Object o)  //设置attribute对象
  5.   Object getAttribute(String name)  //获取request中设定的attribute对象
  6.   void setCharacterEncoding(String env)throws UnsupportedEncodingException  //设置编码集
  7.   String getCharacterEncoding()  //获取编码集
  8.   ServletInputStream getInputStream()  //获取request输入字节流
  9.   BufferedReader getReader()throws IOException  //获取request输入字符流
  10.   RequestDispatcher getRequestDispatcher(String path)  //获取RequestDispatcher
  11.   String getParameter(String name)  //获取浏览器设置的参数

  HttpServletResponse

  1.   void addCookie(Cookie cookie) //添加cookie
  2.   void addHeader(String name,String value) //添加头信息
  3.   void setHeader(String name,String value) //设置头信息
  4.   String encodeURL(String url) //编码一个url使之追加sessionID,用于一些浏览器禁止cookie时使用,可和getSession(boolean create)配合使用
  5.   String getCharacterEncoding()
  6.   void setCharacterEncoding(String charset)
  7.   ServletOutputStream getOutputStream()throws IOException //获取输出字节流
  8.   PrintWriter getWriter()throws IOException //获取输出字符流

  ⑦Filter和FilterChain

  Filter过滤器可以用来过滤http请求和响应,使之调用特定servlet的service之前或之后执行特定的任务,如:

  1) Authentication Filters
  2) Logging and Auditing Filters
  3) Image
conversion Filters
  4) Data compression Filters
  5) Encryption Filters

  6) Tokenizing Filters
  7) Filters that trigger resource access events

  8) XSL/T filters
  9) Mime-type chain Filter

  1. <web-app>
  2. <filter>
  3. <filter-name>
  4. Basic Filter
  5. </filter-name>
  6. <filter-class>
  7. BasicFilter
  8. </filter-class>
  9. </filter>
  10. /*********************************/
  11. <filter-mapping>
  12. <filter-name>
  13. Basic Filter
  14. </filter-name>
  15. <servlet-name>
  16. FilteredServlet
  17. </servlet-name>
  18. </filter-mapping>
  19. /*********************************/
  20. <servlet>
  21. <servlet-name>
  22. FilteredServlet
  23. </servlet-name>
  24. </servlet>
  25. </web-app>
  1. void init(FilterConfig filterConfig)throws ServletException //初始化过滤器,其中config可以在web.xml这种配置文件中配置
  2. void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException
    //FilterChain是一条过滤器链,这个方法使之跳转到下一个Filter
  3. void destroy() //被容器调用,销毁这个filter

  ⑧其他

  其他接口或者对象是Listener、event、exception等,在整个生命周期里可以设计监听对象,用专门的事件来进行通知,按接口来就可以了,没什么好讲。

参考书籍和文章:

    java for the web with servlet,jsp and ejb

    深入Java Web技术内幕

---------------------------------------------------------------2017.06.11---------------------------------------------------------------

JavaWeb系列:Servlet的更多相关文章

  1. 06-码蚁JavaWeb之Servlet生命周期与基本配置

    学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...

  2. JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  3. JavaWeb之Servlet入门(二)

    1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...

  4. Spring mvc源码分析系列--Servlet的前世今生

    Spring mvc源码分析系列--Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列--前言挖了坑,但是由于最近需求繁忙,一直没有时间填坑.今天暂且来填一个小坑,这篇文章我们 ...

  5. JavaWeb学习--Servlet认识

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  6. IDEA新建javaWeb以及Servlet简单实现

    刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...

  7. Intellij IDEA创建javaWeb以及Servlet简单实现

    1.创建web工程 File --> New --> Project...

  8. javaweb之servlet 全解

    ①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...

  9. JavaWeb学习—Servlet

    1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...

随机推荐

  1. 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式

    前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...

  2. AOJ/数据结构习题集

    ALDS1_3_A-Stack. Description: Write a program which reads an expression in the Reverse Polish notati ...

  3. 【lucene系列学习二】Lucene实现高亮显示关键词

    首先,导入下图所示库 然后,import org.apache.lucene.search.highlight.*; 下面,我们新建一个实现高亮显示功能的函数 public static String ...

  4. 安装Vmware 以及 Vmware 中安装Ubuntu 以及其中问题?

    在vmware中安装ubuntu 过程中 安装窗口太小,无法继续下一步? 按住alt键,用鼠标拖动linux的安装窗体,向上移动就能看到下面的确定按钮. 如何安装Vmware-tools? 1.VM菜 ...

  5. Java设计模式随笔

    大家都知道Java23种设计模式,大神总结如下: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  6. UML总结(对九种图的认识和如何使用Rational Rose 画图)

    UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统设计时相当复杂的,当系统比较复杂时就会涉及到以下这几个问题: 开发人员如何与用户进行沟通来了解系统的需求? 开发人员之间如何沟通 ...

  7. C++ 元编程 —— 让编译器帮你写程序

    目录 1 C++ 中的元编程 1.1 什么是元编程 1.2 元编程在 C++ 中的位置 1.3 C++ 元编程的历史 2 元编程的语言支持 2.1 C++ 中的模板类型 2.2 C++ 中的模板参数 ...

  8. 关于删除数组中重复元素的lintcode代码

    时间自由度为o(n),空间自由度为o(1); class Solution {public:    /**     * @param A: a list of integers     * @retu ...

  9. MVC中的Ajax与增删改查

    自入手新项目以来,一直处于加班状态,博客也有两周没更,刚刚完成项目的两个模组,稍有喘息之机,写写关于项目中 的增删改查,这算是一个老生常谈的问题了,就连基本的教材书上都有.刚看书的时候,以为 没什么可 ...

  10. OpenCV探索之路(三):滤波操作

    滤波处理分为两大类:线性滤波和非线性滤波.OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法. 线性滤波:方框滤波.均值滤波.高斯滤波 方框滤波 #include<open ...