写点什么

【JavaWeb】Servlet 系列——请求和响应过程的角色和协议、模拟 Servlet 本质、开发第一个带有 Servlet 的 Webapp、关于 Java EE 的版本

作者:胖虎不秃头
  • 2022 年 9 月 08 日
    河南
  • 本文字数:5368 字

    阅读完需:约 18 分钟

【JavaWeb】Servlet系列——请求和响应过程的角色和协议、模拟Servlet本质、开发第一个带有Servlet的Webapp、关于Java EE的版本

05 动态 web 应用的一个请求和响应过程的角色和协议

5.1 有哪些角色(在整个 BS 结构的系统当中,有哪些人参与进去了)

  • 浏览器软件的开发团队(浏览器软件太多了:谷歌浏览器、火狐浏览器、IE 浏览器....)

  • WEB Server 的开发团队(WEB Server 这个软件也是太多了:Tomcat、Jetty、WebLogic、JBOSS、WebSphere....)

  • DB Server 的开发团队(DB Server 这个软件也是太多了:Oracle、MySQL.....)

  • webapp 的开发团队(WEB 应用是我们做为 JavaWEB 程序员开发的)

5.2 角色和角色之间需要遵守哪些规范,哪些协议?

  • webapp 的开发团队 和 WEB Server 的开发团队 之间有一套规范: JavaEE 规范之一 Servlet 规范。

  • Servlet 规范的作用是什么?

  • ​ WEB Server 和 webapp 解耦合。

  • Browser 和 WebServer 之间有一套传输协议:HTTP 协议。(超文本传输协议。)

  • webapp 开发团队 和 DB Server 的开发团队之间有一套规范:JDBC 规范。


5.3 Servlet 规范是一个什么规范?

  • 遵循 Servlet 规范的 webapp,这个 webapp 就可以放在不同的 WEB 服务器中运行。(因为这个 webapp 是遵循 Servlet 规范的。)

  • Servlet 规范包括什么呢?

  • 规范了哪些接口

  • 规范了哪些类

  • 规范了一个 web 应用中应该有哪些配置文件

  • 规范了一个 web 应用中配置文件的名字

  • 规范了一个 web 应用中配置文件存放的路径

  • 规范了一个 web 应用中配置文件的内容

  • 规范了一个合法有效的 web 应用它的目录结构应该是怎样的。

  • .....

06 模拟 Servlet 本质

6.1 充当 SUN 公司的角色,制定 Servlet 规范

  • javax.servlet.Servlet 接口



## 6.2 充当Tomcat服务器的开发者```javapackage org.apache;
import java.util.Scanner;import java.util.Properties;import java.io.FileReader;import javax.servlet.Servlet;
// 充当Tomcat服务器的开发者public class Tomcat{ public static void main(String[] args) throws Exception{ System.out.println("Tomcat服务器启动成功,开始接收用户的访问。");
// 简单的使用Scanner来模拟一下用户的请求 // 用户访问服务器是通过浏览器上的“请求路径” // 也就是说用户请求路径不同,后台执行的Servlet不同。 /* /userList UserListServlet /login UserLoginServlet /bank BankServlet ...... */ System.out.print("请输入您的访问路径:"); Scanner s = new Scanner(System.in);
// 用户的请求路径 /bbbb String key = s.nextLine(); // Tomcat服务器已经获取到了用户的请求路径了。
// Tomcat服务器应该通过用户的请求路径找对应的XXXServlet // 请求路径和XXXServlet之间的关系应该由谁指定呢? // 对于Tomcat服务器来说需要解析配置文件 FileReader reader = new FileReader("web.properties"); Properties pro = new Properties(); pro.load(reader); reader.close();
// 通过key获取value String className = pro.getProperty(key); // 通过反射机制创建对象 Class clazz = Class.forName(className); Object obj = clazz.newInstance(); // obj的类型对于Tomcat服务器开发人员来说不知道。 // 但是Tomcat服务器的开发者知道,你写的XXXXServlet一定实现了Servlet接口 Servlet servlet = (Servlet)obj; servlet.service();
}}
复制代码


配置文件 web.properties



/aaaa=com.bjpowernode.servlet.UserListServlet/bbbb=com.bjpowernode.servlet.UserLoginServlet/cccc=com.bjpowernode.servlet.BankServlet
复制代码

6.3 充当 Webapp 的开发者

