JavaEE
1.JavaEE
- JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发平台。最早由Sun公司定制并发布,后由Oracle负责维护。JavaEE平台规范了在开发企业级web应用中的技术标准
- 在JavaEE平台共包含了13个技术规范(随着JavaEE版本的变化所包含的技术点的数量会有增多)。它们分别是:JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JPA、JTA、JavaMail和JAF。
- JavaEE应用服务器(JavaEE Application Server):应用服务器是Java EE规范的具体实现, 可以执行/驱动基于JavaEE平台开发的web项目。绝大部分的应用服务器都是付费产品。
- Weblogic(BEA Oracle 收费)
- Webshpere(IBM 收费)
- JBoss(RedHad 收费)
- Resin(Caucho 收费)
- JRun(Macromedia 收费)
- Web容器(Web Server):只实现了JavaEE平台下部分技术标准,如Servlet,Jsp,JNDI,JavaMail。Web容器是开源免费的。
- Tomcat(Apache 开源免费):常用
- Jetty(Jetty 开源免费)
2.Tomcat
2.1 Tomcat介绍
- 官网: https://tomcat.apache.org/
- 安装使用:tomcat由apache开源组织使用java开发的一款web容器,在使用之前需要安装JDK及配置环境变量JAVA_HOME。Tomcat是绿色软解,解压就可使用。
- 启动:运行startup.bat文件。
- 关闭:运行shutdown.bat文件或者直接关闭掉启动窗口。
- 访问:访问Tomcat的URL格式:
http://ip:port
,如本机Tomcat:http://localhost:8080
2.2 Tomcat目录结构
bin
:主要是用来存放tomcat的命令文件,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。lib
:主要用来存放tomcat运行需要加载的jar包。logs
:用来存放tomcat在运行过程中产生的日志文件。temp
:用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响)webapps
:用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包的形式发布应用。work
:用来存放tomcat在运行时的编译后文件,例如JSP编译后的文件。conf
:主要是用来存放tomcat的一些配置文件。- context.xml–>Context.xml 是 Tomcat 公用的环境配置。 Tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。
- web.xml–>Web应用程序描述文件,都是关于是Web应用程序的配置文件。所有Web应用的 web.xml 文件的父文件。
- server.xml–>是 tomcat 服务器的核心配置文件,server.xml的每一个元素都对应了 tomcat中的一个组件,通过对xml中元素的配置,实现对 tomcat中的各个组件和端口的配置。
- tomcat-users.xml–>配置访问Tomcat的用户以及角色的配置文件。
2.3 Tomcat 常见配置修改
- 解决Windows控制台中文乱码问题:修改conf目录中的logging.properties文件重新指定的编码方式
java.util.logging.ConsoleHandler.encoding = GBK
- 修改Tomcat监听端口:通过修改server.xml文件来改变Tomcat的监听端口。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
- 配置Tomcat并发数
maxThreads="1000"
#最大并发数
minSpareThreads="100"
#初始化时创建的线程数
maxSpareThreads="500"
#一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700"
#指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
2.4 Tomcat组件
- Server组件:启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令。Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。
<Server port="8005" shutdown="SHUTDOWN">
#port:接收shutdown指令的端口,默认为8005;
#shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;
- Service组件:Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收请求并将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。
<Service name="Catalina">
#name:此服务的名称,默认为Catalina;
-
Connector组件:支持处理不同请求的组件,一个引擎可以有一个或多个连接器,以适应多种请求方式。默认只开启了处理Http协议的连接器。如果需要使用其他协议,需要在Tomcat中配置该协议的连接器。
- 在Tomcat中连接器类型通常有4种:
- HTTP连接器
- SSL连接器
- AJP 1.3连接器
- proxy连接器
- 在Tomcat中连接器类型通常有4种:
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
# port:监听的端口
# protocol:连接器使用的协议,默认为HTTP/1.1;
# connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒;
# redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
# maxThreads:支持的最大并发连接数,默认为200个;
- Engine组件:Engine是Servlet处理器的一个实例,即servlet引擎,定义在server.xml中的Service标记中。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。
<Engine name="Catalina" defaultHost="localhost">
# name:Engine组件的名称;
# defaultHost:Tomcat支持基于FQDN(Fully Qualified Domain Name 全限定域名)的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名;
- Host组件:位于Engine容器中用于接收请求并进行相应处理的虚拟主机。通过该容器可以运行Servlet或者JSP来处理请求
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
# name:虚拟主机的名称,Tomcat通过在请求URL中的域名与name中的值匹配,用于查找能够处理该请求的虚拟主机。如果未找到则交给在Engine中defaultHost指定的主机处理;
# appBase:此Host的webapps目录,即指定存放web应用程序的目录的路径;
# autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
# unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
- Context组件:Context是Host的子标签,代表指定一个Web应用,它运行在某个指定的虚拟主机(Host)上;每个Web应用都是一个WAR文件,或文件的目录;
<Context path="/test" docBase="D:\mashibing.war" />
# path:context path既浏览器访问项目的访问路径。
# docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
2.5 Tomcat处理请求过程
- 用户访问localhost:8080/test/index.jsp,请求被发送到Tomcat,被监听8080端口并处理HTTP/1.1 协议的Connector获得。
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
- Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
- Engine匹配到名为localhost的Host虚拟主机来处理/test/index.jsp请求(即使匹配不到会请求交给默认Host处理),Host会根据/test匹配它所拥有的所有的Context。
- 匹配到的Context获得请求/index.jsp。
- 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
- Context把执行完之后的结果通过HttpServletResponse对象返回给Host。
- Host把HttpServletResponse返回给Engine。
- Engine把HttpServletResponse对象返回Connector。
- Connector把HttpServletResponse对象返回给客户Browser。
3. HTTP协议
3.1 HTTP协议介绍
- 超文本传输协议(Hyper Text Transfer Protocol):HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP是万维网(WWW:World Wide Web)的数据通信的基础。
- 超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。
- 协议 Protocol:合同,共同遵守的规则
- HTTP协议特点
- HTTP协议支持客户端服务端模式,需要使用浏览器作为客户端来访问服务端。(支持客户/服务器模式)
- 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST等。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。(简单快速)
- HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。(灵活)
- 每次请求一次,释放一次连接。所以无连接表示每次连接只能处理一个请求。优点就是节省传输时间,实现简单。我们有时称这种无连接为短连接。对应的就有了长链接,长连接专门解决效率问题。当建立好了一个连接之后,可以多次请求。但是缺点就是容易造成占用资源不释放的问题。当HTTP协议头部中字段Connection:keep-alive表示支持长链接。(支持客户/服务器模式)
- 服务端永远是被动的等待客户端的请求。(单向性)
- HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决HTTP协议无状态,于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。(无状态)
3.2 HTTP请求
当你在浏览器输入URL http://www.baidu.com的时候,浏览器发送一个Request去获取http://www.baidu.com 的html。服务器把Response发送回给浏览器。
浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如图片,CSS文件,JS文件。
浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
等所有的文件都下载成功后。 网页就被显示出来了。
3.2.1 请求的组成
- Request 消息分为3部分
- 第一部分叫Request line
- 第二部分叫Request header
- 第三部分是Request body。Request header和Request body之间有个空行。
请求的主要组成部分
1.请求行 request Line GET /myProject/img/logo.png HTTP/1.1
1请求方式 默认 GET
2资源路径
3请求使用的协议
2.请求头 request headers
请求头 键值对
3.请求体 request body
get方式请求,数据直接放在URL地址后 ,请求体中没有数据
POST方式请求,请求体重会有数据
3.2.1.1 请求行
- 如上如所示
示例:
GET /course/id/18.html?a=3&b=4 HTTP/1.1
POST /login HTTP/1.1
3.2.1.2 请求头
- 请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应。请求头中信息的格式为key:value
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。
Connection:连接方式。如果值是close则表示基于短连接方式,如果该值是keep-alive,网络连接就是持久的,在一定时间范围内是不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
Upgrade-Insecure-Requests:服务端是否支持https加密协议。
Cache-Control:指定请求和响应遵循的缓存机制。
User-Agent:浏览器表明自己的身份(是哪种浏览器)。例如Chrome浏览器:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36。
Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型。
Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。
Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等。
Accept-Charset:浏览器告诉服务器自己能接收的字符集。
Referer:浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL。
Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计时。
Cookie:可向服务端传递数据一种模型。
3.2.1.3 请求体
- 客户端传递给服务器的数据。比如:表单使用post方式提交的数据、上传的文件数据等。
3.2.2 常见请求方式
GET:向指定的资源发出“显示”请求。GET请求中会将请求中传递的数据包含在URL中并在浏览器的地址栏中显示。GET请求传递数据时要求数据必须是ASCII字符。GET请求可以被浏览器缓存。
POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求传递数据时,数据可以试试ASCII字符也可以是字节型数据,默认为字符型。POST请求默认情况下不会被浏览器所缓存。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头度中的元信息。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
3.2.3 GET和POST的区别
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST则没有。对参数的数据类型GET只接受ASCII字符,而POST即可是字符也可是字节。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中
3.3 HTTP响应
3.3.1 响应行
- 响应行
HTTP/1.1
协议,200
响应状态码
常见状态码及含义
200 - 请求成功,已经正常处理完毕
301 - 请求永久重定向,转移到其它URL
302 - 请求临时重定向
304 - 请求被重定向到客户端本地缓存
400 - 客户端请求存在语法错误
401 - 客户端请求没有经过授权
403 - 客户端的请求被服务器拒绝,一般为客户端没有访问权限
404 - 资源未找到,客户端请求的URL在服务端不存在
500 - 服务端出现异常
3.3.2 响应头
- 响应头用于告知浏览器当前响应中的详细信息,浏览器通过获取响应头中的信息可以知道应该如何处理响应结果。响应头中信息的格式为key:value。
Date:响应的Date使用的是GMT时间格式,表示响应消息送达时间。
Server:服务器通过这个Server告诉浏览器服务器的类型。
Vary:客户端缓存机制或者是缓存服务器在做缓存操作的时候,会使用到Vary头,会读取响应头中的Vary的内容,进行一些缓存的判断。
Content-Encoding:文档的编码(Encode)方式。用gzip压缩文档能够显著地减少HTML文档的响应时间。
Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
Content-Type:表示响应的文档属于什么MIME类型。
- MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
- MIME作用:HTTP协议所产生的响应中正文部分可以是任意格式的数据,那么如何保证接收方能看得懂发送方发送的正文数据呢?HTTP协议采用MIME协议来规范正文的数据格式。
- 在服务端我们可以设置响应头中Content-Type的值来指定响应类型。
Content-Type | Meaning |
---|---|
application/postscript | PostScript file |
application/vnd.lotus-notes | Lotus Notes file |
application/vnd.ms-excel | Excel spreadsheet |
application/vnd.ms-powerpoint | PowerPoint presentation |
application/x-gzip | Gzip archive |
application/x-java-archive | JAR file |
application/x-java-serialized-object | Serialized Java object |
application/x-java-vm | Java bytecode (.class) file |
application/zip | Zip archive |
audio/basic | Sound file in .au or .snd format |
audio/midi | MIDI sound file |
audio/x-aiff | AIFF sound file |
audio/x-wav | Microsoft Windows sound file |
image/gif | GIF image |
image/jpeg | JPEG image |
image/png | PNG image |
image/tiff | TIFF image |
image/x-xbitmap | X Windows bitmap image |
text/css | HTML cascading style sheet |
text/html | HTML document |
text/plain | Plain text |
text/xml | XML |
video/mpeg | MPEG video clip |
video/quicktime | QuickTime video clip |
application/msword | Microsoft Word document |
application/octet-stream | Unrecognized or binary data |
application/pdf | Acrobat (.pdf) file |
3.3.3 响应体
- 响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。