Tomcat和HTTP

CS和BS

CS和BS是软件架构模式:
C/S:Client/Server:客户端/服务端架构
B/S:Browser/Server:Browser/Server:浏览器/服务器架构

C/S架构

特点:在服务端主要就是一个数据库,把所有业务逻辑以及界面的渲染操作交给客户端完成,运行在电脑桌面。

开发语言:VB、Delphi、BC++、C#、Java awt/swing等:比如桌面QQ,扫雷,印象笔记等

优点:较安全,用户界面很丰富,用户体验不错等

缺点:每次升级都需要重新安装,针对不同的操作系统开发,可移植性差

B/S架构

特点:通过浏览器访问,BS是特殊的CS,此时浏览器充当了客户端,基于HTTP协议。

开发语言:JSP,ASP,PHP等,基于浏览器访问的应用,把业务逻辑交给服务端完成,客户端仅仅只是做页面渲染和数据交换

优点:只开发服务端,可以跨平台,移植性很强等。

缺点:安全性较低,用户体验较差等

现在的应用综合了BS和CS的有点:部分应用不再是单纯BS:

富客户端技术:RIA,客户端会处理部分的业务逻辑,也会做界面的渲染和数据交互,界面丰富好比是CS。EasyUI,Flex,Ext js,Java FX等

瘦客户端技术:基于传统的html界面,客户端只是界面的渲染和数据交互(传统的BS)

Tomcat服务器

Web应用

Web应用就是基于HTTP协议在B/S架构中的服务端的应用程序,它接收客户端浏览器的请求并返回应答结果(通常是以界面的形式)

如果使用:https://coding.ee访问,浏览器按照以下过程去访问服务器:

  1. 浏览器先到:C:Windowsststem32driversetchosts文件中找是否有映射的IP;
  2. 如果没有就会到DNS服务器上找域名对应的IP;
  3. 根据IP找到应用的服务器;
  4. 根据端口号找到在服务器上面安装的web服务器软件;
  5. 服务器软件中根目录文件夹下面的index.html文件

Tomcat简介

JavaWeb应用是由一组Servlet、HTML页面、JSP页面、工具类以及其他可以绑定的资源构成,它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。

Tomcat是一个免费的开放源码的Servlet容器,他是Apache软件基金会的一个顶级项目,由Apache、Oracle和其他一些公司及个人共同开发而成。Tomcat8支持最新的Servlet3.1和JSP2.3规范。

Tomcat用Java语言开发,是一个符合JavaEE标准的Web服务器,但JavaEE中的EJB程序无法在此处运行。

Tomcat安装和运行

Tomcat根目录下的文件和文件夹:

bin:存放了启动/关闭Tomcat等的工具
conf:存放了Tomcat软件的一些配置文件
lib:存放了Tomcat软件启动运行的依赖jar文件
logs:存放了Tomcat日志记录(成功、失败等)
temp:临时目录,比如把上传的大文件存放于临时目录
webapps:里面存放需要部署的javaweb项目
work:工作目录,存放了jsp翻译成Servlet的java文件及字节码文件

Tomcat直接解压后就可以使用,前提是必须配置JAVA_HOME或JRE_HOME

运行Tomcat:点击Tomcat根目录/bin/startup.bat文件

如果Tomcat启动成功,就是要访问到Tomcat软件。通过以下方式访问:

http://Tomcat所在电脑的IP:Tomcat运行的端口/资源名称

在本机上访问地址如下:

http://localhost:8080
http://127.0.0.1:8080

Tomcat常见问题

还没启动Tomcat或者Tomcat启动失败就去访问地址

Tocam启动成功,但是出现404:资源路径写错了
注意:出错之后要习惯去查看日志信息:Tomcat根/logs/catalina.2016-10-1.log

Tomcat下的配置文件的结构不能乱改

要保证XML内容编码和文件本身的编码相同,若有中文,建议使用UTF-8,否则不能使用中文

Tomcat的配置

