Servlet详解
文章目录
一、软件架构
1、c/s结构(client/server)客户端/服务器
- 如qq软件、王者荣耀软件数据大部分都在客户端的
- 优点:
- 速度快(大部分数据都存储子我们客户端,只需要服务器传输少量的数据就行)
- 用户体验好(因为大部分数据在客户端,所以不用太考虑存储和传输的问题,自然文件就可以做的大,页面美化这些效果自然就好很多了,速度快)
- 安全性高(因为大部分的数据存储在客户端,如果服务器的发生了损坏了,但是我大部分的数据都放在客户端,所以对数据丢失影响不大)
- 缺点:
- 需要下载客户端
- 难维护(因为只有一维护需要维护客户端和服务器)
2、b/s结构(browser/server)浏览器/服务器
- 如百度,知乎这种网页版
- 优点:
- 不需要下载客户端
- 容易维护(因为只需要维护服务器就行了,对客户端那边不需要任何维护)
- 缺点:
- 速度慢(客户端使用的所有数据都是向服务器请求的)
- 用户体验不好(用户等待的时间较长,而且传输的文件肯定不能太大,所以自然在页面美化上面就没有那么好)
- 安全性不高(所有数据都在服务器上的)
二、web开发
1、什么是web
b/s开发–>网页开发–>web开发
web容器(Web Server):
- 实现了javaEE平台下部分技术标准,如Servelet,Jsp,JNDI,javaMail.
- Web容器时开源免费的。
- Tomcat(Apache开源免费)
- Jetty(Jetty 开源免费)
2、JAVA EE为什么被淘汰
- JavaEE技术使用时过于复杂了。
- JavaEE技术使用慢,效率过低。
- JavaEE技术较重,很多技术需要依赖服务器中间件。(服务器中间件都是需要钱的,不是开源免费的)
JavaEE介绍
JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业 级web开发平台,它是一组Specification。最早由Sun公司定制并发 布,后由Oracle负责维护。在JavaEE平台规范了在开发企业级web 应用中的技术标准。
在JavaEE平台共包含了13个技术规范(随着JavaEE版本的变化所包 含的技术点的数量会有增多)。它们分别是:JDBC、JNDI、EJB、 RMI、Servlet、JSP、XML、JMS、Java IDL、JPA、JTA、JavaMail和 JAF。
注:2017 年 8 月,Java EE 已经正式更名为 Jakarta EE(雅加 达)。2017年Oracle就将java EE捐献给eclipse基金会了就被决定改名了。
JavaEE应用服务器
应用服务器是Java EE规范的具体实现, 可以执行/驱动基于JavaEE平 台开发的web项目。绝大部分的应用服务器都是付费产品。
常见的应用服务:
- Weblogic(BEA Oracle 收费)
- Webshpere(IBM 收费)
- JBoss(RedHad 收费)
- Geronimo(Apache 免费)
三、Tomcat的使用
Tomcat服务器是Apache的一个开源免费的Web容器。它实现了 JavaEE平台下部分技术规范,属于轻量级应用服务器。
**作用:**可以在Tomcat种运行我们所编写的Servlet、JSP
1、Tomcat版本说明
Tomcat版本 | JDK版本 | Servlet版本 | JSP版本 |
---|---|---|---|
10.0.X | 1.8 和 之后 | 5.0 | 3.0 |
9.0.x | 1.8 和 之后 | 4.0 | 2.3 |
8.0.x | 1.7 和 之后 | 3.1 | 2.3 |
7.0.x | 1.6 和 之后 | 3.0 | 2.2 |
6.0.x | 1.5 和 之后 | 2.5 | 2.1 |
2、Tomcat下载与安装
下载:
下载地址:http://tomacat.apache.org/
安装:
直接解压就可以使用,不需要安装程序写入什么注册表
配置环境变量(注)
Tomcat是用Java语言开发的Web容器,所以在使用Tomcat时需要 在操作系统中正确配置环境变量。
JAVA_HOME:jdk目录
PATH:%JAVA_HOME%\bin
CLASS_PATH:%JAVA_HOME\lib (这个不配置也能启动,只是有时候可能会出现启动时闪退就是有可能这个没有配置)
3、Tomcat目录介绍
- bin 目录主要时存放tomacat的命令文件的,主要有两类
- 以.sh结尾的(linux命令)
- 以.bat结尾的(windows命令)
- conf 目录主要是用来存放tomacat的一些配置文件。
- lib 目录主要是用来存放tomcat运行需要加载的jar包
- 我们基本需要使用的就两个包(servlet-api.jar tomcat-api.jar)
- logs 目录用来存放tomcat在运行过程中的日志文件。
- temp 目录用户存放tomacat在运行过程中产生的临时文件(清空不会对tomcat运行带来影响)
- webapps 目录用来存放应用程序,当tomcat启动时会去加载
- webapps目录下的应用程序。可以以文件夹、war包的形式发布应用
- work 目录用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件
4、Tomcat启动与关闭
Tomcat启动:
- 运行startup.bat
- catlina.bat start
- 其中catlina.bat 是命令文件,start 是启动参数(故不能直接双击启动该文件需要必须在命令窗口启动)
Tomcat关闭:
- 运行shutdown.bat文件
- catlina.bat stop
- 和上述打开一样
- 直接关闭控制台窗口,有可能不能会成功就需要再次执行命令关闭。
访问Tomcat的格式:
- 访问Tomcat的URL格式:
- http://ip:端口号
- 访问本机Tomcat的URL格式:
- http://localhost:8080 默认端口是8080可以修改的,下面会介绍修改方法
5、Tomcat配置文件介绍
Tomcat的配置文件组成:
- context.xml 是 Tomcat 公用的环境配置。
- Tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。
- web.xml Web应用程序描述文件,都是关于是Web应用程序的配置文件。
- 所有Web应用的 web.xml 文件的父文件。
- server.xml 是 tomcat 服务器的核心配置文件
- server.xml的每一个元素都对应了 tomcat中的一个组件,通过对xml中元素的配置,实现对 tomcat中的各个组件和端口的配置。
- tomcat-users.xml 配置访问Tomcat的用户以及角色的配置文件。
6、配置文件的更改操作
解决控制台乱码问题
控制台产生乱码的原因是在Tomcat在输出日志中使用的是UTF-8编码,而我们中文的Windows操作系统使用的是GBK编码。由于编码格式不统一,所以出现了乱码。
解决方式:
- 修改 **conf **目录中的 logging.properties 文件重新指定的编码方式。
修改Tomcat监听端口
Tomcat默认监听端口为8080。可以通过修改server.xml文件来改变 Tomcat的监听端口。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
7、配置Tomcat Manager
什么是Tomcat Manager
- Tomcat Manager是Tomcat自带的、用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用
- 默认情况下,Tomcat Manager是处于禁用状态的。
- 准确的来说,Tomcat Manager需要以用户角色进行登录授权才能使用相应的功能,不过Tomcat并没有配置任何默认的用户,因此我们需要先进行用户配置后才能使用 Tomcat Manager。
配置Tomcat Manager的访问用户
- Tomcat Manager中没有默认用户,我们需要在tomcat-users.xml 文件配置
- Tomcat Manager的用户配置需要配置两个部分:
- 角色配置
- 用户信息配置(包括用户名和密码)
Tomcat Manager中的角色分类
- manager-gui角色:允许访问HTML GUI和状态页面(即URL路径为/manager/html/*)
- manager-script角色: 允许访问文本界面和状态页面(即URL路径为/manager/text/*)
- manager-jmx角色: 允许访问JMX代理和状态页面(即URL路径 为/manager/jmxproxy/*)
- manager- status角色: 仅允许访问状态页面(即URL路径为/manager/status/*
配置用户及角色
解除访问权限
进入Tomcat的webapps目录下,打开webapps/manager/METAINF/context.xml文件,修改下面这段配置
四、Tomcat架构
1、Tomcat工作原理
Tomcat是一个处理请求并响应的应用程序。Tomcat实现了JavaEE平台下的一些技术规范,所以我们可以在Tomcat中运行我们所编写的Servlet、JSP.
前端向 —> web服务器发送请求(他自己解析处理不了的) —> 交由JSP/Servlet/Html容器解析请求和处理 —> 向数据库发送数据请求 —> 请求回来的数据,给Java然后Java处理了 —> 将处理好的数据返回给web服务器 —> 数据返回给前端
2、Tomcat架构图
3、conf/server.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--监听端口执行SHUTDOWN命令关闭程序,也可以通过远程服务进行关闭,也可以关闭监听端口参数-1-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!--catalina为服务的默认名称-->
<Service name="Catalina">
<!--连接器监听端口是8080,默认通讯协议是HTTP/1.1 ,连接等待时长为20000毫秒,如果请求的协议是https就转接为8443端口处理-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!--名字为Cataline的引擎,其默认的虚拟主机是localhost,默认主机就是用于如果没有找到相匹配的主机就使用默认主机-->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--虚拟主机名叫 localhost,其目录为webapps,如果不把项目布置在默认的webapps的话就需要在添加部署Context-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
4、Tomcat组件
Server组件
启动一个server实例(即一个JVM进程),它监听在8005端口以接受shutdown命令。如果配置多个server实例需要注意server端口冲突问题。
<Server port="8005" shutdown="SHUTDOWN">
</Server>
port:接收shutdown指令的端口,默认为8005;
shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;
注:也可以通过远程服务连接执行命令关闭Tomcat服务,所以这就有个安全的问题就是,如果别人知道你的ip 知道端口号,就可以关闭你的Tomcat了,所以也可以把端口号参数设置为 -1就只能通过关闭窗口关闭Tomcat了
windows 查看监听端口号: netstat -ano
windows 使用telnet 地址 端口号 (telnet是windows提供的一个远程服务)
- 在windos 控制面板中 —> 程序和功能 —> 启动或关闭windows功能
Serverce组件
Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收请求并将其转发至关联的引擎进 行处理。困此,Service要包含一个引擎、一个或多个连接器。
<Service name="Catalina">
</Service>
name:此服务的名称,默认为Catalina
Connector组件
支持处理不同请求的组件,一个引擎可以有一个或多个连接器,以适应多种请求方式。默认只开启了处理Http协议的连接器。如果需 要使用其他协议,需要在Tomcat中配置该协议的连接器。
在Tomcat中连接器类型通常有4种:
- HTTP连接器
- SSL连接器
- AJP 1.3连接器
- proxy连接器
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
port:监听连接器的端口
protocol:连接器使用的协议,默认为HTTP/1.1
connectionTimeout:等待客户请求的超时时间,单位为毫秒;
redirectPort:如果某连接器支持的协议是HTTP,当接收客户端口发来的HTTPS请求时,则转发至此属性定义的端口,转发HTTPS请求的端口
maxThreads:支持的最大并发连接数,默认为200
Engine组件
Engine是Servlet处理器的一个实例,即servlet引擎,定义在 server.xml中的Service标签中。Engine需要defaultHost属性,来为其定义一个接收所有发往没有定义的虚拟主机的请求的Host组件。
<Engine name="Catalina" defaultHost="localhost">
</Engine>
name:引擎的名称
defaultHost:Tomcat支持基于FQDN(Fully Qualified Domain Name 全限定域名)的虚拟主机,这些虚拟主机可以通过在Engine容器中Host组件来实现;但如果此引擎的连接器收到一个发往非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中至少要有一个默认主机。
Host组件
虚拟主机(英语:virtual hosting)或称共享主机(shared web hosting),又称虚拟服务器,是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。
Host组件位于Engine容器中用于接收请求并进行相应处理的虚拟主机。通过该容器可以运行Servlet或者JSP来处理请求。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
name:虚拟主机的名称,Tomcat通过在请求URL中的域名与name中的值匹配,用于查找能够处理该请求的虚拟主机。如果未找到则交给Engine中的defaultHost指定的主机处理;
appBase:指存放web应用程序的目录的路径,如果不是默认的webapps目录,把项目部署在其它目录上了,就需要在Host内添加Context组件;
unpackWARs:在启用此webapps时是否对WAR格式的自动进行解压;默认为true;
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy(部署);默认为true;
context组件
Context是Host的子组件,代表指定一个Web应用,它运行在某个 指定的虚拟主机(Host)上;每个Web应用都是一个WAR文件,或文件的目录。
<Context path="/demo" docBase="D:/a"/>
path:浏览器的访问项目的访问路径
docBase:相应的Web应用程序存放的位置;可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径
配置虚拟主机
在tomcat文件夹中创建:
- webapps1/a/index.html
- webapps2/a/index.html
- 这里只是只是在tomcat中部署项目,部署在其它位置就是需要多在Host标签中加一个Context标签就行了
修改server.xml添加Host配置文件
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="dianfei.com" appBase="webapps1"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="dianfeitwo.com" appBase="webapps2"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
注:修改Windows系统中的Host文件,文件用做域名与IP的绑定,不能绑定端口号
文件位置在:C:\Windows\System32\drivers\etc
修改内容:
127.0.0.1 dianfei.com
127.0.0.1 dianfeitwo.com
五、servlet
是用于处理请求和产生响应的
1、Selet简介
CGI技术:
- 公共网关接口(Common Gateway Interface,CGI)是Web 服务 器运行时外部程序的规范。
- 以进程方式运行,对每一个客户端的请求都要启动一个进程来运行程序,导致用户数目增加时,服务器端资源被大量占用。
- 由于对操作系统和进程的不深刻理解,使得开发人员开发的CGI程序经常遇到莫名其妙的错误。
- 不同的CGI之间不能共享资源
FastCGI
- 是对CGI模式的一个改进,采用了Pooling技术,一定程度 上改善了性能