第 01 章 Servlet
学好Servlet,有助于更好的学习交互层框架的应用以及真正掌握Web开发的业务设计。JSP是J2EE非常重要的一个组成部分。
学习目标
- 理解C/S和B/S的架构概念
- 使用Eclipse创建web项目
- 使用Tomcat部署静态网站(重点)
- 掌握request和response的使用(重点、难点)
- 掌握转发和重定向的区别(重点、难点)
- 掌握session存取数据
理解C/S和B/S的架构概念
C/S架构程序
服务器-客户机,即Client-Server(C/S)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务[1]。
优点
- 应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。
- 数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,并且通常把那些不同的(不管是已知还是未知的)前台应用所不能违反的规则,在服务器程序中集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立订单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理
- C/S的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。
缺点
总体概述:
- 系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。
- 存在平台的限制(兼容的问题),如,win10平台与win7平台。
- 传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。
- C/S架构的劣势还有高昂的维护成本且投资大。
服务端的特征 :
- 被动的角色(从)。
- 等待来自用户端的要求。
- 处理要求并传回结果。
用户端的特征:
- 主动的角色(主)。
- 发送要求。
- 等待直到收到回应。
B/S架构程序
B/S架构即浏览器和服务器架构模式,是随着Internet技术的兴起,对C/S架构的一种变化或者改进的架构。在这种架构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。B/S架构是WEB兴起后的一种网络架构模式,WEB浏览器是客户端最主要的应用软件[2]。
优点
- B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的电脑就能使用,客户端零安装、零维护。系统的扩展非常容易。
- 由需求推动了AJAX技术的发展,它的程序也能在客户端电脑上进行部分处理,从而大大的减轻了服务器的负担;并增加了交互性,能进行局部实时刷新。
- B/S结构主要利用了不断成熟的Web浏览器技术:结合浏览器的多种脚本语言和ActiveX技术,用通用浏览器实现原来需要复杂专用软件才能实现的强大功能,节约了开发成本。
补充SaaS架构
SaaS,是Software-as-a-Service的缩写名称,意思为软件即服务,即通过网络提供软件服务。
SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得Saas平台供应商提供的服务[3]。
随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式。传统模式下,厂商通过License将软件产品部署到企业内部多个客户终端实现交付。SaaS定义了一种新的交付方式,也使得软件进一步回归服务本质。企业部署信息化软件的本质是为了自身的运营管理服务,软件的表象是一种业务流程的信息化,本质还是第一种服务模式,SaaS改变了传统软件服务的提供方式,减少本地部署所需的大量前期投入,进一步突出信息化软件的服务属性,或成为未来信息化软件市场的主流交付模式。
关于Servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:
- 性能明显更好。
- Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
- Servlet 是独立于平台的,因为它们是用 Java 编写的。
- 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
- Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
Servlet架构
下图显示了Servlet与Web应用程序中的位置。
Servlet任务与作用
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
URI介绍
URI(统一资源标识符)[^URI]:是一个用于标识某一互联网资源名称的字符串。而这个资源由两个部分确定:资源地址信息(URL)+资源名称信息(URN);
常见的URI格式如下:
http://user:[email protected]:8080/p/a/t/h?query=string&action=add#hash
URI组成 | 含义 |
---|---|
http:// | 协议名称,协议头 |
user | 用户名 |
password | 对应密码 |
host.com | 主机域名地址(异或主机ip地址),主机地址 |
:8080 | 端口号,默认80 |
/p/a/t/h | 虚拟资源路径,目标资源地址 |
query=string&action=add | 参数传递 |
hash | 锚点 |
Web服务器
- 是可以向发出请求的浏览器提供文档的程序
- 提供网上的信息浏览服务
常见的web服务器
- Microsoft:IIS,是一种WEB服务组件,允许在公共Intranet或Internet上发布信息的WEB服务器,其中包括WEB服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络上发布信息成了一件很容易的事情。它提供ISAPI作为扩展WEB服务器功能的编程接口,同时还提供了Internet,可以实现对数据库的查询和更新。
- Apache:Apache是世界上应用最多的WEB服务器,优势主要在于源代码开放、有一支开放的开发队伍、支持跨平台应用以及其可移植性等。Apache的模块支持非常丰富,虽在速度和性能上不及其他轻量级WEB服务器,是属于重量级产品,所消耗的内存也比其他WEB服务器要高。
- Tomcat:Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的web应用软件容器(Web应用服务器),Tomcat server是根据servlet和jsp规范执行的,因此也可以说Tomcat server实行了Apache-Jakarta规范,且比绝大多数商用应用软件服务器要好,但是,tomcat对静态文件和高并发的处理比较弱。Tomcat本身的并发性比较差,可保证应用正常运行。其优点是:
- Apache Jakarta的开源项目
- 轻量级应用服务器
- 开源、稳定、资源占用小
- Tomcat:Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的web应用软件容器(Web应用服务器),Tomcat server是根据servlet和jsp规范执行的,因此也可以说Tomcat server实行了Apache-Jakarta规范,且比绝大多数商用应用软件服务器要好,但是,tomcat对静态文件和高并发的处理比较弱。Tomcat本身的并发性比较差,可保证应用正常运行。其优点是:
- Nginx:Nginx是一款高性能的HTTP和反向代理服务器,能够选择高效的epoll、kqueue、eventport最为网络I/O模型,在高连接并发的情况下,能够支持高达5万个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。
- IBM:WebSphere,是一种功能完善、开放的WEB应用程序服务器,它基于Java的应用环境,建立、部署和管理Internet和Intranet Web应用程序。相对于其他流行的WEB服务器而言,应用的数量很少。
- Oracle:WebLogic,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中[^4]。
下面主要介绍Apache与Nginx的区别。
Web服务器 | Apache | Nginx |
---|---|---|
反向代理 | 好 | 非常好 |
Rewrite规则,重写 | 好 | 非常好 |
Fast CGI | 差 | 好 |
热部署 | 不支持 | 支持 |
系统压力比较 | 小 | 很小 |
稳定性 | 好 | 非常好 |
安全性 | 好 | 一般 |
技术资料 | 较少 | 非常多 |
静态文件处理 | 一般 | 非常好 |
虚拟主机 | 支持 | 支持 |
内存消耗 | 很大 | 非常小 |
Tomcat安装与使用
下载Tomcat
点击Apache Tomcat进入官网页面,选择自己想要下载的版本(根据操作系统选择)即可。这里选择的是Tomcat 7.0.104。下载完成后解压压缩包即可。
安装
将下载的文件(这里下载的是tar.gz
)的版本,也就是linux的版本。
tar -xzvf apache-tomcat-7.0.104.tar.gz
将解压缩的后的文件目录apache-tomcat-7.0.104
目录移动至没有中文名称的路径下面即可。这样就完成了Tomcat的安装。
Tomcat目录结构
└── apache-tomcat-7.0.104
├── BUILDING.txt
├── CONTRIBUTING.md
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── bin/ # 存放各种平台下面用于启动和停止Tomcat的脚本文件
├── conf/ # 存放Tomcat服务器的各种配置文件
│ ├── catalina.policy
│ ├── catalina.properties
│ ├── context.xml
│ ├── logging.properties
│ ├── server.xml
│ ├── tomcat-users.xml
│ ├── tomcat-users.xsd
│ └── web.xml
├── lib/ # 存放Tomcat服务器所需的各种JAR包
├── logs/ # 存放Tomcat的日志文件
├── temp/ # Tomcat用于存放临时文件
│ └── safeToDelete.tmp
├── webapps/ # 当发布web应用时,默认情况下会将web应用的文件存放于此目录中
│ ├── ROOT
│ ├── docs
│ ├── examples
│ ├── host-manager
│ └── manager
└── work/ # Tomcat把有JSP生成的Servlet防御此目录下
配置Tomcat
配置管理员
tomcat-users.xml
是配置Tomcat管理员的。配置管理员的方式如下:
Tomcat可以配置管理员,但是不建议配置。可能会被暴力破解。
核心配置
在Tomcat 5.0之前,是将context.xml
做为核心配置文件,但是在5.0之后则是以server.xml
为核心配置文件。
80
端口是web服务器中一个比较特殊的端口,但是一台服务器中,只有一个80端口。如果是单应用则可以直接占用80端口(但是不建议);如果是多个应用则不建议
IDEA中Servlet开发环境集成
主要参考资料:百度经验——《intellij idea2019开发servlet(java web)项目》
下面主要讲解两种在IDEA中创建servlet工程方式:
- 不以Maven作为依赖管理工具的方式;
- 以Maven作为依赖管理的方式。
- 以Maven作为依赖管理工具,使用maven archetype创建webapp(目录结构更加规范)。
不以Maven作为依赖管理工具的方式
-
创建新的项目,如下图所示。
-
选择
Java Enterprise
,指定JDK版本,如果之前没有选择Tomcat。则需要创建一个TomcatServer。选择TomcatServer后。在选择Web Application
,下面的扩展选项可以不选择,确定Web Application
的版本号后,并勾选创建web.xml
文件。配置完成后点击“下一步(next)”。
-
输入项目名称,以及确定项目存放位置。最后检查下自己的信息是否有误。确定后,点击“完成”即可。
-
完成后,其目录结构如下所示:
├── servlet-demo.iml ├── src └── web ├── WEB-INF │ └── web.xml └── index.jsp
-
创建
Servlet Server
,选中项目目录的src
文件夹,右击“新建”或使用快捷键cmd
+n
(Mac OS)选择create new servlet
,将出现如下所示弹窗。Name
中输入入口文件的名称,Package
中输入入口文件所在包名,create java ee 6 annotated class
(是否使用JavaEE 6的相关注解)取消选中状态。完成后,点击“确定”。
-
此时的目录结构如下所示:
├── servlet-demo.iml ├── src │ └── com.ermao.servlet │ └── ServletDemo.java └── web ├── WEB-INF │ └── web.xml └── index.jsp
SerletDemo.java
已经自动创建完毕。public class ServletDemo extends HttpServlet { protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
web.xml
内容如下:ServletDemo com.ermao.servlet.ServletDemo -
引入Tomcat相关Servlet JSP依赖
jsp-api.jar
以及servlet-api.jar
,点击"文件(File)"选择项目结构设置。
如果之前没有选择,点击“+”添加“组件(Library)”,如下图所示,选择需要TomacatServer版本中即可。
最后点击“应用”以及“确定即可”。
-
确定下是否将对应的TomcatServer中的依赖引入进来。
-
设置
Artifact
,点击文件中的“项目结构”菜单,如下图,再选择“Artifacts”选项卡,根据下图进行操作即可。
-
配置“运行配置”,创建Tomcat配置,在“Deployment”选项卡,设置刚刚新增的
Artifact
。
以Maven为依赖管理工具模式搭建
-
创建新的项目,如下图所示。
-
选择“Maven”并确定项目的JDK版本后,点击下一步。
-
录入
pom.xml
的基础信息,如下图。录入成功后,点击“确定”即可。
-
此时的目录结构如下所示:
├── pom.xml └── src ├── main │ ├── java │ └── resources └── test └── java
-
选中项目根目录
servlet-demo-maven
单击鼠标右键,并选择添加新框架支持,如下图所示。
-
选择“Web Applications”,选择“web”应用版本并勾选创建
create web.xml
。如下图所示。最后点击“确定”即可。
-
此时目录结构如下所示。
├── pom.xml ├── servlet-demot-maven.iml ├── src │ ├── main │ │ ├── java │ │ └── resources │ └── test │ └── java └── web ├── WEB-INF │ └── web.xml └── index.jsp
-
选中
src
目下的main
目录的java
根目录,单击鼠标右键(cmd
+n
——mac OS快捷键),在下拉菜单中选择“新建”选项,并选择“创建Servlet Server”,如下图所示。
-
创建Servlet入口文件,如下图。
Name
中输入入口文件的名称,Package
中输入入口文件所在包名,create java ee 6 annotated class
(是否使用JavaEE 6的相关注解)取消选中状态。完成后,点击“确定”。
-
此时的目录结构如下所示。
├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com.ermao.servlet │ │ │ └── ServletDemo.java │ │ └── resources │ └── test │ └── java └── web ├── WEB-INF │ └── web.xml └── index.jsp
-
引入TomcatServer中重要的JSP API两个:
jsp-api.jar
以及servlet-api.jar
。这个地方的话,就直接使用maven管理即可。修改pom.xml
文件,如下所示。打包方式改为war
包方式。4.0.0 com.ermao learn_servlet 1.0 war 在IDEA的选项卡Maven中,更新
pom.xml
的设置。并确认导入信息无误。
-
确定下是否将对应的TomcatServer中的依赖引入进来。
-
设置
Artifact
,点击文件中的“项目结构”菜单,如下图,再选择“Artifacts”选项卡,根据下图进行操作即可。
-
配置“运行配置”,创建Tomcat配置,在“Deployment”选项卡,设置刚刚新增的
Artifact
。
当然也可以使用,非maven方式导入这两个依赖包。至此,项目的初始化基本完成。其次就是修改
web.xml
配置相关信息。
关于Maven创建Servlet项目
参考资料《IDEA创建webapp》以及配置相关信息。
-
点击“创建新的项目”,如下图所示。
-
根据下面的图片信息进行操作:第一,选择“maven”作为项目依赖管理工具。第二,确定JDK版本信息是否有误。第三,勾选“create from archetype(从原型中创建)”。第四,选择“
org.apache.maven.archetype:maven-archetype-webapp
”。点击“下一步”。
-
根据弹出页面,输入maven基本信息以及项目存放位置。点击“下一步”。
-
确认maven信息是否正确后,点击“完成”即可。
-
此时项目的目录结构如下。
├── pom.xml ├── src │ └── main │ └── webapp │ ├── WEB-INF │ │ └── web.xml │ └── index.jsp
此时需要在
main
目录下创建两个新的文件夹:“java”(编写代码的目录)以及“resource”(存放一些配置),创建完成后,新的目录结构如下所示。├── pom.xml ├── src │ └── main │ ├── java │ ├── resources │ └── webapp │ ├── WEB-INF │ │ └── web.xml │ └── index.jsp
创建完成了还没结束,需要将“java”(编写代码的目录)以及“resource”分别标记为“源码根目录”以及“配置资源根目录”。按照下图,进行标记。
[站外图片上传中...(image-16725c-1592722636696)] -
编辑“运行配置” 。按照下图的操作步骤进行添加。第一,点“add configura(添加运行配置)”;第二,点击“+”;第三,找到“Tomcat Local Server”。点击“确定”即可。
配置tomcat server home路径,如下图所示。如果之前配置过,则直接选择tomcat的版本即可。
[站外图片上传中...(image-73929d-1592722636696)]
配置成功后,如下图所示。
[站外图片上传中...(image-9f2bb8-1592722636696)]
选中“Deployment”选项卡,点击“+”,并选择“Artifact”。
[站外图片上传中...(image-b7dce8-1592722636696)]
选择第二个即可。并点击确定。
[站外图片上传中...(image-ea7fb9-1592722636696)]
如果有需求需要更改url访问路径,则可以冲回到“server”选项卡中,修改“URL”路径地址值即可。
[站外图片上传中...(image-4fdd78-1592722636696)]-
配置
pom
文件,添加servlet-api
以及jsp-api
。修改完成后,重新导入下pom
文件即可。junit junit 4.11 test javax.servlet javax.servlet-api 4.0.1 provided javax.servlet.jsp javax.servlet.jsp-api 2.3.3 provided 创建
Servlet
入口文件,选中java
目录“单击鼠标右键”或者“cmd”+“N”
(快捷键),选则创建create new servlet
。如下所示:
[站外图片上传中...(image-94aa9e-1592722636696)]
根据提示信息,录入相关信息,如下所示,名称自定义即可。同时取消勾选状态“create java ee 6 annotation”不适用javaee6相关注解。
[站外图片上传中...(image-af9e24-1592722636696)]
注意事项
配置Artifact
在idea中,如果没有设置Artifact(且没有默认的设置,如下图所示)则需要手动设置Artifact。需要核对下信息
[站外图片上传中...(image-be318f-1592722636696)]
点击“+”按钮,如下图。选择“Web Application Exploded”。
[站外图片上传中...(image-9c87d3-1592722636696)]
点击后,弹窗如下图,确认文件信息后,点击“确定”即可。
[站外图片上传中...(image-365774-1592722636696)]
这步配置完成后,则需要配置,如果需要增加辨识度,则可以修改下名称。
[站外图片上传中...(image-ae9a80-1592722636696)]
最后还要编辑“运行配置”,选中“Deployment”选项卡,添加“Artifact”。
[站外图片上传中...(image-a66878-1592722636696)]
选择刚刚添加的“Artifact”即可。然后运行项目。
[站外图片上传中...(image-1d1048-1592722636696)]
当能正常访问时,说明配置成功了。
配置context以及访问路径
在“运行配置”中,“Deployment”选项卡中,选择“Artifact”后,将自动生成context
。
[站外图片上传中...(image-7f776b-1592722636696)]
如果需要调整context,则必须与“Server”选项卡种的url路径一直才能正常访问,否则,将无法访问。
[站外图片上传中...(image-59502e-1592722636696)]
Eclipse 中Servlet开发环境集成
使用Tomcat部署静态网站(重点)
什么是web资源?web资源都是需要通过浏览器下载到本地再执行的。符合web应用的其目录结构标准如下所示(开发时的目录结构):
├── pom.xml # 依赖管理文件
├── src/ # java源码目录
│ └── main/
│ ├── java/ # 主要存放编写的java程序
│ │ └── com.ermao.servlet/
│ │ └── Servlet.java
│ ├── resources/ # 存放java应用程序的配置文件,如:bean,properties文件等
│ └── webapp/ # Web应用程序的根目录,属于此Web应用程序的所有文件都存放在这个目录下
│ ├── WEB-INF/ # 存放Web应用程序的部署描述符文件 web.xml
│ │ ├── web.xml # web.xml文件包含Web应用程序的配置和部署信息
│ │ └── lib/ # 存放Web应用程序需要用到的JAR文件,这些JAR文件中可以包含Servlet、Bean和其他有用的类文件
│ ├── index.jsp # 首页信息
│ └── static/ # 前端的静态资源目录,或者应用需要下载的文件等。
│ ├── css/
│ │ └── animate.css
│ ├── files/
│ │ └── dept.csv
│ ├── images/
│ │ └── u=1539816938,3284839683&fm=214&gp=0.jpg
│ └── js/
│ └── jquery-3.4.1.min.js
在实际应用访问阶段,请求实际是到web打包的war包中,去查找静态资料,Servlet 规范中定义了 web 应用程序的目录层次:
[站外图片上传中...(image-836797-1592722636696)]
- WEB-INF目录下的classes和lib目录都可以存放Java的类文件,在Servlet容器运行时,Web应用程序的类加载器将首先加载classes目录下的,其次才是lib目录下的类。
- 如果这两个目录下存在同名的类,起作用的将是classes目录下的类
- WEB-INF 是一个特殊的目录(所有字母都要大写)。这个目录并不属于Web应用程序可以访问的上下文路径的一部分,对客户端来说,这个目录是不可见的。但该目录下的内容对于Servlet代码是可见的
-
C/S架构 引用于百度百科 ↩
-
B/S架构 引用于百度百科 ↩
-
WebLogic 引用于百度百科 ↩