Web基础知识(1)- Java Servlet (一) | Java Servlet简介、Servlet容器和开发环境配置
注:开始阅读 Java Servlet 系列文章之前,读者应该已经掌握了 Java 基础知识。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA + Apache Maven 配置和编译的,所以还需要对 IntelliJ IDEA 和 Apache Maven 有基本的了解。
1. Java Servlet简介
Java 是一种功能强大的通用型编程语言,可以处理 HTTP 请求,可以访问数据库,可以生成 HTML 代码,您完全可以使用原生 Java 来开发动态网站。但是,使用原生 Java 开发动态网站非常麻烦,需要自己解析 HTTP 请求的报头,需要自己分析用户的请求参数,需要自己加载数据库组件,需要 ... 。
正是基于这种原因,Java 官方后来推出了 Servlet 技术,它对开发动态网站需要使用的原生 Java API 进行了封装,形成了一套新的 API,称为 Servlet API。
Servlet 是 Server Applet 的缩写,译为 “服务器端小程序”,是一种使用 Java 语言来开发动态网站的技术。
Servlet 基于 Java,可以使用几乎全部的 Java API,所以它的功能异常强大,完全可以胜任企业级开发,能够处理那些高并发、大吞吐量、业务逻辑复杂的应用场景。
可以这样理解,Servlet 是 Sun 公司推出的一种基于 Java 的动态网站开发技术。编写 Servlet 代码需要遵循 Java 语法,一个 Servlet 程序其实就是一个按照 Servlet 规范编写的 Java 类。Servlet 程序需要先编译成字节码文件(.class文件),然后再部署到服务器运行。
1) Servlet 是一种规范
严格来说,Servlet 只是一套 Java Web 开发的规范,或者说是一套 Java Web 开发的技术标准。只有规范并不能做任何事情,必须要有人去实现它。所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等。
Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。Servlet 容器用来管理程序员编写的 Servlet 类。
2) Servlet 接口
所有的 Servlet 功能都是通过一个名为Servlet的接口(Interface)向外暴露的,编写 Servlet 代码,可以从实现 Servlet 接口开始,就像下面这样:
public class TestServlet implements Servlet {
// TODO:
}
直接实现 Servlet 接口比较麻烦,需要实现很多方法,所以 Servlet 规范又提供了两个抽象类,分别是 GenericServlet 类和 HttpServlet 类,它们都实现了 Servlet 接口的很多常用功能。和 GenericServlet 类相比,HttpServlet 类更加方便,所以实际开发中一般都继承自 HttpServlet 类。
3) JSP
Servlet 是第一代 Java Web 开发技术,它将 HTML 代码以字符串的形式向外输出,编写 HTML 文档就是在拼接字符串,非常麻烦,所以 Java 官方又推出了第二代 Web 开发技术——JSP。
JSP 才是现代化的 Web 开发技术,它允许 HTML 代码和 JSP 代码分离,让程序员能够在 HTML 文档中直接嵌入 JSP 代码。
现在没有人直接使用 Servlet 开发动态网站,大家都转向了 JSP 阵营。但是 JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,HTML 代码还是以字符串的形式向外输出的。您看,JSP 只是在 Servlet 的基础上做了进一步封装。
JSP 代码可以调用 Servlet 类,程序员可以将部分功能在 Servlet 中实现,然后在 JSP 中调用即可。
总之,Servlet 是 JSP 的基础,Servlet 虽然不直接面向用户,但是它依然是 JSP 的后台支撑,想玩转 JSP,必须先玩转 Servlet。
学习顺序:
学习 Servlet 的正确顺序是:Java --> Servlet。
学习 JSP 的正确顺序是:Java --> Servlet --> JSP。
4) Servlet 版本
截止到 2020 年 10 月,最新的 Servlet 版本是 4.0。下表列出了各种主要 Servlet 版本的发布日期及其对应的 Java 版本。
Servlet 版本 发布日期 JAVA EE/JDK 版本
Servlet 4.0 2017年10月 Java EE 8
Servlet 3.1 2013年5月 Java EE 7
Servlet 3.0 2009年12月 Java EE 6 / Java SE 6
Servlet 2.5 2005年10月 Java EE 5 / Java SE 5
Servlet 2.4 2003年11月 J2EE 1.4 / J2SE 1.3
Servlet 2.3 2001年8月 J2EE 1.3 / J2SE 1.2
Servlet 2.2 1999年8月 J2EE 1.2 / J2SE 1.2
Servlet 2.1 1998年11月 未指定
Servlet 2.0 JDK 1.1
Servlet 1.0 1997年6月
2. Web 服务器
部署动态网站一般需要 Web 服务器的支持,例如:
运行 PHP 网站一般选择 Apache 或者 Nginx;
运行 ASP/ASP.NET 网站一般选择 IIS;
运行 Python 网站一般选择内置的 WSGI 服务器模块 — wsgiref。
Web 服务器是一种对外提供 Web 服务的软件,它可以接收浏览器的 HTTP 请求,并将处理结果返回给浏览器。
通常所说的 Web 服务器,比如 Apache、Nginx、IIS 等,它们的功能往往都比较单一,只能提供 http(s) 服务,让用户访问静态资源(HTML 文档、图片、CSS 文件、JavaScript 文件等),它们不能执行任何编程语言,也不能访问数据库,更不能让用户注册和登录。
也就是说,如果只有 Web 服务器,那您只能部署静态网站,不能部署动态网站。要想部署动态网站,必须要有编程语言运行环境(运行时,Runtime)的和数据库管理系统的支持:
1) 运行环境(运行时)
开发网站使用的编程语言一般都是脚本语言(比如 PHP、ASP、Python),部署网站时都是将源代码直接上传到服务器上,然而源代码自己并不能运行,必须要有解释器的支持;当用户访问动态页面时,解释器负责分析、编译和执行源代码,然后得到处理结果。
解释器是执行脚本语言的核心部件,除此以外还有一些辅助性的部件,例如:
a) 垃圾回收器:负责及时释放不需要的内存,腾出资源供其它页面使用;
b) 标准库:任何编程语言都会附带标准库,它们提供了很多通用性的功能,极大地提高了开发效率,避免重复造轮子。
我们习惯将以上各种支持脚本语言运行的部件统称为运行环境,或者运行时(Runtime)。
2) 数据库
Web 服务器不带数据库,编程语言也不带数据库,数据库是一款独立的软件;要想实现用户注册、发布文章、提交评论等功能,就必须安装一款数据库,比如 MySQL、Oracle、SQL Server 等。
部署动态网站一般至少需要三个组件,分别是 Web 服务器、脚本语言运行时和数据库,例如,部署 PHP 网站一般选择「Apache + PHP 运行时 + MySQL」的组合。
3. Servlet容器
Servlet 是基于 Java 语言的,运行 Servlet 必然少不了 JRE 的支持,它负责解析和执行字节码文件(.class文件)。然而 JRE 只包含了 Java 虚拟机(JVM)、Java 核心类库和一些辅助性性文件,它并不支持 Servlet 规范。要想运行 Servlet 代码,还需要一种额外的部件,该部件必须支持 Servlet 规范,实现了 Servlet 接口和一些基础类,这种部件就是 Servlet 容器。
Servlet 容器就是 Servlet 代码的运行环境(运行时),它除了实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持,还需要管理由用户编写的 Servlet 类,比如实例化类(创建对象)、调用方法、销毁类等。
Servlet 中的容器和生活中的容器是类似的概念:生活中容器用来装水、装粮食,Servlet 中的容器用来装类,装对象。
Servlet 类为什么需要 Servlet 容器来管理呢?这是因为我们编写的 Servlet 类没有 main() 函数,不能独立运行,只能作为一个模块被载入到 Servlet 容器,然后由 Servlet 容器来实例化,并调用其中的方法。
一个动态页面对应一个 Servlet 类,开发一个动态页面就是编写一个 Servlet 类,当用户请求到达时,Servlet 容器会根据配置文件(web.xml)来决定调用哪个类。
下图演示了 Servlet 容器在整个 HTTP 请求流程中的位置:
浏览器 <-> Web服务器 <-> Servlet容器 <-> 数据库
|
JRE
Web 服务器是整个动态网站的“大门”,用户的 HTTP 请求首先到达 Web 服务器,Web 服务器判断该请求是静态资源还是动态资源:如果是静态资源就直接返回,此时相当于用户下载了一个服务器上的文件;如果是动态资源将无法处理,必须将该请求转发给 Servlet 容器。
Servlet 容器接收到请求以后,会根据配置文件(web.xml)找到对应的 Servlet 类,将它加载并实例化,然后调用其中的方法来处理用户请求;处理结束后,Servlet 容器将处理结果再转交给 Web 服务器,由 Web 服务器将处理结果进行封装,以 HTTP 响应的形式发送给最终的用户。
常用的 Web 容器有 Tomcat、Jboss、Jetty、WebLogic 等,其中 Tomcat 由 Java 官方提供,是初学者最常使用的。
为了简化部署流程,Web 容器往往也会自带 Web 服务器模块,提供基本的 HTTP 服务,所以您可以不用再安装 Apache、IIS、Nginx 等传统意义上的服务器,只需要安装一款 Web 容器,就能部署 Servlet 网站了。正是由于这个原因,有的教材将 Tomcat 称为 Web 容器,有的教材又将 Tomcat 称为 Web 服务器,两者的概念已经非常模糊了。
将 Web 容器当做服务器使用后,上面的流程图就变成了下面的样子:
浏览器 <-> Servlet容器 <-> 数据库
|
JRE
注意,Servlet 容器自带的 Web 服务器模块虽然没有传统的 Web 服务器强大,但是也足以应付大部分开发场景,对初学者来说是足够的。当然,也可以将传统的 Web 服务器和 Servlet 容器组合起来,两者分工协作,各司其职,共同完成 HTTP 请求。
Servlet 容器就是 Servlet 程序的运行环境,它主要包含以下几个功能:
(1) 实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持;
(2) 管理用户编写的 Servlet 类,以及实例化以后的对象;
(3) 提供 HTTP 服务,相当于一个简化的 Web服务器。
4. 开发环境配置
1) 系统要求
(1) 基础要求
硬件:台式机或笔记本电脑,内存在 2G 以上,CPU 尽量 I3 以上(或其它CPU同等配置)
操作系统:Windows XP/7/8/10/11、MacOS或Linux等桌面系统(达到WinXP性能以上)
代码编辑器:Visual Studio Code,Sublime Text,Ultra Edit,Notepad 等(有些需要付费)。
Java JDK: 8 以上版本
Tomcat Server: 7 以上版本
(2) 扩展要求(提高开发效率,降低开发难度)
a) Apache Maven:
Apache Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。
官方网址:https://maven.apache.org/
b) Eclipse IDE for Enterprise Java and Web Developers:
面向使用 Java 和 Web 应用程序的开发人员的工具,包括Java IDE、JavaScript工具、TypeScript、JavaServer 页面和界面、Yaml、Markdown、Web服务、JPA和数据工具、Maven和Gradle、Git等。
官方网址:https://www.eclipse.org/
c) IntelliJ IDEA Community Edition (简称 IDEA,Ultimate版是付费的):
IntelliJ IDEA Community Edition 是 IntelliJ IDEA的一个开源版本。 支持Java、XML和Groovy代码,支持 Ant和Maven 等构建工具,集成JUnit和TestNG测试框架,集成CVS、Subversion和git版本控制系统。
官方网址:https://www.jetbrains.com/idea/
*注:本文主要讨论 Maven + IDEA 组合的 Servlet 开发环境。
2) Windows 下配置环境
Windows版本 : Windows 10 Home (20H2)
(1) Java/JDK 安装
a) 下载 JDK
https://www.oracle.com/java/technologies/downloads/
下载 Windows 版的 Java 8+ 的 *.exe 文件,默认安装后,假设安装目录是 C:\Program Files (x86)\Java\jdk8.0.1。
b) 配置环境变量
右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”
新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)
JAVA_HOME = C:\Program Files (x86)\Java\jdk8.0.1
CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
编辑系统变量 Path (PATH)
Path = ... ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
查看Java版本,运行如下命令:
c:\> java -version
(2) Apache Maven 配置
https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:
Maven 目录: C:\Applications\java\apache-maven-3.8.1
本地 Maven 仓库: C:\Applications\java\maven-repository
a) 配置环境变量
右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”
新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)
MAVEN_HOME = C:\Applications\java\apache-maven-3.8.1
编辑系统变量 Path (PATH)
Path = ... ;%MAVEN_HOME%\bin;
b) 修改成阿里源
修改 C:\Applications\java\apache-maven-3.8.1\conf\settings.xml
...
# 修改本地仓库路径
<localRepository>C:\Applications\java\maven-repository</localRepository>
...
# 修改成阿里源
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3) IntelliJ IDEA Community Edition 安装
https://www.jetbrains.com/idea/download/
下载的 *.exe 文件,默认安装后,运行。
配置 Maven:
IntelliJ IDEA -> Preferences -> Build, Execution, Deployment -> Build Tools -> Maven
Maven home path: C:\Applications\java\apache-maven-3.8.1
User settings file: C:\Applications\java\apache-maven-3.8.1\conf\settings.xml
Local repository: C:\Applications\java\maven-repository
(4) Tomcat Server 配置
http://tomcat.apache.org/
下载 64-bit Windows zip 文件,这里下载了 9.0.52 版本,直接解压zip包,Tomcat目录如下:
C:\Applications\Java\apache-tomcat-9.0.52
启动 Tomcat, 运行:
C:\Applications\Java\apache-tomcat-9.0.52\bin\startup.bat
关闭 Tomcat,运行:
C:\Applications\Java\apache-tomcat-9.0.52\bin\shutdown.bat
(5) XAMPP for Windows 安装
https://www.apachefriends.org/download.html
本文安装版本 7.4.25,用到 XAMPP 的如下功能:
+ Apache 2.4.51
+ MariaDB 10.4.21 (MySQL的分支)
+ PHP 7.4.25 (VC15 X86 64bit thread safe) + PEAR
+ phpMyAdmin 5.1.1
3) macOS 下配置环境
macOS版本 : macOS High Sierra (Version: 10.13.6)
(1) Java/JDK 安装
a) 下载 JDK
https://www.oracle.com/java/technologies/downloads/
下载 macOS 版 Java 8+ 的 *.dmg 文件,双击安装。
运行 "/usr/libexec/java_home -V" 查看 Java 目录,查到的目录如下:
/Users/xxx/Library/Java/JavaVirtualMachines/corretto-1.8.0_302/Contents/Home
*注:路径中的 xxx 是当前的macOS用户名,下同。
b) 设置 JAVA_HOME
修改系统配置文件 /etc/profile (也可修改当前用户的 ~/.bash_profile,下同)
$ sudo vi /etc/profile
JAVA_HOME=/Users/xxx/Library/Java/JavaVirtualMachines/corretto-1.8.0_302/Contents/Home
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
$ source /etc/profile
$ echo $JAVA_HOME
查看Java版本,运行如下命令:
$ java -version
(2) Apache Maven 配置
下载:https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:
Maven 目录: /Users/xxx/Applications/Java/apache-maven-3.8.1
本地 Maven 仓库: /Users/xxx/Applications/maven-repository
a) 配置环境变量
修改系统配置文件 /etc/profile
$ sudo vim /etc/profile
...
MAVEN_HOME=/Users/xxx/Applications/Java/apache-maven-3.8.1
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
export JAVA_HOME JRE_HOME MAVEN_HOME CLASS_PATH PATH
$ source /etc/profile
$ echo $MAVEN_HOME
b) 修改成阿里源
修改 /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml
...
# 修改本地仓库路径
<localRepository>/Users/xxx/Applications/maven-repository</localRepository>
...
# 修改成阿里源
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3) IntelliJ IDEA Community Edition 安装
https://www.jetbrains.com/idea/download/
下载的 *.dmg 文件,默认安装后,运行。
配置 Maven:
IntelliJ IDEA -> Preferences -> Build, Execution, Deployment -> Build Tools -> Maven
Maven home path: /Users/xxx/Applications/Java/apache-maven-3.8.1
User settings file: /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml
Local repository: /Users/xxx/Applications/maven-repository
(4) Tomcat Server 配置
http://tomcat.apache.org/
下载 64-bit tar.gz 文件,这里下载了 9.0.52 版本,直接解压zip包,Tomcat目录如下:
/Users/xxx/Applications/Java/apache-tomcat-9.0.52
启动 Tomcat, 运行:
/Users/xxx/Applications/Java/apache-tomcat-9.0.52/bin/startup.sh
关闭 Tomcat,运行:
/Users/xxx/Applications/Java/apache-tomcat-9.0.52/bin/shutdown.sh
(5) XAMPP for macOS 安装
https://www.apachefriends.org/download.html
本文安装版本 7.4.25,用到 XAMPP 的如下功能:
+ Apache 2.4.51
+ MariaDB 10.4.21 (MySQL的分支)
+ PHP 7.4.25 (VC15 X86 64bit thread safe) + PEAR
+ phpMyAdmin 5.1.1
4) Linux 下配置环境
Linux版本:Ubuntu 18.04
(1) Java/JDK 安装
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~18.04-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
$ update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
设置 JAVA_HOME 和 macOS 类似。
(2) Apache Maven 配置
参考 macOS 下 Maven 配置
(3) IntelliJ IDEA Community Edition
略
(4) Tomcat Server 配置
参考 macOS 下 Tomcat 配置
(5) XAMPP for Linux
略
本系列文章资料参考来源:
1. http://c.biancheng.net/servlet2/
2. http://c.biancheng.net/jsp2/
3. https://www.w3cschool.cn/jsp/
4. https://www.runoob.com/jsp/jsp-tutorial.html
5. https://tomcat.apache.org/taglibs/standard/
6. https://docs.oracle.com/javase/8/docs/api/index.html
浙公网安备 33010602011771号