添加tomcat管理用户:
在conf/tomcat-users.xml中添加:

<role rolename="manager-gui"/>
<user username="root" password="admin" roles="manager-gui"/>

再次启动Tomcat后,就可以访问首页的Server Status和Manager App
与Host Manager

Tomcat默认的端口为8080,可以在conf/server.xml中将其端口号改为80,71行左右

注意:修改完server.xml后要重启tomcat才能生效

部署Web项目

直接给Tomcat指定一个项目的路径(重点)

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <--
        Context中的C和docBase中的B是大写的
        path是指当前项目的虚拟路径,并且该虚拟路径可以是空或者必须以/开头
        如果path是一个""表示当前项目是一个默认的项目
    -->
    <Context path="" docBase="E:\projects\baidu" />
    <Context path="/sina" docBase="E:\projects\sina" />
    <Context path="/google" docBase="E:\projects\google" />
</Host>

在tomcat\conf\Catalina\localhost文件夹下创建一个XML文件用于配置项目路径,如在tomcat\conf\Catalina\localhost下创建google.xml:

<Context docBase="E:\projects\google" />

不用在该内容中指定path,该文件的名字就是当前项目的虚拟路径。可以通过http://localhost:8080/google访问到docBase指向的项目目录

配置虚拟主机

主要解决的问题:可以给一台服务器增加多个默认的虚拟项目路径

增加在server.xml中host节点:

<Host name="www.google.cim" appBase="webapps" unpackWARS="true" autoDeploy="true">
    <Context path="google" docBase="E:\projects\google" />
</Host>

让Host中的name属性的值映射到本机上面,需要修改Hosts文件中内容

C:\Windows\ststem32\drivers\etc\hosts

127.0.0.1 localhost
127.0.0.1 www.baidu.com
127.0.0.1 www.google.com

为的是通过上面的地址访问的时候,将这些域名映射到本机上。

通过域名访问到指定服务器的时候,浏览器会将该域名通过请求头Host的值发送给Tomcat服务器,Tomcat服务器就可以根据Host值在server.xml中找到具体的虚拟主机。一个项目可能有多个域名,那么可以通过给虚拟主机增加别名来增加多个域名。

<Host name="www.google.cim" appBase="webapps" unpackWARS="true" autoDeploy="true">
    <Alias>www.g.cn</Alias><!--别名-->
    <Context path="google" docBase="E:\projects\google" />
</Host>

搭建基于Eclpse的纯的JavaWeb项目

操作步骤:

  1. 搭建一个Java项目
  2. 在该项目下新建一个文件夹,表示根,名为:webapp(名字随意)
  3. 在webapp下新建一个文件夹,名字为WEB-INF
  4. 在WEB-INF中新建一个文件夹,名为classes
  5. 在WEB-INF中新建一个文件夹,名为lib
  6. 去Tomcat根/webappa/ROOT/WEB-INF目录下拷贝一个web.xml文件到WEB-INF下(只保留头和根元素)
  7. 改变项目的输出目录:也就是改变classes的路径,从默认的bin目录改变成webapp/WEB-INF/classes中;
  8. 搞定:以后要把项目给别人,只给webapp目录

给Eclipse安装Tomcat的插件

  1. 挂上代理
  2. 前往:http://marketplace.eclipse.org/content/eclipse-tomcat-plugin
  3. 点击tomcat下的下载按钮
  4. 复制链接:https://devtools.his.de/tomcatplugin/updatesite/
  5. 打开Eclipse -> Help -> Install New Software并在“work with”输入框内粘贴刚刚复制的网址并回车
  6. 如果你的网络足够坚挺就看到“Tomcat Plugin”之后点 “Next”并且同意协议后就可一键安装了

HTTP协议

HTTP概述

WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于 定义WEB浏览器与WEB服务器之间数据交换的过程以及数据本身的格式。HTTP协议的版本:HTTP/1.0、HTTP/1.1、HTTPS2.0

HTTP1.0的特点:浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和相应对。

