Tomcat 学习路线 roadmap 和个人入门知识摘录

本贴最后更新于 218 天前,其中的信息可能已经时移世改

roadmap

  • 参考《TOMCAT 与 JAVA WEB 开发技术详解 第 3 版》,内容非常非常详细,初期入门并不需要学习到那么详细,后面精进学习可按图索骥,或者有需要再看看就行

  • 第 1 章 Web 运作原理探析

    读者不妨带着以下问题去阅读本章开头的内容:
    ● 在整个 Web 体系中,浏览器和 Web 服务器各自的功能是什么?
    ● 浏览器和 Web 服务器采用 HTTP 协议进行通信,该协议规定了通信的哪些具体细节?
    本章接着介绍了 Web 的发展历程。
    ● 第一个阶段: 发布静态 HTML 文档。
    ● 第二个阶段:发布静态多媒体信息。
    ● 第三个阶段:提供浏览器端与用户的动态交互功能。
    ● 第四个阶段:提供服务器端与用户的动态交互功能。
    ● 第五个阶段:发布基于 Web 的应用程序,即 Web 应用。
    ● 第六个阶段:发布 Web 服务。
    ● 第七个阶段:先后推出 Web 2.0 以及 Web 3.0。Web 2.0 是全民共建的 Web,用户
    共同为 Web 提供丰富的内容。在 Web 3.0 中,网络为用户提供更智能、更个性化
    的服务。

    • 1.1 Web 的概念

      • Web 的概念如下:Web 是一种分布式应用架构,旨在共享分布在网络上的各个 Web 服 务器中所有互相连接的信息。采用客户/服务器(B/S 结构(Browser/Server))通信模式,客户与服务器之间用 HTTP 协议通信。Web 使用超级文本技术(HTML) 来连接网络上的信息。信息存放在服务器端, 客户机通过浏览器(例如 IE 或 Chrome)就可以查找网络中各个 Web 服务器上的信息。
        image
      • 概念 WWW(World Wide Web)是指全球范围内的 Web
    • 1.2 HTML 简介

      • HTML ( Hyper Text Markup Language) 是指超文本标记语言。
    • 1.3 URL 简介

    • 1.4 HTTP 简介

      • 1.4.1 HTTP 请求格式

        • HTTP 规定,HTTP 请求由如下 3 部分构成:
          • 请求方法、URI 和 HTTP 的版本。
          • 请求头 ( RequestHeader)。
          • 请求正文 (RequestContent)。
          image

          POST /hello.jsp HTTP/1.1   // HTTP 请求的第一行包括请求方式、URI 和协议版本这 3 项内容,以空格分开
          // “POST”为请求方式,“/hello.jsp”为 URI,“HTTP/1.1" 为 HTTP 的 版本
          Accept: image/gifz, image/jpeg, */*
          Referer: http://localhost/login.htm
          Accept-Language: enz,zh-cn;q=0.5   // 浏览器所用的语言
          Content-Type: application/x-www-form-urlencoded   // 正文类型
          Accept-Encoding: gzip, deflate
          User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64;   //浏览器类型
                   Trident/7.0; rv:11.0) like Gecko
          Host: localhost   // 远程主机
          Content-Length: 40   // 正文长度
          Connection: Keep-Alive
          Cache-Control: no-cache
          
          username=Tom&password=1234&submit=submit   //上面空行必须,HTTP 规定,请求头和请求正文之间必须以空行分隔 (即只有 CRLF 符号的行,(Carriage Return Linefeed ) 是指回车符和行结束符 " \r\n),这个空行非常重要
          
        • 在以上代码中,“POST”为请求方式,“/hello.jsp”为 URI 统一资源定位符 (UniversalResource Identifier, URI) 用于标记要访问的网络资源。,“HTTP/1.1" 为 HTTP 的 版本

          HTTP 请求可以使用多种方式,主要包括以下几种。 • GET:这种请求方式最为常见,客户程序通过这种请求方式访问服务器上的一个文 档,服务器把文档发送给客户程序。 • POST: 客户程序可以通过这种方式发送大量信息给服务器。在 HTTP 请求中除了 包含要访问的文档的 URI,还包括大量的请求正文,这些请求正文中通常会包含 HTML 表单数据。 • HEAD: 客户程序和服务器之间交流一些内部数据,服务器不会返回具体的文档。 当使用 GET 和 POST 方法时,服务器最后都将特定的文档返回给客户程序。而 HEAD 请求方式则不同,它仅仅交流一些内部数据,这些数据不会影响用户浏览网 页的过程,可以说对用户是透明的。HEAD 请求方式通常不单独使用,而是对其他 请求方式起辅助作用。一些搜索引擎使用 HEAD 请求方式来获得网页的标志信息, 还有一些 HTTP 服务器进行安全认证时,用这个方式来传递认证信息。 • PUT: 客户程序通过这种方式把文档上传给服务器。 • DELETE:客户程序通过这种方式来删除远程服务器上的某个文档。客户程序可以 利用 PUT 和 DELETE 请求方式来管理远程服务器上的文档。PUT 和 DELETE 请求方式并不常用,因此不少 HTTP 服务器并不支持 PUT 和 DELETE 请求方式

      • 1.4.2 HTTP 响应的格式

        • 和 HTTP 请求相似,HTTP 响应也由 3 部分构成,分别是:
          • HTTP 的版本、状态代码和描述。
          • 响应头 (ResponseHeader)。
          • 响应正文 (ResponseContent)。
          image

          HTTP/1.1 200 OK   //服务器使用的HTTP 的版本、状态代码,以及对状态代码的描述
          Server: Apache-Coyote/1.1   // 服务器类型
          Content-type: text/html; charset=GBK   // 正文类型
          Content-length: 102   // 正文长度
          
          <html> // HTTP 请求头与请求正文之间必须用空行分隔,同样,HTTP 响应头与响应正文之间也必须用空行分隔
          <head>
          	<title>HelloWorld</title>
          </head>
          <body >
          	<hl>hello</hl>
          </body>
          </html>
          

          状态代码是一个 3 位整数,以 1、2、3、‘4 或 5 开头: • 1xx: 信息提示,表示临时的响应。 • 2xx: 响应成功,表明服务器成功地接收了客户端请求。 • 3XX: 重定向。 • 4xx: 客户端错误,表明客户端可能有问题。 • 5xx: 服务器错误,表明服务器由于遇到某种错误而不能响应客户请求。 以下是一些常见的状态代码: • 200: 响应成功。 • 400: 错误的请求。客户发送的 HTTP 请求不正确。 • 404: 文件不存在。在服务器上没有客户要求访问的文档。 • 405: 服务器不支持客户的请求方式。 • 500: 服务器内部错误。

      • 1.4.3 正文部分的 MIME 类型

        • HTTP 请求以及响应的正文部分可以是任意格式的数据,如何保证接收方能“看懂”发 送方发送的正文数据呢?HTTP 采用 MIME 协议来规范正文的数据格式。MIME 协议由 W3C 组织制定,RFC2045 文档( http://www.ietf.org/rfc/rfc2045.txt)对 MIME 协议做了详细阐述。MIME (Multipurpose Internet Mail Extension) 是指多用途网络邮件扩展 协议,这里的邮件不单纯地指 E-Maib 还可以包括通过各种应用层协议在网络上传输的数据。 因此,也可以将 HTTP 中的请求正文和响应正文看作邮件。MIME 规定了邮件的标准数据格 式,从而使得接收方能“看懂”发送方发送的邮件。 遵守 MIME 协议的数据类型统称为 MIME 类型。在 HTTP 请求头和 HTTP 响应头中都 有一个 Content-type 项,用来指定请求正文部分或响应正文部分的 MIME 类型。表 1-2 列出 了常见的 MIME 类型与文件扩展名之间的对应关系。

          image

      • 1.4.4 HTTP 各个版本的特点

        • HTTP/1.1(1999):持久 TCP 连接(Keep-Alive)、管道机制、更多请求如 PUT 和 DELETE、缺点按照先后顺序来处理 HTTP 请求会导致堵塞
        • HTTP/2.0(2015):二进制协议、多路复用、头部信息压缩、推送、请求优先级和安全
    • 1.5 用 Java 套接字创建 HTTP 客户与服务器程序

      • 1.5.1 演示异构系统之间用 HTTP 协议通信

        如例 HTTPServer 类实现了一个简单的 HTTP 服务器,它接收客户程序发出的 HTTP 请求,把它打印到控制台,然后解析 HTTP 请求,并向客户端发回相应的 HTTP 响应。

        package server;
        import java.io.*;
        import java.net.*;
        
        public class HTTPServer{
          public static void main(String args[]) {
            int port;
            ServerSocket serverSocket;
        
            try { 
               port = Integer.parseInt(args[0]);
             }catch (Exception e) {
               System.out.println("port = 8080 (默认)");
               port = 8080; //默认端口为8080
             }
        
             try{
               serverSocket = new ServerSocket(port); 
               System.out.println("服务器正在监听端口:" 
                             + serverSocket.getLocalPort());
        
               while(true) { //服务器在一个无限循环中不断接收来自客户的TCP连接请求
                 try{
                   //等待客户的TCP连接请求
                   final Socket socket = serverSocket.accept(); 
                   System.out.println("建立了与客户的一个新的TCP连接,"
                        +"该客户的地址为:"
                        +socket.getInetAddress()+":" + socket.getPort());
        
                   service(socket);  //响应客户请求
                }catch(Exception e){
                  System.out.println("客户端请求的资源不存在");} 
              } //#while
            }catch (Exception e) {e.printStackTrace();}
          }
        
          /** 响应客户的HTTP请求 */
          public static void service(Socket socket)throws Exception{
        
            /*读取HTTP请求信息*/
            InputStream socketIn=socket.getInputStream(); //获得输入流
            Thread.sleep(500);  //睡眠500毫秒,等待HTTP请求  
            int size=socketIn.available();
            byte[] buffer=new byte[size];
            socketIn.read(buffer);
            String request=new String(buffer);
            System.out.println(request); //打印HTTP请求数据
        
            /*解析HTTP请求*/
            //获得HTTP请求的第一行
            int endIndex=request.indexOf("\r\n");
            if(endIndex==-1)
              endIndex=request.length();
            String firstLineOfRequest=
                       request.substring(0,endIndex);
        
            //解析HTTP请求的第一行 
            String[] parts=firstLineOfRequest.split(" "); 
            String uri="";
            if(parts.length>=2)
              uri=parts[1]; //获得HTTP请求中的uri    
        
            /*决定HTTP响应正文的类型,此处作了简化处理*/
            String contentType;
            if(uri.indexOf("html")!=-1 || uri.indexOf("htm")!=-1)
              contentType="text/html";
            else if(uri.indexOf("jpg")!=-1 || uri.indexOf("jpeg")!=-1)
              contentType="image/jpeg";
            else if(uri.indexOf("gif")!=-1) 
              contentType="image/gif";
            else
              contentType="application/octet-stream";  //字节流类型
        
        
            /*创建HTTP响应结果 */
            //HTTP响应的第一行
            String responseFirstLine="HTTP/1.1 200 OK\r\n";
            //HTTP响应头
            String responseHeader="Content-Type:"+contentType+"\r\n\r\n";
            //获得读取响应正文数据的输入流
            InputStream in=HTTPServer
                             .class
                             .getResourceAsStream("root/"+uri);
        
            /*发送HTTP响应结果 */
            OutputStream socketOut=socket.getOutputStream(); //获得输出流
            //发送HTTP响应的第一行
            socketOut.write(responseFirstLine.getBytes());
            //发送HTTP响应的头
            socketOut.write(responseHeader.getBytes());
            //发送HTTP响应的正文
            int len=0;
            buffer=new byte[128];
            while((len=in.read(buffer))!=-1)
            socketOut.write(buffer,0,len);  
        
            Thread.sleep(1000);  //睡眠1秒,等待客户接收HTTP响应结果        
            socket.close(); //关闭TCP连接  
           }
        }
        

        下例 HTTPClient 类是一个简单的 HTTP 客户程序,它以 GET 方式向 HTTP 服务 器发送 HTTP 请求,然后把接收到的 HTTP 响应结果打印到控制台。

        package client;
        import java.net.*;
        import java.io.*;
        import java.util.*;
        
        public class HTTPClient {
          public static void main(String args[]){
            //确定HTTP请求的uri
            String uri="index.htm";
            if(args.length !=0)uri=args[0]; 
        
            doGet("localhost",8080,uri); //按照GET请求方式访问HTTPServer 
          }
        
          /** 按照GET请求方式访问HTTPServer */
          public static void doGet(String host,int port,String uri){
            Socket socket=null;
        
            try{
              socket=new Socket(host,port); //与HTTPServer建立FTP连接
            }catch(Exception e){e.printStackTrace();}
        
            try{
              /*创建HTTP请求 */
              StringBuffer sb=new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
              sb.append("Accept: */*\r\n");
              sb.append("Accept-Language: zh-cn\r\n");
              sb.append("Accept-Encoding: gzip, deflate\r\n");
              sb.append("User-Agent: HTTPClient\r\n");
              sb.append("Host: localhost:8080\r\n");
              sb.append("Connection: Keep-Alive\r\n\r\n");
        
              /*发送HTTP请求*/
              OutputStream socketOut=socket.getOutputStream(); //获得输出流  
              socketOut.write(sb.toString().getBytes());
        
              Thread.sleep(2000); //睡眠2秒,等待响应结果
        
              /*接收响应结果*/
              InputStream socketIn=socket.getInputStream(); //获得输入流
              int size=socketIn.available();
              byte[] buffer=new byte[size];
              socketIn.read(buffer);
              System.out.println(new String(buffer)); //打印响应结果
        
            }catch(Exception e){ 
              e.printStackTrace();
            }finally{
              try{
                socket.close();  
              }catch(Exception e){e.printStackTrace();}
            }
          } //#doGet()
        }
        
        • HTTP 客户程序和服务器分别按 4 种方式运行 HTTP 服务器和客户程序
          image
          (1) HTTPClient 客户程序访问 HTTPServer 程序
          image
          (2)浏览器访问 HTTPServer 程序
          image
          (3)HTTPClient 客户程序访问 Tomcat 服务器
          (4)浏览器访问 Tomcat 服务器
          image
      • 1.5.2 演示对网页中超链接的处理过程

        image

        用鼠标单击超链接 "hellol.htm(纯文本网页)”,此时浏览器会再次与 HTTPServer 建立 TCP 连接,然后发出一个要求访问“hellol.htm”文件的 HTTP 请求。

      • 1.5.3 演示对网页中图片的处理过程
        image

        在浏览器中输入指向 hello2.htm 文件的 URL 时,浏览器先向 HTTPServer 请求访 问 hello2.htm 文件,浏览器接收到该文件的数据后,再对其解析。在解析文件中的 <img> 标 记时,会根据 <img> 标记的 src 属性的值,再次向 HTTPServer 发出一个要求访问 bird.gif 文 件的 HTTP 请求,HTTPServer 把本地文件系统中 bird.gif 文件的数据发送给浏览器,浏览器 再把它在自己的窗口中展示出来。观察 HTTPServer 端的打印结果,就可以看到浏览器与服务器建立了两次 FTP 连接, 并且浏览器发送了两个 HTTP 请求,这两个 HTTP 请求分别请求访问 hello2.htm 和 bird.gif 文件。

    • 1.6 Web 的发展历程(不分先后顺序)
      ● 第一个阶段:发布静态 HTML 文档。
      ● 第二个阶段:发布静态多媒体信息。
      ● 第三个阶段:提供浏览器端与用户的动态交互功能。
      ● 第四个阶段:提供服务器端与用户的动态交互功能。
      ● 第五个阶段: 发布基于 Web 的应用程序,即 Web 应用。
      ● 第六个阶段:发布 Web 服务。
      ● 第七个阶段:先后推出 Web 2.0 和 Web 3.0,使得广大用户都可以为 Web 提供丰富的内容,而 Web 为用户提供更加便捷和智能的服务。

      • 1.6.1 发布静态 HTML 文档

      • 1.6.2 发布静态多媒体信息

      • 1.6.3 提供浏览器端与用户的动态交互功能

        到了本阶 段,用户不仅可以通过浏览器浏览信息,还可以与浏览器进行交互,当用户在浏览器端输入指向该类的 URL 时,Web 服务器就会运行 HelloServlet 类,HelioServlet 类生成 HTML 文档(相当于动态生成),并把它发送给浏览器。JavaScript 脚本使得用户与浏览器之间可以进行简单的动态交互。 浏览器能够响应用户单击鼠标的操作,动态切换待展示的图片。
        image

      • 1.6.4 提供服务器端与用户的动态交互功能
        前面的三个阶段的技术发展点都是在客户端,而对 Web 服务器端都没有做 特别要求。到了本阶段,Web 服务器端增加了动态执行特定程序代码的功能,这使得 Web 服务器能利用特定程序代码来动态生成 HTML 文档。第一种方式:完全用编程语言编写的程序,例如 CGI(Common Gateway Interface) 程序和用 Java 编写的 Servlet 程序。第二种方式:嵌入了程序代码的 HTML 文档,如 PHP、ASP 和 JSP 文档。JSP 文 档是指嵌入了 Java 程序代码的 HTML 文档。
        image

      • 1.6.5 发布 Web 应用
        本阶段是在上一个阶段的基础上进一步发展起来的。Web 服务器端可以动态执行程序的 功能变得越来越强大,不仅能动态地生成 HTML 文档,而且能处理各种应用领域里的业务 逻辑,还能访问数据库。Web 逐渐被运用到电子财务、电子商务和电子政务等各个领域。随着 Web 应用的规模越来越大,对软件的可维护性和可重用性的要求也越来越高。一 些针对 Web 应用的设计模 式以及 框架软件应运而生。例如 模型一视图一控制器 ( Model-View-Controller, MVC) 设计模式被用到 Java Web 应用的开发中。
        image

      • 1.6.6 发布 Web 服务

        什么是 Web 服务呢?简单地理解,Web 服务可看作是被客户端远程调用的各种方法,这些方法能处理特定业务逻辑或者进行复杂的运算等。如图 演示了客户端 请求访问服务器端的一个 Web 服务的过程。
        image
        Web 服务架构采用简单对象访问协议 (Simple Object Access Protocol, SOAP) 作为通信 协议。SOAP 规定客户与服务器之间一律用 XML 语言进行通信。可扩展标记语言(Extensible Markup Language, XML) 是一种可扩展的跨平台的标记语言。SOAP 规定了客户端向服务 器端发送的 Web 服务请求的具体数据格式,以及服务器端向客户端发送的 Web 服务响应结 果的具体数据格式。
        image
        要建立 Web 服务架构,需要开发基于 SOAP 的服务器来发布、调用和响应 Web 服务,以及创建客户端程序来请求这些服务。全球范围内部署 Web 服务需要大量服务器,这在资源和时间上都是巨大挑战。然而,由于 Web 在 2000 年 Web 服务概念出现时已广泛普及,这为 Web 服务的快速传播提供了便利。
        image

      • 1.6.7 Web 2.0: 全民共建的 Web
        在 Web 1.0 中,广大用户主要是 Web 提供的信息的消费者,用户通过浏览器来获取信息。而 Web 2.0 则强调全民织网,发动广大民众来共同为 Web 提供信息来源。Web 2.0 注重用户与 Web 的交 互,用户既是 Web 信息的消费者(浏览者),也是 Web 信息的制造者。如:Blog(博客)、站点摘要(Really Simple Syndication, RSS)、WIKI(百科全书)、社交网络软件(SocialNetwork Sofwaret, SNS)、即时通讯(Instant Messenger)

      • 1.6.8 Web3.0: 智能化处理海量信息
        在 Web 3.0 中,信息变得海量化,人人都参与发布信息,这导致信息质量参差不齐。信 息发布平台提供者必须能对各种信息进行过滤,智能地为用户提供有用的信息,避免用户浪 费大量时间去处理无用的信息。涉及以下技术的流行和发展: • 以博客技术为代表,围绕网民互动及个性体验的互联网应用技术得到完善和发展。 • 虚拟货币得到普及,以及虚拟货币的兑换成为现实。 • 大家开始认同网络财富,并发展出安全的网络财务解决方案。 • 互联网应用变得更加细分、专业和兼容,网络信息内容的管理将由专业的内容管理商来负责。

    • 1.7 处理 HTTP 请求参数以及 HTML 表单
      在 POST 方式下,浏览器也会把 HTML 表单数据作为请求 参数来处理,只不过此时请求参数位于 HTTP 请求的正文部分;而在 GET 方式下,请求参数则紧跟 HTTP 请求的第一行的 URI 后面
      image
      image

    • 1.8 客户端向服务器端上传文件
      image
      单击网页中的【upload]按钮,浏览 器会向 HTTPServerl 发送一个包含 FromClient.txt 文件数据的 HTTP 请求,HTTPServerl 收到该 HTTP 请求后,会将其打印出来, 内容如下:
      image

      POST /servlet/UploadServlet HTTP/1.1
      Accept: image/gif, image/jpeg, */*
      Referer: http://localhost:8080/hello6.htm
      Accept-Language: zh-cn
      Content-Type: multipart/form-data; boundary=----------d82d9a20188   
      //以上HTTP请求的正文部分为复合类型,包含两个子部分:文件部分和提交按钮部分。浏览器会随机产生一个字符串形式的边界 (boundary), 上面代码(Content-Type)设定了边界的取值
      ···
      Cookie: style=default
      
      ----------7d82d9a20188
      Content-Disposition:form-data;name="filedatan";
      				filename="C:\client\FromClient.txt"
      Content-Type: text/plain
      
      Datal in FromClient.txt
      Data2 in FromClient.txt
      Data3 in FromClient.txt
      Data4 in FromClient.txt
      ----------7d82d9a20188
      Content-Disposition: form-data; name="submit"
      
      upload
      ----------7d82d9a20188-
      

      image
      image
      UploadServlet 在处理文件部分的正文部分时,把它按照字节流而不是字符串流写到本地 文件中,因此会把客户端的 FromClient.rar 文件中的数据准确无误地保存到服务器端的文件系统中。
      image

    • 1.9 小结

    • 1.10 思考题

  • 第 2 章 Tomcat 简介
    Web 应用Web 服务器来发布和运行,以可交互的 HTML 网页作为客户端界面由浏览器来展示。浏览器与 Web 服务器之间的远程数据交换遵循 HTTP 协议。由一个中介方制定 Web 应用与 Web 服务器进行协作的标准接口,Servlet 就是其中最主要的一个接口。中介方规定: • Web 服务器可以访问任意一个 Web 应用中所有实现 Servlet 接口的类。 • Web 应用中用于被 Web 服务器动态调用的程序代码位于 Servlet 接口的实现类中。
    image
    Oracle 公司制定了 Web 应用与 Web 服务器进行协作的一系列标准 Java 接口(统称为 Java Servlet API),这一系列标准 Java 接口和规约统称为 Servlet 规范。Servlet 规范的官方网址为: https://www.oracle.com/technetwork/java/javaee/documentation/index.html
    由 Apache 开源软件组织创建的 Tomcat 是一个符合 Servlet 规范的优秀 Servlet 容器。以 下图 2-2 演示了 Tomcat 与 Java Web 应用之间通过 Servlet 接口来协作的过程。
    image

    • 2.1 Tomcat 概述
      Tomcat 是在 Oracle 公司的 JSWDK(JavaServer Web DevelopmentKit, 是 Oracle 公司推 出的小型 Servlet/JSP 调试工具)的基础上发展起来的一个优秀的 Servlet 容器,Tomcat 本身 完全用 Java 语言编写。可以从 Tomcat 的官方网址(http://tomcat.apache.org)来获取关于 Tomcat 的最新信息。

    • 2.2 Tomcat 作为 Servlet 容器的基本功能
      Servlet 是一种运行在服务器上的小插件。Servlet 最常见的用途是扩展 Web 服务器的功能,可作为非常安全的、可移植的、易于使用的 CGI 替代品。具有以下 特点: • 提供了可被服务器动态加载并执行的程序代码,为来自客户的请求提供相应服务。 • Servlet 完全用 Java 语言编写,因此要求运行 Servlet 的服务器必须支持 Java 语言。 • Servlet 完全在服务器端运行,因此它的运行不依赖于浏览器。不管浏览器是否支持 Java 语言, 都能请求访问服务器端的 Servlet
      Tomcat 作为运行 Servlet 的容器,其基本功能是负责接收和解析来自客 户的请求,把客户的请求传送给相应的 Servlet, 并把 Servlet 的响应结果返回给客户。
      image
      Servlet 规范规定,Servlet 容器响应客户请求访问特定 Servlet 的流程 如下:
      (1)客户发出要求访问特定 Servlet 的请求。
      (2)Servlet 容器接收到客户请求,对其解析。
      (3)Servlet 容器创建一个 ServletRequest 对象,在 ServletRequest 对象中包含了客户请求信息以及其他关于客户的相关信息,如请求头、请求正文,以及客户机的 IP 地址等。
      (4)Servlet 容器创建一个 ServletResponse 对象。
      (5)Servlet 容器调用客户所请求的 Servlet 的 service ()服务方法,并且把 ServletRequest 对象和 ServletResponse 对象作为参数传给该服务方法。
      (6)Servlet 从 ServletRequest 对象中可获得客户的请求信息。
      (7)Servlet 利用 ServletResponse 对象来生成响应结果。
      (8)Servlet 容器把 Servlet 生成的响应结果发送给客户。

    • 2.3 Tomcat 的组成结构
      Tomcat 本身由一系列可配置的组件构成,其中核心组件是 Servlet 容器组件,它是所有 其他 Tomcat 组件的顶层容器,用 <CATALINA_HOME> 表示 Tomcat 的安装根目录。Tomcat 的各个组件可以在/conf7server.xml 文件中进行配 置,每个 Tomcat 组件在 server.xml 文件中对应一种配置元素。以下代码以 XML 的形式展示 了各种 Tomcat 组件之间的关系:

      	<Server>
      		<Service>
      			<Connector />
      			<Engine>
      				<Host>
      					<Context>
      					</Context>
      				</Host>
      			</Engine>
      		</Service>
      	</Server>
      

      在以上 XML 代码中,每个元素都代表一种 Tomcat 组件。这些元素可分为四类:
      • 顶层类元素 包括〈Server〉元素和元素,它们位于整个配置文件的顶层。
      • 连接器类元素 为〈Connector〉元素,代表介于客户与服务器之间的通信接口,负责将客户的请求发送 给服务器,并将服务器的响应结果发送给客户。
      • 容器类元素,代表处理客户请求并生成响应结果的组件,有四种容器类元素,分别为〈Engine〉、、 和元素。Engine 组件为特定的 Service 组 件处理所有客户请求, Host 组件为特定的虚拟主机处理所有客户请求,Context 组件为特定的 Web 应用处理所有客 户请求。Cluster 组件负责为 Tomcat 集群系统进行会话复制、Context 组件的属性的复制,以 及集群范围内 WAR 文件的发布。本书第 26 章的 26.5 节(Tomat 集群)对配置 Tomcat 集群 系统做了进一步介绍。
      • 嵌套类元素 代表可以嵌入到容器中的组件,如元素和元素等,这些元素的作用将在 后面的章节做介绍

      Tomcat 的组成结构是由 自身的实现决定的,与 Servlet 规 范无关。不同的服务器开发商可以用不同的方 式来实现符合 Servlet 规范的 Servlet 容器。

      下面,再对一些基本的 Tomcat 元素进行介绍。具体属性,可以 参照本书附录 A(server.xml 文件):
      • 元素 〈Server〉元素代表整个 Servlet 容器组件,它是 Tomcat 的顶层元素。〈Server〉元素中可 包含一个或多个元素。
      • 元素 <Service> 元素中包含一'个 <Engine> 元素,以及一个或多个 <(201111© 以 01> 元素,这些 <Connector> 元素共享同一个 <Engine> 元素
      • <Connector> 元素 <Connector> 元素代表和客户程序实际交互的组件,它负责接收客户请求,以及向客户 返回响应结果。
      • <Engine> 元素 每个 <Service> 元素只能包含一个〈Engine〉元素。<Engine> 元素处理在同一个 <Service> 中所有 <Connector> 元素接收到的客户请求。
      • <Host> 元素 一个〈Engine〉元素中可以包含多个 <Host> 元素。每个 <Host> 元素定义了一个虚拟主机, 它可以包含一个或多个 Web 应用。
      • <Context> 元素 <Context> 元素是使用最频繁的元素。每个 <Context> 元素代表了运行在虚拟主机上的单 个 Web 应用。一个 <Host> 元素中可以包含多个 <Context> 元素。
      image
      image

    • 2.4 Tomcat 的工作模式
      Tomcat 作为 Servlet 容器,有以下三种工作模式

      • (1) 独立的 Servlet 容器
        在这种模式下,Tomcat 是一个独立运行的 Java 程序。和运行其他 Java 程序一样,运行 Tomcat 需要启动一个 Java 虚拟机(JVM.Java Virtual Machine)进程,由该进程来运行 Tomcat
        image
      • (2) 其他 Web 服务器进程内的 Servlet 容器
        这种模式下,Tomcat 分为 Web 服务器插件和 Servlet 容器组件两部分。Web 服务器插件在其他 Web 服务器进程的内部地址空间启动一个 Java 虚拟机,Servlet 容器组件在此 Java 虚拟机中运行。如有客户端发出调用 Servlet 的请求,Web 服务器插件获得对此请求的控制并将它转发 (使用 JNI 通信机制) 给 Servlet 容器组件。
        image
      • (3)其他 Web 服务器进程外的 Servlet 容器
        在这种模式下,Tomcat 分为 Web 服务器插件和 Servlet 容器组件两部分。如图 2-9 所示, Web 服务器插件在其他 Web 服务器的外部地址空间启动一个 Java 虚拟机进程,Servlet 容器 组件在此 Java 虚拟机中运行。如有客户端发出调用 Servlet 的请求,Web 服务器插件获得对 此请求的控制并将它转发(采用 IPC 通信机制)给 Servlet 容器。
        image

      从 Tomcat 的三种工作模式可以看出,当 Tomcat 作为独立的 Servlet 容器来运行时,此 时 Tomcat 是能运行 Java Servlet 的独立 Web 服务器。此外,Tomcat 还可作为其他 Web 服务 器进程内或者进程外的 Servlet 容器,从而与其他 Web 服务器集成(如 Apache 和 IIS 服务 器等)。集成的意义在于:对于不支持运行 Java Servlet 的其他 Web 服务器,可通过集成 Tomcat 来提供运行 Servlet 的功能。第 26 章将进一步介绍 Tomcat 和其他 Web 服务器的 集成方法。

    • 2.5 Tomcat 的版本

      • Tomcat 9.x 是目前比较稳定和成熟的版本建立在 Tomcat 8.x 的基础上,前者实现了 Servlet 4.0 和 JSP2.3 规范。此外, 它还提供了如下新特性: • 支持 HTTP/2 协议。 • 使用 OpenSSL(Open Secure Socket Layer, 开放安全套接字层密码库)来支持 TLS (Transport Layer Security, 安全传输层协议),在实现中使用了 JSSE(Java Secure Socket Extension, Java 安全套接字扩展)连接器。 • 支持 TLS 虚拟主机。
      • Tomcat 8.x 建立在 Tomcat 7.x 的基础上,前者实现了 Servlet 3.1 和 JSP 2.3 规范。此外, 它还提供了如下新特性: • 采用单个公共资源的实现机制,来替代早期版本中提供多个可扩展资源的特征。 • Tomcat 8.5.x 实现了 JASPIC1.1(Java Authentication Service Provider, Java 认证服务 提供者接口)规范。
      • Tomcat 7.x 建立在 Tomcat 6.x 的基础上,前者实现了 Servlet 3.0 和 JSP 2.3 规范,此外, 它还提供了如下新特性: • 针对 Web 应用的内存泄漏,进行检测和预防。 • 提高了 Tomcat 自带的两个 Web 应用的安全性能,该自带的两个 Web 应用分别是 Tomcat 的控制平台和管理平台,参见本书第 24 章(Tomcat 的控制平台和管理平台)。 • 采取安全措施,防止 CSRF(Cross-Site Request Forgery, 跨站请求伪造)攻击网站。 • 允许在 Web 应用中直接包含外部内容。 • 重构连接器,对 Tomcat 内部实现代码进行清理和优化。
      • Tomcat 6.x 是基于 Tomcat 5.5.x 的升级版本,前者实现了 Servlet 2.5 和 JSP 2.1 规范。此 外,它还提供了如下新特性: • 优化对内存的使用。 • 先进的 IO(输入输出)功能,利用 JDK 的 java.nio 包中的接口与类来提高输入输 出的性能,并且增加了对异步通信的支持。 • 对 Tomcat 服务器的集群功能进行了重建。
      • Tomcat 5.5.x.与 Tomcat 5.0.x 一样支持 Servlet 2.4 和 JSP 2.0 规范。此外,在其底层实现 中,Tomcat 5.5.x 在原有版本的基础上进行了巨大改动。这些改动大大提高了服务器的运行 性能和稳定性,并且降低了运行服务器的成本
      • Tomcat 5.0.x 在 Tomcat 4.1 的基础上做了许多扩展和改进,它提供的新功能和新特性 包括: • 对服务器性能进一步优化,提高垃圾回收的效率。 • 采用 JMX 技术来监控服务器的运行。 • 提高了服务器的可扩展性和可靠性。 • 增强了对标签库(Tag Library)的支持。 • 利用 Windows wrapper 和 UNIX wrapper 技术改进了与操作系统平台的集成。 • 采用 JMX 技术来实现嵌入式的 Tomcat o • 提供了更完善的 Tomcat 文档
      • Tomcat 4.1.x 是 Tomcat 4.0.x 的升级版本。Tomcat 4.0.x 完全废弃了 Tomcat 3.x 的架构, 采用新的体系结构实现了 Servlet 容器。Tomcat 4.1.x 在 Tomcat 4.0.x 的基础上又进一步升级, 它提供的新功能和新特性包括: • 基于 JMX 的管理控制功能。 • 实现了新的 Coyote Connector(支持 HTTP/1.1,AJP 1.3 和 JNI)。 • 重写了 Jasper JSP 编译器。 • 提高了 Web 管理应用与开发工具的集成。 • 提供客户化的 Ant 任务,使 Ant 程序根据 build.xml 脚本直接和 Web 管理应用交互。
    • 2.6 安装和配置 Tomcat 所需的资源

    • 2.7 安装 Tomcat

    • 2.8 启动 Tomcat 并测试 Tomcat 的安装

    • 2.9 Tomcat 的运行脚本

    • 2.10 小结

    • 2.11 思考题

  • 第 3 章 第一个 Java Web 应用

    • 3.1 Java Web 应用简介
      Java Web 应用由一组 Servlet/JSP、HTML 文件、相关 Java 类,以及其他可以被绑定的资源构成。它可以在由各种 供应商提供的符合 Servlet 规范的 Servlet 容器中运行。在 Java Web 应用中可以包含如下内容:
      • Servlet 组件 标准 Servlet 接口的实现类,运行在服务器端,包含了被 Servlet 容器动态调用的程序 代码。
      • JSP 组件 包含 Java 程序代码的 HTML 文档。运行在服务器端,当客户端请求访问 JSP 文件时,Servlet 容器先把它编译成 Servlet 类,然后动态调用它的程序代码
      • 相关的 Java 类 开发人员自定义的与 Web 应用相关的 Java 类。
      • 静态文档 存放在服务器端的文件系统中,如 HTML 文件、图片文件和声音文件等。当客户端请求访 问这些文件时,Servlet 容器从本地文件系统中读取这些文件的数据,再把它发送到客户端。
      • 客户端脚本程序 是由客户端来运行的程序,JavaScript 是典型的客户端脚本程序,第 1 章的 163 节 (提供浏览器端与用户的动态交互功能)己经介绍了它的运行机制。
      • web.xml 文件 Java Web 应用的配置文件,该文件采用 XML 格式。该文件必须位于 Web 应用的 WEB-INF 子目录下。

    • 3.2 创建 Java Web 应用
      Servlet 规范规定,Java Web 应用必须采用 固定的目录结构,每种类型的组件在 Web 应用中都有固定的存放目录。Servlet 规范还规定, Java Web 应用的配置信息存放在 WEB-INF/web.xml 文件中,Servlet 容器从该文件中读取配 置信息。在发布某些 Web 组件(如 Servlet)时,需要在 web.xml 文件中添加相应的关于这 些 Web 组件的配置信息

      • 3.2.1 Java Web 应用的目录结构
        假定开发一个名为 helloapp 的 Java Web 应用。首 先,应该创建这个 Web 应用的目录结构,参见表 3-1
        image
        在 WEB-INF 目录的 classes 以及 lib 子目录下,都可以存放 Java 类 文件。在运行时,Servlet 容器的类加载器先加载 classes 目录下的类,再加载 lib 目录下的 JAR 文件(Java 类库的打包文件)中的类。因此,如果两个目录下存在同名的类,classes 目录下 的类具有优先权。另外,浏览器端不可以直接请求访问 WEB-INF 目录下的文件,这些文件 只能被服务器端的组件访问。
        image
        图 3-1 中有一个 src 目录,这是在开发 helloapp 应用阶段,开发人员自定义的目录,该 目录用来存放所有 Java 类的源文件。到了 Web 应用产品正式发布阶段,一般都不希望对外 公开 Java 源代码,所以届时应该将 src 目录转移到其他地方。 在 helloapp 应用中包含如下组件。
        • HTML 组件:login.htm
        • Servlet 组件:DispatcherServlet 类
        • JSP 组件: hello.jsp
        这些组件之间的关系如图 3-2 所示。login.htm 与 DispatcherServlet 类之间为超级链接关 系,DispatcherServlet 类与 hello.jsp 之间为请求转发关系,本书第 5 章的 5.6.1 节(请求转发) 对 Web 组件之间的请求转发关系做了深入介绍。
        image
      • 3.2.2 创建 HTML 文件
      • 3.2.3 创建 Servlet 类
      • 3.2.4 创建 JSP 文件
      • 3.2.5 创建 web.xml 文件
    • 3.3 在 Tomcat 中发布 Java Web 应用
      发布的具体细节依赖于 Tomcat 本身的实现,但是以下关 于发布 Java Web 应用的基本思想适用于所有 Servlet 容器:
      • 把 Web 应用的所有文件复制到 Servlet 容器的特定目录下,这是发布 Web 应用的最 快捷的一种方式。
      • 各种 Servlet 容器实现都会从 Web 应用的 web.xml 配置文件中读取有关 Web 组件的 配置信息。
      • 为了使用户能更加灵活自如地控制 Servlet 容器发布和运行 Web 应用的行为,并且 为了使 Servlet 容器与 Web 应用能进行更紧密地协作,许多 Servlet 容器还允许用户 使用额外的配置文件及配置元素,这些配置文件及配置元素的语法由 Servlet 容器 的实现决定,与 Oracle 公司的 Servlet 规范无关

      • 3.3.1 Tomcat 的目录结构
        Tomcat9.x 的目录结构参见 表 3-3, 表中的目录都是 <CATALINA_HOME> 的子目录。
        image
      • 3.3.2 按照默认方式发布 Java Web 应用
      • 3.3.3 Web 组件的 URL
      • 3.3.4 配置 Tomcat 的 元素
      • 3.3.5 配置 Tomcat 的虚拟主机
    • 3.4 创建、配置和使用自定义 JSP 标签

    • 3.5 用批处理文件或 ANT 编译范例

    • 3.6 小结

    • 3.7 思考题

  • 第 4 章 Servlet 技术(上)

    • 4.1 ServletAPI

      • 4.1.1 Servlet 接口
      • 4.1.2 GenericServlet 抽象类
      • 4.1.3 HttpServlet 抽象类
      • 4.1.4 ServletRequest 接口
      • 4.1.5 HttpServletRequest 接口
      • 4.1.6 ServletResponse 接口
      • 4.1.7 HttpServletResponse 接口
      • 4.1.8 ServletConfig 接口
      • 4.1.9 ServletContext 接口
    • 4.2 JavaWeb 应用的生命周期

      • 4.2.1 启动阶段
      • 4.2.2 运行时阶段
      • 4.2.3 终止阶段
      • 4.2.4 用 Tomcat 的管理平台管理 Web 应用的生命周期
    • 4.3 Servlet 的 生命周期

      • 4.3.1 初始化阶段
      • 4.3.2 运行时阶段
      • 4.3.3 销毁阶段
      • 4.3.4 演示 Servlet 的生命周期的范例
    • 4.4 ServletContext 与 Web 应用范围

      • 4.4.1 在 Web 应用范围内存放共享数据的范例
    • 4.5 Servlet 的服务方法抛出异常

    • 4.6 防止页面被客户端缓存

    • 4.7 使用 Annotation 标注配置 Servlet

    • 4.8 处理 HTTP 请求参数中的中文字符编码

    • 4.9 小结

    • 4.10 思考题

  • 第 5 章 Servlet 技术(下)

    • 5.1 下载文件

    • 5.2 上传文件

      • 5.2.1 利用 Apache 开源类库实现文件上传
      • 5.2.2 利用 ServletAPI 中的 Part 接口实现文件上传
    • 5.3 动态生成图像

    • 5.4 读写 Cookie

    • 5.5 访问 Web 应用的工作目录

    • 5.6 转发和包含

      • 5.6.1 请求转发
      • 5.6.2 包含
      • 5.6.3 请求范围
    • 5.7 重定向

    • 5.8 访问 Servlet 容器内的其他 Web 应用

    • 5.9 避免并发问题

      • 5.9.1 合理决定在 Servlet 中定义的变量的作用域类型
      • 5.9.2 使用 Java 同步机制对多线程同步
      • 5.9.3 被废弃的 SingleThreadModel 接口
    • 5.10 对客户请求的异步处理

      • 5.10.1 异步处理的流程
      • 5.10.2 异步处理的范例
      • 5.10.3 异步监听器
      • 5.10.4 非阻塞 I/O
      • 5.10.5 服务器端推送
    • 5.11 小结

    • 5.12 思考题

  • 第 6 章 JSP 技术

    • 6.1 比较 HTML、Servlet 和 JSP

      • 6.1.1 静态 HTML 文件
      • 6.1.2 用 Servlet 动态生成 HTML 页面
      • 6.1.3 用 JSP 动态生成 HTML 页面
    • 6.2 JSP 语法

      • 6.2.1 JSP 指令 (Directive)
      • 6.2.2 JSP 声明
      • 6.2.3 Java 程序片段 (Scriptlet)
      • 6.2.4 Java 表达式
      • 6.2.5 隐含对象
    • 6.3 JSP 的生命周期

    • 6.4 请求转发

    • 6.5 包含

      • 6.5.1 静态包含
      • 6.5.2 动态包含
      • 6.5.3 混合使用静态包含和动态包含
    • 6.6 JSP 异常处理

    • 6.7 再谈发布 JSP

    • 6.8 预编译 JSP

    • 6.9 PageContext 类的用法

    • 6.10 在 web.xml 中配置 JSP

    • 6.11 JSP 技术的发展趋势

    • 6.12 小结

    • 6.13 思考题

  • 第 7 章 bookstore 应用简介

    • 7.1 bookstore 应用的软件结构

      • 7.1.1 Web 服务器层
      • 7.1.2 数据库层
    • 7.2 浏览 bookstore 应用的 JSP 网页

    • 7.3 JavaBean 和实用类

      • 7.3.1 实体类
      • 7.3.2 购物车的实现
    • 7.4 发布 bookstore 应用

    • 7.5 小结

  • 第 8 章 访问数据库

    • 8.1 安装和配置 MySQL 数据库

    • 8.2 JDBC 简介

      • 8.2.1 java.sql 包中的接口和类
      • 8.2.2 编写访问数据库程序的步骤
      • 8.2.3 事务处理
    • 8.3 通过 JDBC API 访问数据库的 JSP 范例程序

    • 8.4 bookstore 应用通过 JDBC API 访问数据库

    • 8.5 数据源 (DataSource) 简介

    • 8.6 配置数据源

      • 8.6.1 在 context.xml 中加入 元素
      • 8.6.2 在 web.xml 中加入 元素
    • 8.7 程序中访问数据源

      • 8.7.1 通过数据源连接数据库的 JSP 范例程序
      • 8.7.2 bookstore 应用通过数据源连接数据库
    • 8.8 处理数据库中数据的中文字符编码

    • 8.9 分页显示批量数据

    • 8.10 用可滚动结果集分页显示批量数据

    • 8.11 小结

    • 8.12 思考题

  • 第 9 章 HTTP 会话的使用与管理

    • 9.1 会话简介

    • 9.2 HttpSession 的生命周期及会话范围

    • 9.3 使用会话的 JSP 范例程序

    • 9.4 使用会话的 Servlet 范例程序

    • 9.5 通过重写 URL 来跟踪会话

    • 9.6 会话的持久化

      • 9.6.1 标准会话管理器 StandardManager
      • 9.6.2 持久化会话管理器 PersistentManager
    • 9.7 会话的监听

      • 9.7.1 用 HttpSessionListener 统计在线用户人数
      • 9.7.2 用 HttpSessionBindingListener 统计在线用户人数
    • 9.8 小结

    • 9.9 思考题

  • 第 10 章 JSP 访问 JavaBean

    • 10.1 JavaBean 简介

    • 10.2 JSP 访问 JavaBean 的语法

    • 10.3 JavaBean 的范围

      • 10.3.1 JavaBean 在页面(page)范围内
      • 10.3.2 JavaBean 在请求(request)范围内
      • 10.3.3 JavaBean 在会话(session)范围内
      • 10.3.4 JavaBean 在 Web 应用(application)范围内
    • 10.4 在 bookstore 应用中访问 JavaBean

      • 10.4.1 访问 BookDB 类
      • 10.4.2 访问 ShoppingCart 类
  • 第 11 章 开发 JavaMail Web 应用

    • 11.1 E-Mail 协议简介

      • 11.1.1 SMTP 简单邮件传输协议
      • 11.1.2 POP3 邮局协议
      • 11.1.3 接收邮件的新协议 IMAP
    • 11.2 JavaMail API 简介

    • 11.3 建立 JavaMail 应用程序的开发环境

      • 11.3.1 获得 JavaMail API 的类库
      • 11.3.2 安装和配置邮件服务器
    • 11.4 创建 JavaMail 应用程序

    • 11.5 JavaMail Web 应用简介

    • 11.6 JavaMail Web 应用的程序结构

      • 11.6.1 重新封装 Message 数据
      • 11.6.2 用于保存邮件账号信息的 JavaBean
      • 11.6.3 定义所有 JSP 文件的相同内容
      • 11.6.4 登录 IMAP 服务器上的邮件账号
      • 11.6.5 管理邮件夹
      • 11.6.6 查看邮件中的邮件信息
      • 11.6.7 查看邮件内容
      • 11.6.8 创建和发送邮件
      • 11.6.9 退出邮件系统
    • 11.7 在 Tomcat 中配置邮件会话 (Mail Session)

      • 11.7.1 在 context.xml 中配置 Mail Session 资源
      • 11.7.2 在 web.xml 中加入对 JNDI Mail Session 资源的引用
      • 11.7.3 在 JavaMail 应用中获取 JNDI Mail Session 资源
    • 11.8 发布和运行 JavaMail 应用

    • 11.9 小结

    • 11.10 思考题

  • 第 12 章 EL 表达式语言

    • 12.1 基本语法

      • 12.1.1 访问对象的属性及数组的元素
      • 12.1.2 EL 运算符
      • 12.1.3 隐含对象
      • 12.1.4 命名变量
    • 12.2 使用 EL 表达式的 JSP 范例

      • 12.2.1 关于基本语法的例子
      • 12.2.2 读取 HTML 表单数据的例子
      • 12.2.3 访问命名变量的例子
    • 12.3 定义和使用 EL 函数

    • 12.4 小结

    • 12.5 思考题

  • 第 13 章 自定义 JSP 标签

    • 13.1 自定义 JSP 标签简介

    • 13.2 JSP Tag API

      • 13.2.1 JspTag 接口
      • 13.2.2 Tag 接口
      • 13.2.3 IterationTag 接口
      • 13.2.4 BodyTag 接口
      • 13.2.5 TagSupport 类和 BodyTagSupport 类
    • 13.3 message 标签范例

      • 13.3.1 创建 message 标签的处理类 MessageTag
      • 13.3.2 创建标签库描述文件
      • 13.3.3 在 Web 应用中使用标签
      • 13.3.4 发布支持中、英文版本的 helloapp 应用
    • 13.4 iterate 标签范例(重复执行标签主体)

    • 13.5 greet 标签范例(访问标签主体内容)

    • 13.6 小结

    • 13.7 思考题

  • 第 14 章 采用模板设计网上书店应用

    • 14.1 如何设计网站的模板

    • 14.2 创建负责流程控制的 Servlet

    • 14.3 创建模板标签和模板 JSP 文件

      • 14.3.1 标签及其处理类
      • 14.3.2 标签和处理类
      • 14.3.3 标签和处理类
      • 14.3.4 标签和处理类
    • 14.4 修改 JSP 文件

    • 14.5 发布采用模板设计的 bookstore 应用

    • 14.6 小结

    • 14.7 思考题

  • 第 15 章 JSTL Core 标签库

    • 15.1 使用第三方提供的标签库的步骤

    • 15.2 JSTL 标签库简介

    • 15.3 一般用途的标签

      • 15.3.1 <c:out> 标签
      • 15.3.2 <c:set> 标签
      • 15.3.3 <c:remove> 标签
      • 15.3.4 <c:catch> 标签
    • 15.4 条件标签

      • 15.4.1 <c:if> 标签
      • 15.4.2 <c:choose>、<c:when> 和 <c:otherwise> 标签
    • 15.5 迭代标签

      • 15.5.1 <c:forEach> 标签
      • 15.5.2 <c:forTokens> 标签
    • 15.6 URL 相关的标签

      • 15.6.1 <c:import> 标签
      • 15.6.2 <c:url> 标签
      • 15.6.3 <c:redirect> 标签
    • 15.7 小结

    • 15.8 思考题

  • 第 16 章 JSTL I18N 标签库

    • 16.1 国际化的概念

    • 16.2 Java 语言对 I18N 的支持

      • 16.2.1 Locale 类
      • 16.2.2 ResourceBundle 类
      • 16.2.3 MessageFormat 类和复合消息
    • 16.3 国际化标签

      • 16.3.1 标签
      • 16.3.2 标签
      • 16.3.3 标签
      • 16.3.4 标签
      • 16.3.5 标签
      • 16.3.6 标签
    • 16.4 创建国际化的 Web 应用

      • 16.4.1 创建支持国际化的网页
      • 16.4.2 创建资源文件
    • 16.5 格式化标签

      • 16.5.1 标签
      • 16.5.2 标签
      • 16.5.3 标签
      • 16.5.4 标签
      • 16.5.5 标签
      • 16.5.6 标签
    • 16.6 小结

    • 16.7 思考题

  • 第 17 章 JSTL SQL 标签库

    • 17.1 标签

    • 17.2 标签

      • 17.2.1 设置数据源
      • 17.2.2 设置 select 查询语句
      • 17.2.3 控制实际取出的记录
      • 17.2.4 访问查询结果
      • 17.2.5 使用 标签的范例
    • 17.3 标签

    • 17.4 标签

    • 17.5 标签

    • 17.6 标签

    • 17.7 小结

    • 17.8 思考题

  • 第 18 章 JSTL Functions 标签库

    • 18.1 fh:contains 函数
    • 18.2 fh:containsIgnoreCase 函数
    • 18.3 fh:startsWith 函数
    • 18.4 fh:endsWith 函数
    • 18.5 fti:indexOf 函数
    • 18.6 fh:replace 函数
    • 18.7 fh:substring 函数
    • 18.8 fo:substringBefore 函数
    • 18.9 fh:substringAfter 函数
    • 18.10 fo:split 函数
    • 18.11 firjoin 函数
    • 18.12 fiirtoLowerCase 函数
    • 18.13 fh:toUpperCase 函数
    • 18.14 fh:trim 函数
    • 18.15 fii:escapeXml 函数
    • 18.16 fh:length 函数
    • 18.17 小结
    • 18.18 思考题
  • 第 19 章 简单标签和标签文件

    • 19.1 实现 SimpleTag 接口

      • 19.1.1 创建和使用 <hello>​​ 简单标签
      • 19.1.2 创建和使用带属性和标签主体的 <welcome>​​ 简单标签
    • 19.2 使用标签文件

      • 19.2.1 标签文件的隐含对象
      • 19.2.2 标签文件的指令
      • 19.2.3 标签文件的 <jsp:invoke>​​ 和 <jsp:doBody>​​ 动作元素
      • 19.2.4 创建和使用带属性和标签主体的 display​​ 标签文件
      • 19.2.5 创建和使用带属性和标签主体的 welcome​​ 标签文件
      • 19.2.6 创建和使用带变量的 precode​​ 标签文件
    • 19.3 小结

    • 19.4 思考题

  • 第 20 章 过滤器

    • 20.1 过滤器简介

    • 20.2 创建过滤器

    • 20.3 发布过滤器

      • 20.3.1 在 web.xml 文件中配置过滤器
      • 20.3.2 用 @WebFilter 注解来配置过滤器
      • 20.3.3 用 NoteFilter 来过滤 NoteServlet 的范例
    • 20.4 串联过滤器

      • 20.4.1 包装设计模式简介
      • 20.4.2 ServletOutputStream 的包装类
      • 20.4.3 HttpServletResponse 的包装类
      • 20.4.4 创建对响应结果进行字符串替换的过滤器
      • 20.4.5 ReplaceTextFilter 过滤器工作的 UML 时序图
      • 20.4.6 发布和运行包含 ReplaceTextFilter 过滤器的 Web 应用
    • 20.5 异步处理过滤器

    • 20.6 小结

    • 20.7 思考题

  • 第 21 章 在 Web 应用中访问 EJB 组件

    • 21.1 JavaEE 体系结构简介

    • 21.2 安装和配置 WildFly 服务器

    • 21.3 创建 EJB 组件

      • 21.3.1 编写 Remote 接口
      • 21.3.2 编写 Enterprise Java Bean 类
    • 21.4 在 Web 应用中访问 EJB 组件

    • 21.5 发布 JavaEE 应用

      • 21.5.1 在 WildFly 上发布 EJB 组件
      • 21.5.2 在 WildFly 上发布 Web 应用
      • 21.5.3 在 WildFly 上发布 JavaEE 应用
    • 21.6 小结

    • 21.7 思考题

  • 第 22 章 在 Web 应用中访问 SOAP 服务

    • 22.1 SOAP 简介

    • 22.2 在 Tomcat 上发布 AxisWeb 应用

    • 22.3 创建 SOAP 服务

      • 22.3.1 创建提供 SOAP 服务的 Java 类
      • 22.3.2 创建 SOAP 服务的发布描述文件
    • 22.4 发布和管理 SOAP 服务

      • 22.4.1 发布 SOAP 服务
      • 22.4.2 管理 SOAP 服务
    • 22.5 创建和运行 SOAP 客户端程序

    • 22.6 在 bookstore 应用中访问 SOAP 服务

      • 22.6.1 对 SOAP 服务方法的参数和返回值的限制
      • 22.6.2 创建 BookDB 服务类及 BookDBDelegate 代理类
      • 22.6.3 发布 BookDBService 服务和 bookstore 应用
    • 22.7 小结

    • 22.8 思考题

  • 第 23 章 Web 应用的 MVC 设计模式

    • 23.1 MVC 设计模式简介

    • 23.2 JSP Model1 和 JSP Model2

    • 23.3 Spring MVC 概述

      • 23.3.1 Spring MVC 的框架结构
      • 23.3.2 Spring MVC 的工作流程
    • 23.4 创建采用 Spring MVC 的 Web 应用

      • 23.4.1 建立 Spring MVC 的环境
      • 23.4.2 创建视图
      • 23.4.3 创建模型
      • 23.4.4 创建 Controller 组件
      • 23.4.5 创建 web.xml 文件和 Spring MVC 配置文件
    • 23.5 运行 helloapp 应用

    • 23.6 小结

    • 23.7 思考题

  • 第 24 章 Tomcat 的管理平台

    • 24.1 访问 Tomcat 的管理平台

    • 24.2 Tomcat 的管理平台

      • 24.2.1 管理 Web 应用
      • 24.2.2 管理 HTTP 会话
      • 24.2.3 查看 Tomcat 服务器信息
    • 24.3 小结

  • 第 25 章 安全域

    • 25.1 安全域概述

    • 25.2 为 Web 资源设置安全约束

      • 25.2.1 在 web.xml 中加入 元素
      • 25.2.2 在 web.xml 中加入 元素
      • 25.2.3 在 web.xml 中加入 元素
    • 25.3 内存域

    • 25.4 JDBC 域

      • 25.4.1 用户数据库的结构
      • 25.4.2 在 MySQL 中创建和配置用户数据库
      • 25.4.3 配置 元素
    • 25.5 在 Web 应用中访问用户信息

    • 25.6 小结

    • 25.7 思考题

  • 第 26 章 Tomcat 与其他 HTTP 服务器集成

    • 26.1 Tomcat 与 HTTP 服务器集成的原理

      • 26.1.1 JK 插件
      • 26.1.2 AJP 协议
    • 26.2 在 Windows 下 Tomcat 与 Apache 服务器集成

    • 26.3 在 Linux 下 Tomcat 与 Apache 服务器集成

      • 26.3.1 安装和启动 Apache 服务器
      • 26.3.2 准备相关文件
      • 26.3.3 编辑注册表
      • 26.3.4 在 IIS 中加入"Jakarta"虚拟目录
      • 26.3.5 把 JK 插件作为 ISAPI 筛选器加入到 IIS
      • 26.3.6 测试配置
    • 26.4 Tomcat 集群

      • 26.4.1 配置集群系统的负载平衡器
      • 26.4.2 配置集群管理器
    • 26.5 小结

    • 26.6 思考题

  • 第 27 章 在 Tomcat 中配置 SSI

    • 27.1 SSI 简介

      • 27.1.1 #echo 指令
      • 27.1.2 #include 指令
      • 27.1.3 #flastmod 指令
      • 27.1.4 #fsize 指令
      • 27.1.5 #exec 指令
      • 27.1.6 #config 指令
      • 27.1.7 #if​​、#elif​​、#endif 指令
    • 27.2 在 Tomcat 中配置对 SSI 的支持

    • 27.3 小结

    • 27.4 思考题

  • 第 28 章 Tomcat 阀

    • 28.1 Tomcat 阀简介
    • 28.2 客户访问日志阀
    • 28.3 远程地址过滤阀
    • 28.4 远程主机过滤阀
    • 28.5 错误报告阀
    • 28.6 小结
    • 28.7 思考题
  • 第 29 章 在 Tomcat 中配置 SSL

    • 29.1 SSL 简介

    • 29.2 在 Tomcat 中使用 SSL

      • 29.2.1 准备安全证书
      • 29.2.2 配置 SSL 连接器
      • 29.2.3 访问支持 SSL 的 Web 站点
    • 29.3 小结

    • 29.4 思考题

  • 第 30 章 用 ANT 工具管理 Web 应用

    • 30.1 安装配置 ANT
    • 30.2 创建 build.xml 文件
    • 30.3 运行 ANT
    • 30.4 小结
    • 30.5 思考题
  • 第 31 章 使用 Log4J 进行日志操作

    • 31.1 Log4J 简介

      • 31.1.1 Logger 组件
      • 31.1.2 Appender 组件
      • 31.1.3 Layout 组件
      • 31.1.4 Logger 组件的继承性
    • 31.2 Log4J 的基本使用方法

      • 31.2.1 创建 Log4J 的配置文件
      • 31.2.2 在程序中使用 Log4J
    • 31.3 在 helloapp 应用中使用 Log4J

    • 31.4 小结

    • 31.5 思考题

  • 第 32 章 Velocity 模板语言

    • 32.1 获得与 Velocity 相关的类库

    • 32.2 Velocity 的简单例子

      • 32.2.1 创建 Velocity 模板
      • 32.2.2 创建扩展 VelocityViewServlet 的 Servlet 类
      • 32.2.3 发布和运行基于 Velocity 的 Web 应用
    • 32.3 注释

    • 32.4 引用

      • 32.4.1 变量引用
      • 32.4.2 属性引用
      • 32.4.3 方法引用
      • 32.4.4 正式引用符
      • 32.4.5 安静引用符
    • 32.5 指令

      • 32.5.1 #set 指令
      • 32.5.2 字面字符串
      • 32.5.3 #if 指令
      • 32.5.4 比较运算
      • 32.5.5 #foreach 循环指令
      • 32.5.6 #include 指令
      • 32.5.7 #parse 指令
      • 32.5.8 #macro 指令
      • 32.5.9 转义 VTL 指令
      • 32.5.10 VTL 的格式
    • 32.6 其他特征

      • 32.6.1 数学运算
      • 32.6.2 范围操作符
      • 32.6.3 字符串的连接
    • 32.7 小结

    • 32.8 思考题

  • 第 33 章 创建嵌入式 Tomcat 服务器

    • 33.1 将 Tomcat 嵌入 Java 应用

    • 33.2 创建嵌入了 Tomcat 的 Java 示范程序

    • 33.3 终止嵌入式 Tomcat 服务器

    • 33.4 引用

      • 33.4.1 变量引用
      • 33.4.2 属性引用
      • 33.4.3 方法引用
      • 33.4.4 正式引用符
      • 33.4.5 安静引用符
    • 33.5 小结

    • 33.6 思考题

  • 附录 A: server.xml 文件

    • A.1 配置 Server 元素
    • A.2 配置 Service 元素
    • A.3 配置 Engine 元素
    • A.4 配置 Host 元素
    • A.5 配置 Context 元素
    • A.6 配置 Connector 元素
    • A.7 配置 Executor 元素
  • 附录 B: web.xml 文件

    • B.1 配置过滤器
    • B.2 配置 Servlet
    • B.3 配置 Servlet 映射
    • B.4 配置 Session
    • B.5 配置 Welcome 文件清单
    • B.6 配置 Tag Library
    • B.7 配置资源引用
    • B.8 配置安全约束
    • B.9 配置对安全验证角色的引用
    • B.10 配置对安全验证登录界面的引用
  • 附录 C: XML 简介

    • C.1 SGML、HTML 与 XML 的比较
    • C.2 DTD 文档类型定义
    • C.3 有效 XML 文档以及简化格式的 XML 文档
    • C.4 URL、URN 和 URI
    • C.4.1 URL、URN 和 URI
    • C.4.2 XML 命名空间
  • 附录 D: 书中涉及软件获取途径

  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    75 引用 • 1737 回帖 • 2 关注
  • gRpc
    11 引用 • 9 回帖 • 55 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖 • 2 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 732 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    52 引用 • 37 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 622 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 95 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 630 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    176 引用 • 814 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 31 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 599 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    345 引用 • 1778 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖 • 3 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 1 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 415 关注
  • 导航

    各种网址链接、内容导航。

    38 引用 • 169 回帖
  • 安装

    你若安好,便是晴天。

    131 引用 • 1184 回帖 • 2 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3170 引用 • 8209 回帖 • 2 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 615 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 2 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    336 引用 • 669 回帖 • 1 关注
  • 博客

    记录并分享人生的经历。

    272 引用 • 2386 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 204 关注