BankServlet implements Servlet




    UserListServlet implements Servlet
    - ```java package com.bjpowernode.servlet; import javax.servlet.Servlet; // 充当的角色发生了改变:webapp开发者 public class UserListServlet implements Servlet{ public void service(){ System.out.println("UserListServlet's service..."); } }
    复制代码


    UserLoginServlet implements Servlet




      ## 6.4 通过我们的分析:
      - 对于我们javaweb程序员来说,我们只需要做两件事: - 编写一个类实现Servlet接口。 - 将编写的类配置到配置文件中,在配置文件中:指定 **请求路径** 和 **类名** 的关系。
      注意:
      - 这个配置文件的文件名不能乱来。固定的。- 这个配置文件的存放路径不能乱来。固定的。- 文件名、文件路径都是SUN公司制定的Servlet规范中的明细。
      ## 6.5 严格意义上来说Servlet其实并不是简单的一个接口:
      - Servlet规范中规定了: - 一个合格的webapp应该是一个怎样的目录结构。 - 一个合格的webapp应该有一个怎样的配置文件。 - 一个合格的webapp配置文件路径放在哪里。 - 一个合格的webapp中java程序放在哪里。 - 这些都是Servlet规范中规定的。
      ## 6.6 Tomcat服务器要遵循Servlet规范。
      JavaWEB程序员也要遵循这个Servlet规范。这样Tomcat服务器和webapp才能解耦合。
      # 07 *开发一个带有Servlet(Java小程序)的webapp
      ## 6.1 开发步骤是怎样的?
      - **第一步:在webapps目录下新建一个目录,起名crm**(这个crm就是webapp的名字)。当然,也可以是其它项目,比如银行项目,可以创建一个目录bank,办公系统可以创建一个oa。
      - 注意:crm就是这个webapp的根
      - **第二步:在webapp的根下新建一个目录:WEB-INF**
      - 注意:这个目录的名字是Servlet规范中规定的,必须全部大写,必须一模一样。必须的必须。
      - **第三步:在WEB-INF目录下新建一个目录:classes**
      - 注意:这个目录的名字必须是全部小写的classes。这也是Servlet规范中规定的。另外这个目录下一定存放的是Java程序编译之后的class文件(这里存放的是字节码文件)。
      - **第四步:在WEB-INF目录下新建一个目录:lib**
      - 注意:这个目录不是必须的。但如果一个webapp需要第三方的jar包的话,这个jar包要放到这个lib目录下,这个目录的名字也不能随意编写,必须是全部小写的lib。例如java语言连接数据库需要数据库的驱动jar包。那么这个jar包就一定要放到lib目录下。这Servlet规范中规定的。
      - **第五步:在WEB-INF目录下新建一个文件:web.xml**
      - 注意:这个文件是必须的,这个文件名必须叫做web.xml。这个文件必须放在这里。一个合法的webapp,web.xml文件是必须的,这个**web.xml文件就是一个配置文件,在这个配置文件中描述了请求路径和Servlet类之间的对照关系**。
      - 这个文件最好从其他的webapp中拷贝,最好别手写。没必要。复制粘贴
      - ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0" metadata-complete="true"> </web-app>
      复制代码


      • 第六步:编写一个 Java 程序,这个小 Java 程序也不能随意开发,这个小 java 程序必须实现 Servlet 接口。

      • 这个 Servlet 接口不在 JDK 当中。(因为 Servlet 不是 JavaSE 了。Servlet 属于 JavaEE,是另外的一套类库。)

      • Servlet 接口(Servlet.class 文件)是 Oracle 提供的。(最原始的是 sun 公司提供的。)

      • Servlet 接口是 JavaEE 的规范中的一员。

      • Tomcat 服务器实现了 Servlet 规范,所以 Tomcat 服务器也需要使用 Servlet 接口。Tomcat 服务器中应该有这个接口,Tomcat 服务器的 CATALINA_HOME\lib 目录下有一个 servlet-api.jar,解压这个 servlet-api.jar 之后,你会看到里面有一个 Servlet.class 文件。

      • 重点:从 JakartaEE9 开始,Servlet 接口的全名变了:jakarta.servlet.Servlet

      • 注意:编写这个 Java 小程序的时候,java 源代码你愿意在哪里就在哪里,位置无所谓,你只需要将 java 源代码编译之后的 class 文件放到 classes 目录下即可。

      • 第七步:编译我们编写的 HelloServlet

      • 重点:你怎么能让你的 HelloServlet 编译通过呢?配置环境变量 CLASSPATH

      • CLASSPATH=.;C:\dev\apache-tomcat-10.0.12\lib\servlet-api.jar

      • 思考问题:以上配置的 CLASSPATH 和 Tomcat 服务器运行有没有关系?

      • 没有任何关系,以上配置这个环境变量只是为了让你的 HelloServlet 能够正常编译生成 class 文件。


      package com.bjpowernode.servlet;
      import jakarta.servlet.Servlet;import jakarta.servlet.ServletException;import jakarta.servlet.ServletRequest;import jakarta.servlet.ServletResponse;import jakarta.servlet.ServletConfig;import java.io.IOException;import java.io.PrintWriter;

      public class HelloServlet implements Servlet{
      // 5个方法 public void init(ServletConfig config) throws ServletException{ }
      public void service(ServletRequest request,ServletResponse response) throws ServletException , IOException{
      // 向控制台打印输出 System.out.println("My First Servlet, Hello Servlet");
      // 设置响应的内容类型是普通文本或html代码 // 需要在获取流对象之前设置,有效。 response.setContentType("text/html");
      // 怎么将一个信息直接输出到浏览器上? // 需要使用ServletResponse接口:response // response表示响应:从服务器向浏览器发送数据叫做响应。 PrintWriter out = response.getWriter(); // 设置响应的内容类型时不要在获取流之后设置。 //response.setContentType("text/html");
      out.print("Hello Servlet, You are my first servlet!");
      // 浏览器是能够识别html代码的,那我们是不是应该输出一段HTML代码呢? out.print("<h1>hello servlet,你好Servlet</h1>");
      // 这是一个输出流,负责输出字符串到浏览器 // 这个输出流不需要我们刷新,也不需要我们关闭,这些都由Tomcat来维护。 /* out.flush(); out.close(); */ }
      public void destroy(){ }
      public String getServletInfo(){ return ""; }
      public ServletConfig getServletConfig(){ return null; }}
      复制代码


      • 第八步:将以上编译之后的 HelloServlet.class 文件拷贝到 WEB-INF\classes 目录下。

      • 第九步:在 web.xml 文件中编写配置信息,让“请求路径”和“Servlet 类名”关联在一起。

      • 这一步用专业术语描述:在 web.xml 文件中注册 Servlet 类。




      - **第十步:启动Tomcat服务器**
      - **第十一步:打开浏览器,在浏览器地址栏上输入一个url**,这个URL必须是:
      - http://127.0.0.1:8080/crm/fdsa/fd/saf/d/sa/fd/sa/fd - 非常重要的一件事:浏览器上的请求路径不能随便写,这个请求路径必须和web.xml文件中的url-pattern一致。 - 注意:浏览器上的请求路径和web.xml文件中的url-pattern的唯一区别就是:浏览器上的请求路径带项目名:/crm
      - 浏览器上编写的路径太复杂,可以使用超链接。(**非常重要:html页面只能放到WEB-INF目录外面。**)
      - 以后不需要我们编写main方法了。tomcat服务器负责调用main方法,Tomcat服务器启动的时候执行的就是main方法。我们javaweb程序员只需要编写Servlet接口的实现类,然后将其注册到web.xml文件中,即可。
      - 总结一下:一个合法的webapp目录结构应该是怎样的?
      复制代码


      webapproot|------WEB-INF|------classes(存放字节码)|------lib(第三方 jar 包)|------web.xml(注册 Servlet)|------html|------css|------javascript|------image....



      - 浏览器发送请求,到最终服务器调用Servlet中的方法,是怎样的一个过程?(以下这个过程描述的很粗糙。其中还有很多步骤我省略了。)
      - 用户输入URL,或者直接点击超链接:http://127.0.0.1:8080/crm/fdsa/fd/saf/d/sa/fd/sa/fd - 然后Tomcat服务器接收到请求,截取路径:/crm/fdsa/fd/saf/d/sa/fd/sa/fd - Tomcat服务器找到crm项目 - Tomcat服务器在web.xml文件中查找/fdsa/fd/saf/d/sa/fd/sa/fd 对应的Servlet是:com.bjpowernode.servlet.HelloServlet - Tomcat服务器通过反射机制,创建com.bjpowernode.servlet.HelloServlet的对象。 - Tomcat服务器调用com.bjpowernode.servlet.HelloServlet对象的service方法。
      # 08 关于JavaEE的版本
      - JavaEE目前最高版本是 JavaEE8- JavaEE被Oracle捐献了,Oracle将JavaEE规范捐献给Apache了。- Apache把JavaEE换名了,以后不叫JavaEE了,以后叫做 jakarta EE。- 以后没有JavaEE了。以后都叫做Jakarta EE。- JavaEE8版本升级之后的"JavaEE 9",不再是"JavaEE9"这个名字了,叫做JakartaEE9- JavaEE8的时候对应的Servlet类名是:javax.servlet.Servlet- JakartaEE9的时候对应的Servlet类名是:jakarta.servlet.Servlet (包名都换了)- 如果你之前的项目还是在使用javax.servlet.Servlet,那么你的项目无法直接部署到Tomcat10+版本上。你只能部署到Tomcat9-版本上。在Tomcat9以及Tomcat9之前的版本中还是能够识别javax.servlet这个包。# 09 解决Tomcat服务器在DOS命令窗口中的乱码问题(控制台乱码)
      将CATALINA_HOME/conf/logging.properties文件中的内容修改如下:
      java.util.logging.ConsoleHandler.encoding = GBK
      复制代码


      发布于: 刚刚阅读数: 3
      用户头像

      还未添加个人签名 2022.07.29 加入

      还未添加个人简介

      评论

      发布
      暂无评论
      【JavaWeb】Servlet系列——请求和响应过程的角色和协议、模拟Servlet本质、开发第一个带有Servlet的Webapp、关于Java EE的版本_Web_胖虎不秃头_InfoQ写作社区