HTTP1.1的特点:在一个TCP连接上可以传送多个HTTP请求和响应;多个请求和响应过程可以重叠进行;增加了更多的请求和响应头。

体验HTTP协议

HTTP协议的信息分为请求头消息和响应头消息。用来规定服务器和客户浏览器端信息交互的格式。可以安装httpwatch或firebug来查看这些交互数据。

在浏览器上输入 http://localhost:8080后,向服务器发送的请求信息:

Host    
127.0.0.1:8080
User-Agent  
Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/55.0
Accept  
text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Language 
zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding 
gzip, deflate
Connection  
keep-alive

当服务器接收到这些请求的信息头的时候,将会做相应的处理然后发回响应信息:

Server  
Apache-Coyote/1.1
Accept-Ranges   
bytes
ETag    
W/"5931-1489038592000"
Last-Modified   
Thu, 09 Mar 2017 05:49:52 GMT
Content-Type    
text/css
Content-Length  
5931
Date    
Wed, 27 Sep 2017 14:30:14 GMT
.........

上面的信息格式就是HTTP协议定义的数据交互格式,要使用HTTP协议通信,客户端和服务器端必须符合这种格式。

HTTP请求消息的结构

HTTP协议请求消息由一个请求头、若干消息头、以及实体内容构成。其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

在请求信息中第一行为请求行:

格式:请求方式 资源路径 HTTP版本号
请求方式:GET\POST、HEAD、OPTIONS、DELETE、TEACE、PUT

以不同的请求方式传递参数也不同:

  • 如果以GET方式提交的话,请求参数在资源路径的后面
  • 如果以POST方式发送请求的话,请求参数将会通过实体内容传递给服务器

HTTP响应消息的结构

HTTP协议响应消息由一个状态行、若干消息头、以及实体内容构成。其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

响应消息头的第一行为状态行:

格式:HTTP版本号 状态码 原因叙述

响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。

常用响应状态码

200(正常):表示一切正常,返回的是正常请求结果
206(部分正常):客户发送了一个带有Range(要求服务器只返回文档中的部分内容)的GET请求,服务器按要求完成了这个请求
302/307(临时重定向):指出被请求的文档已经被临时移到别处,此文档的新的URL在Location响应头中给出
304(未修改):表示客户机缓存的版本是最新的,客户机应该继续使用它
401(未经授权):表示客户机访问的是一个受口令和密码保护的页面,结合使用一个WWW-Authentication响应头提示客户机应重发一个带有Authorizatioin头的请求消息
404(找不到):服务器上不存在客户机所请求的资源
500(内部服务器错误):服务器端的CGI、ASP、JSP等程序发生错误

  • 100~199:信息状态码,表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
    100(continue)继续发送
  • 200~299:成功状态码,表示成功接收请求并已完成整个处理过程,常用200(OK)成功接收
  • 300~399:重定向状态码,例如,请求的资源已经移动一个新地址,常用302、307和304
  • 400~499:客户端的请求有错误,常用404(Not Found),403(Fobidden)
  • 500~599:服务器端出现错误,常用 500

Get和Post请求的区别

GET方式:

浏览器地址栏:http://localhost/from.index?name=lanyue&age=17
请求行:GET /from.html?name=lanyue&age=17 HTTP/1.1
请求方式是:GET
请求资源是: /from.html?name=lanyue&age=17
请求资源包括请求参数:第一个参数使用?和资源连接,其他的参数使用&符号连接
缺点:保留请求信息,不安全。请求信息不超过1kb,这样就限定了GET方式不能做图片上传
超链接的请求都属于GET方式 
表单中的method=get

POST方式:

浏览器地址栏:http://localhost/from.index#
不再有请求信息:
请求行:POST /from.html HTTP/1.1
POST方式的参数全部在请求的实体中
隐藏了请求信息,较安全:POST方式没有限制请求的数据大小,可以做图片上传。

目前HTTP的请求方式只有两种:GET/POST,分别使用doPost/doGet方法来处理。