day04

01-web开发入门

WEB开发的相关知识

WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。
Internet上供外界访问的Web资源分为:
•静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。
•动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。
静态web资源开发技术
•Html
常用动态web资源开发技术:
•JSP/Servlet、ASP、PHP等
•在Java中,动态web资源开发技术统称为Javaweb,我们课程的重点也是教大家如何使用Java技术开发动态的web资源,即动态web页面。
 

WEB服务器

学习web开发,需要先安装一台web服务器,然后再在web服务器中开发相应的web资源,供用户使用浏览器访问

这里要求写一个web服务器

 

常见WEB服务器

WebLogicBEA公司的产品,是目前应用最广泛的Web服务器,支持J2EE规范,而且不断的完善以适应新的开发要求,启动界面如图 
 
 
当你将这个服务器用作商业运作时就必须要给钱
另一个常用的Web服务器是IBM公司的WebSphere,支持J2EE规范,启动界面如图
 
这个一旦用于商业运作就必须给钱
 
在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器:Tomcat,该服务器支持全部JSP以及Servlet规范,启动界面如图
我们在后面就用TomCat
 
 

Tomcat服务器

Tomcat官方站点http://jakarta.apache.org
获取Tomcat安装程序包
 tar.gz文件是Linux操作系统下的安装版本
 exe文件是Windows系统下的安装版本
 zip文件是Windows系统下的压缩版本
安装Tomcat
 
双击 bin 目录下的 startup.bat 文件
输入 http://localhost:8080/,显示如下界面代表安装成功
 __________________________________________________________________________________________________________

02-tomcat常见启动故障

Tomcat常见启动问题

1.Java_home环境变量,TomCat其实就是一个java程序,它要启动就必须要告诉java虚拟机在哪里,所以我们必须配置java虚拟机的环境变量
•在windows中设置java_home环境变量
•只要在setclasspath.bat批处理文件第一次使用JAVA_HOME环境变量之前的任何地方,将JAVA_HOME环境变量设置为JDK的主目录,就可以使用startup.bat文件启动Tomcat了。
 
2.端口占用问题
当8080端口被其它程序占用了时就无法运行Tomcat,我们可以使用Fport.exe去查看端口
或者用命令netstat -an查看被占用的端口
服务器一般都是基于配置文件来运行的,所以这里有时候server.xml中的配置也可能导致运行Tomcat运行不了
在Tomcat的配置文件中打开server.xml
 
在这个文件当中我们可以将8080端口改为默认的80端口
改后保存人后重启服务器就可以了,但是我们在开发的时候不要改这个端口,我们只是在部署的时候改这个端口
 
 3.Catalina_home环境变量的设置问题  
 当你的机器上有多个Tomcat服务器,比如你的c盘有一个,你的d盘有个,而你在环境变量中配置的Catlina_home的值是d盘的那个
 
 然后你将web资源放到了c盘的Tomcat服务器中,当你启动c盘中的服务器去访问你存放的那个web资源时始终访问不了
 
 这个是由于当你点击startup.bat的时候,这个startup.bat会去开启你环境变量中设置的Tomcat服务器,而你这里的环境变量是配的d盘中的Tomcat
,D盘中的服务器没有你存放的web资源,所以你访问不到这个资源
 从这里我们可以很清楚的看到,tomcat的启动其实是启动环境变量中配置的Catalina_home
 
————————————————————————————————————————————————————————————————————

03-虚拟目录的映射和web应用组织结构

 Tomcat目录结构

Tomcat 的目录层次结构

bin中存入的是tomcat的启动和关闭文件

conf中存放的是配置文件,其中最重要的文件就是server.xml

lib中存放的是服务器支持的jar包

logs中存放的是日志文件,我们可以通过日志文件查看服务器的运行情况

temp这个目录存放的是临时文件,这个用的不多

webapps这个包存放的是web应用资源,这个文件我们用的最多

work这个是tomcat的工作目录

其它的文件就是一些许可,授权,注意事项什么的

 

WEB应用程序

WEB应用程序指供浏览器访问的程序,通常也简称为web应用。
一个web应用由多个静态web资源和动态web资源组成,如:
•html、css、js文件
•Jsp文件、java程序、支持jar包、
•配置文件等等…..
•组成web应用的这些文件通常我们会使用一个目录组织,这个目录称之为web应用所在目录。
Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。

虚似目录的映射方式

虚似目录的映射有三种方式:

第一种、在server.xml文件的host元素中配置,例如:

 

Context英文中的意思是上下文,这里就翻译成web应用,docBase就是指定你web应用所在目录,path就是指定对外访问的虚拟路径

这里我们给出Contexte元素常用属性

补充知识点:映射缺省web应用。
注意:一个Context即代表一个web应用,context元素在配置文件中除用于映射虚似目录外,它还可用于为web应用配置一些资源,例如:配置web应用使用的数据库连接池,javamail session等(这些本配置以后会用到)。
但是这种配置不好,因为你配置好一个web应用虚拟目录之后,需要重启服务器,这个在实际是不可行的,因为一些网站一旦主机开启就不回关闭

第二种、Tomcat6中,不再建议在server.xml文件中配置context元素,细节查看tomcat服务器关于context元素的说明。

在Tomcat的帮助文档中就说明了这样的话,在这个地方中,而且给出了五种建议,最后一种就是我们上面用的那种在Host中配置

Tomcat Documentation——>Configuration——>Context——>Defining a context

第1个建议是说我们可以在conf文件中的context.xml中配置一个Context,这个Context的信息可以被所有的web应用加载,这个方式说明Context不仅仅代表一个web应用,也代表一些资源,这些资源一点被配置在context.xml中就会被web应用加载

这点我们也可以从context.xml中的配置也可以看出来,只要服务器一启动,所有的web应用都会去检测WEB-INF/web.xml文件的变化

这个建议并不是说的教我们如何配置一个web应用,只是告诉我们在context.xml中配置的文件将会被所有的web资源加载

比如这里的<WatchedResource>WEB-INF/web.xml</WatchedResource>中的web.xml在web应用启动的时候就会去

加载它

第2个建议也不是在教我们如何配置一个web应用

第3个建议就是在教我们如何有效的配置一个web应用的虚拟目录

它这句话中说的是在tomcat文件中的conf/Catalina(也就是它说的enginename目录)/localhost(也就是它说的hostname)文件中配置一个xml文件

这个文件的名字将会被用作虚拟目录路径,多级虚拟目录必须用#隔开,例如:foo#bar.xml就代表/foo/bar这个虚拟目录。如果xml文件的名称设置成

ROOT.xml则主机名就是默认的虚拟目录,这个配置可以在不用重启服务器就有效

 

不同重启服务器我们就可以在浏览器中输入http://localhost:8080/ysfox/dir/index.html访问d:\myweb中的web资源了

 如果这里我们将xml的名字改为ROOT.xml则只输入http://localhost:8080/index.html就可以访问d:\myweb中的web资源了

 

另外这里还说了一种建议

 这个建议将在稍后讲解,这个建议里面说到在MATE-INF中配置一个context.xml文件,我们可以在这个xml文件中配置

 当然最后一种建议就是我们开始使用的那种在在server.xml中配置一个Context,这种是不建议使用的,因为要重启服务器

 

 以上就是Tomcat关于配置context的五种建议
 

第三种、让tomcat自动映射: tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录。换句话说,tomcat服务器webapps目录中的web应用,外界可以直接访问。

这种只是在练习学习的时候用,在实际开发中我们就要将web资源和服务器单独存放的
 
 

WEB应用的组成结构

开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错

web.xml文件

Web.xml文件是整个web应用中最重要的配置文件,它必须放在web-inf目录中。在开发web应用时,但凡涉及到对web应用中的web资源进行配置,通通是在web.xml文件中进行设置。例如:
•某个web资源配置为网站首页
•将servlet程序映射到某个url地址上
•为web应用配置监听器
•为web应用配置过滤器
•……
认识web.xml文件的作用:
•通过web.xml文件把某个web资源配成网站首页。
我们现在要将myweb中的ysfox.html作为首页
首先如何写web.xml,这里我们不用SUN公司的约束文档去写web.xml,我们这里就去抄一个,我们就抄tomcat中的web.xml
我们要抄就抄头抄尾巴
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

       <welcome-file-list>
        <welcome-file>ysfox.html</welcome-file>      <!--这里是欢迎列表->
      </welcome-file-list>

</web-app>

 当我们重启服务器之后,在浏览器中输入http://localhost:8080/myweb,然后直接回车就可以访问ysfox.html

总结:这节课主要讲解配置虚拟目录映射的三种方式和web应用目录的结构,然后还讲解了如何将一个web资源配置成网站首页
_________________________________________________________________________________________________________

 04-回顾

分清几个概念:web应用所在目录,web应用,虚拟目录映射三种方式,缺省的web应用

如果我要某个网站设置成缺省的web应用,则必须在conf\Catalina\localhost目录下创建ROOT.xml指向这个web应用的目录

并且还要在web应用的WEB-INF中的web.xml中配置默认的首页

 

 05-配置虚拟主机

在一个tomcat服务器中可以放置多个网站,所谓配置虚似主机,就是在tomcat服务器中配置一个网站。
如需在WEB服务器中配置一个网站,需使用Host元素进行配置,例:

  <Host name=”site1” appBase=”c:\app”></Host>

配置的主机(网站)要想被外部访问,必须在DNS服务器或windows系统中注册。
配置多个网站,其实就是在server.xml中配置多个Host
缺省虚似主机。

 

现在我们有一个网站ysfox,对外提供新闻服务,也可以对外提供写blog服务 ,那么我这个网站就有两个web应用

这里的ysfox就是网站跟目录,里面的blog和news叫做web应用所在目录,这里的ysfox就对应我的网站,我希望

别人输入www.ysfox.com就可以访问我这两个网站

 

 这里我们就必须到C:\Tomcat 6.0\conf下的server.xml去配置一个Host

 我们可以从这个文件中看见默认的配置就是localhost

 

 现在我们要在后面添加一个Host,然后在Host中添加Context(也就是对应web应用的虚拟映射)

 

配置好之后我们要重启服务器,还是不能访问,理由是电脑在网络上找不到名为www.ysfox.com这样一台主机

这里要注意,当服务器启动的时候,其实启动了两个网站,一个是localhost,一个是我们配置的ysfox

当我们在浏览器中输入http://www.ysfox.com的时候,其实就是访问www.ysfox.com这个主机,而这个主机在实际上没有,所以这里叫做配置虚拟主机

当我们在浏览器中输入http://www.ysfox.com的时候,浏览器会将www.ysfox.com解析成对应的ip,然后根据ip去找这个主机。这里浏览器会通过去找

DNS(域名解析器)去查找对应的域名的ip,不过在这之前它会先去本地的hosts文件中去查找一些有是否域名对应的ip

 

 这里我们既然没有在在DNS中注册www.ysfox.com这个域名,我们只有在hosts文件中去写一个

在hosts文件张我们可以注册多台主机,我们在这里注册一台www.ysfox.com的主机

这个时候我们就可以在浏览器中访问http://www.ysfox.com:8080这个网站下的web应用news下的1.html

 

问题:如果将来我们要在网络上配置一个网站,用户只需输入www.ysfox.com就可以访问我这个网站,那么我部署这个网站需要那些步骤

1.首先我们先将这个www.ysfox.com这个域名买下来

2.在我们的服务器上配置一台www.ysfox.com这样一台主机(也就是在conf下的server.xml中配置一个Host),并且指定web应用

3.登陆DNS管理页面设置域名(也就是所以的将域名和ip绑定,将你存放网站的固定ip和这个域名绑定)

 

 以上就是教大家如何去部署一个网站

 我们再来配置一个google的网站

 这里Context中的path什么都没有写,表示将mail设置为缺省的web应用

 然后我们将端口改为80端口

 

然后我们在hosts中配置一个ip和域名

 然后我们重启服务器

这个时候我们就可以直接访问http://www.google.com/1.html了,这里我们不需要指定端口和web应用

如果我们这里想直接访问http://www.google.com就可以直接访问mail中的1.html,则我们可以在mail这个web

应用中建立一个WEB-INF,然后在WEB-INF这个文件中建立一个web.xml,然后在这个web.xml文件中抄一个Tomcat

的头和尾,然后在添加一个欢迎首页

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

     <welcome-file-list>
        <welcome-file>1.html</welcome-file>
    </welcome-file-list>

</web-app>

 

 配置缺省的虚拟主机

 在server.xml中Host标签是配置一太主机的,我们知道可以配置多个虚拟主机(也就是多个Host),而Host又是Engine的子标签,在Engine这个标签中

就可以指定缺省的虚拟主机,如图,下面这段xml代码表示当tomcat服务器启动的时候会去启动一个名称为Catalina的引擎,这个引擎会处理客户端的请求,

当用户没有指定访问那台主机,引擎就会默认访问localhost这个台主机,所以我们要配置一个缺省的虚拟主机,就可以给defaultHost配置一个主机名就可以了

 

 这里我们要明白,当我们在浏览器中输入www.sina.com的时候其实这个www.sina.com起了两个作用,

1.浏览器拿到这个域名之后回去查找DNS中的对应的ip

2.在通过ip访问服务器的时候会将这个域名拿给服务器,表示我要访问服务器中的这台主机

如果我们在浏览器中没有输入域名而是直接输入ip地址,则浏览器就会跳过DNS直接去访问服务器中缺省的虚拟主机

当服务器中有多个网站,其它非虚拟主机的网站则访问不了了,所以一般在服务器中只配置一个网站

 

到这里我们就必须搞清楚几个概念

什么是web应用所在目录:web应用所在目录就是装web的各种应用的目录,比如一个网站中有多个web应用,有news,mail,blog等web应用

什么是网站跟目录:所谓网站跟目录就是装web的各种应用的目录

什么是虚拟目录的映射:所谓虚拟主机的映射就是在server.xml中配置的Context,这个Context中配置path是指向web应用的目录(也就是配置的虚拟目录映射到web应用)

什么是虚拟主机:所谓虚拟主机就是在server.xml中配置的Host,这个Host配置的虚拟目录name指向的是网站的根目录

什么是缺省虚拟主机:所谓缺省虚拟主机就是在server.xml中Engine标签中deautHost指定的默认主机

 

画图演示web资源的访问过程

下面我们通过Rose来画一个web资源访问的过程

 

总结:这节课主要讲解虚拟主机的配置,缺省虚拟主机的配置,web访问的过程图

___________________________________________________________________________________________________________

06-web服务器的一些小细节

 其它问题

打包web应用 war
为什么要打成war包,打成war包是为便于传送,服务器可以自动识别war包
我现在想将c盘下的blog这个web应用打成war包
我们可以通过java提供的打包命令jar来打包

 

然后我们将这个war包直接扔到tomcat服务器中的webapps文件下,当服务器一启动就可以直接将这个

war包解压

 

配context元素的reloadable元素,让tomcat自动加载更新后的web应用

我们已经知道在server.xml中配置的Context代表web应用

 

 当我们在Context中加上reloadable="true"则表示当我们修改web应用后可以自动加载classes中跟新的内容

 这个可以在不重启服务器的情况下就可以更新web应用的内容,在我们实际开发中我们不要开启这个属性
应为在实际开发中项目一大,在每次修改后服务器都会去加载web应用,这样会导致服务器不停的加载
,如果加载的项目很大就会导致服务器奔溃
 
 
Tomcat的体系结构和配置https连接器  公钥  私钥
•keytool -genkey -alias tomcat -keyalg RSA
 
前面我们知道,Tomcat的启动什么都是通过server.xml中配置的,你在server.xml中配置了什么就会启动什么
我们可以通过这个图来看,也可以通过server.xml中的配置去看
 
Tomcat体系结构图
我们现在通过这个图和server.xml来看看Tomcat的这个服务器是有那些模块组成的
从server.xml中的开始我们可以看见Server这个标签
这个表示当Tomcat服务器一启动起来就会执行一个名为Server的程序,这个程序对应的端口是8005
这个我们也可以从图上看见,当Server启动之后就会启动Service这个程序
这个Service的名称为Catalina
当Service启动之后就会启动多个连接器Connector,我们的客户机就是通过连接器连接服务器的
这个连接器监听80端口
这个连接器监听8009端口,这个连接器是和其它服务器集成的,比如Tomcat和Apache服务器集成就通过这个连接器
有了连接器之后就会启动一个引擎Engine
在引擎中就去找对应的主机Host
主机收到后就会去找对应的web应用
 
现在我们要来配置一个加密的连接器https
通常我们访问网站的连接器都是没有加密的,但是银行等安全性要求高的网站的连接器就必须加密
否则坏人用网络探针就可以将你的信息得到
 
这里加密分为对称加密和非堆成加密
所谓对称加密就是加密解密用的都是同样的密码,但是对于对称加密如何告诉对方密码,容易导致
信息泄露,所以对称加密安全性并不高
而所谓的非对称加密就是加密解密用的不是同一个密码,非对称加密拥有公钥和私钥,公钥加密
只能私钥解开,私钥加密只能私钥解开,但是由于在一对一的访问中,如果有第三个人对他们之间的
数据进行拦截,将不能保证公钥是安全的,所以这个时候出现了第三方机构(比如ca)专门来证明
公钥的安全性,这个数字证书就是用来证明公钥是安全的,当在一对一的访问中,另一方拿到了数字证书都
会去ca机构确认数值证书的安全性,从而避免了第三个人的拦截
 
这里还要注意一点,虽然ca机构证明了公钥的安全性,但是第三个人任然可以拦截到数据,将数据篡改
然后发给对方,为了防止这种问题,就必须用私钥加密,公钥解密,确认数据不是第三个人发的
也就是所谓的数字签名,这样即使第三个人拦截了数据进行了篡改,发给对方,对方也不回去解密,
因为它没有第三个人的公钥
 
所以这里要明白在非对称加密中公钥和私钥有两个作用
一是通过公钥加密,私钥解密,第三方机构担保公钥的安全性(也就是所谓的数字证书)
二是通过私钥机密,公钥解密,保证数据是对方发送,并没有被第三个人篡改
 
而在实际银行中并不是用的这种公钥加密,私钥解密来进行交互的,因为这种方式效率太低
在实际银行中是这样的,加入我银行,银行向我出事一份数字证书,这个数字证书包含了银行的公钥
然后在我这方验证公钥之后,就会用随机产生一个秘钥,我通过银行公钥将这个秘钥加密发给银行,
银行通过它的私钥解密之后就会通过这个随机秘钥和我这样交互
 
现在我们就来为localhost网站生成一个数字证书
我们可以通过如下命令在cmd下产生一个数字证书
keytool -genkey -alias tomcat -keyalg RSA
由于数字证书都是通过秘钥库管理的,所以这里我们要输入秘钥库的密码,首次输入要自己设定
并且这里输入密码时是不可见的,还有这里一样注意在"的的名字和姓氏是什么?"这个行必须输入
你的网站主机名,这个很重要,因为你这个数字证书就是给localhost生成的
最后注意一点我们生成的数字证书在users\Administrator这个目录下
 
接着我们在server.xml中配置一个全新的连接器,这个连接器就是加密的,一旦有访问就会给你出事
一份数字证书
其实在server.xml中已经有配置了加密的连接器,只是注释了,端口8443这个拦截器就是一个加密的连接器
而在实际开发中我们可以将8443端口改为443端口,这个443就是https的默认端口,不用输入也可以访问
我们将其注释打开,然后告诉它数字证书的位置
这里如何告诉加密连接器数字帧数的位置,我们可以通过tomcat中的the HTTP Connector帮助文档的SSL处来查看
我们可以通过keystorePass来指定数字证书的密码,keystoreFile指定数字证书的位置
这里我们一搬将数字证书文件剪切到tomcat服务器的conf这个文件下
这样我们就配置好一个加密的连接器,这个时候我们重启服务器在浏览器中输入
https://localhost:8443
就会出现安全警告,因为我们这个数字证书没有在CA担保过,所以要出警告
但是我们仍然可以继续访问
当然我们还可以将这个数字证书安装,这里省略
这里注意,我们这里做的只是单向的加密,我们这里只做了浏览器通过服务器的公钥加密发给服务器,服务器的数据没有加密发给浏览器
如果要是吸纳双向加密,这里我们不在讨论,可以去查看一些具体教程
总结:安装一个加密的连机器的步骤
 
 
Tomcat服务器的管理平台
Tomcat内置了一个管理平台,这个管理平台可以删除一个web应用,停用一个web应用,等等
我们可以通过Tomcat Manager进入管理平台
 
进入管理平台需要密码和用户,这里我们可以在conf中的tomcat-users.xml中去配置密码和用户名
默认的密码和用户是没有配置的
我们将注释打开,这里就有了两个角色和三个用户,但是我们重启服务器之后任然访问不了,这个是因为上面配置的角色的权限不够
我们需要配置一个超级角色manager,然后激昂tomcat用户的角色改为manager和tomcat两种身份
这个时候我们重启服务器就输入用户名tomcat,密码tomcat就可以直接进入管理平台了
在管理平台中列出了所有的web应用,我们可以通过点击start开启web应用,stop停止web应用,reload重新加载web应用,undeploy删除web应用
还可以上传一个war文件到服务器,这个就可以实现远程上传web应用,我们可以将web应用打包成war文件,然后远程登陆web服务器管理平台,然后
上传war文件到服务器
总结:这节课讲解了五点:1.将web资源打成war包,2.配置web资源的自动加载,3.tomcat体系结构,4.为localhost网站生产数字证书,5.Tomcat管理平台
————————————————————————————————————————————————————————————————————

 07-作业

 
webapps目录下创建一个可供外界访问的web应用。

server.xml文件中进行配置,把c:盘下的某一个web应用映射成可供外界访问的虚似目录。

catalina/localhost目录下进行设置,把c:盘下的某一个web应用映射成可供外界访问的虚似目录。
 
server.xml文件中配置一台www.itcast.cn的虚似主机,然后在window系统中注册www.itcast.cn这台主机。

在虚似主机的根目录中创建一个名称为itcastweb应用,并在该应用下创建一个index.html页面,然后把web应用映射成缺省web应用。index.html页面设置为web应用的首页。

web服务器端口更改为80端口。

画图说明浏览器是如何访问到web服务器下的web主机下的web应用下的web资源的
 
务必要自己亲知练习一次
 ———————————————————————————————————————————————————————————————————————
 

 08-http协议简介和请求行

 在前面我们介绍了ie和服务器交互图,其中http请求和http响应就是我们今天的注意课题
 
 
 

1.什么是HTTP协议

客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。
使用telnet程序连上web服务器,并使用HTTP协议获取某个页面,快速了解 HTTP协议的作用。
安装IE浏览器插件HttpWatch,查看IE浏览器通过HTTP协议获取某个页面。
 
这里我们使用telnet连接我们的本地的主机localhost的8080端口,也就是访问我们本地tomcat服务器中的localhost这个主机的web应用
这样虽然连接了服务器,但是这样访问主机的资源,服务器是没有反应的,因为你没有遵守客户端与web服务端通讯的协议,也就是http协议
这里由于在telnet中操作,如果时间过久就会与服务器断开连接,所以,我们需要在记事本中将代码写好
然后直接在telnet中执行
步骤:
1.我们先连接服务器
2.请求访问那个主机的那个web应用
这里要注意,我们事先将请求在记事本中写好,然后再粘贴到命令行中,这里要搞快点,不快点的话,telnet将会和服务器断开连接
还有这个要注意,这个请求有两次回车
GET /a/1.html HTTP/1.1        //这里我们通过请求获取web应用a中的1.html资源,协议是HTTP/1.1
Host:localhost             //这里指定要访问那个主机
//第一次回车到这里
//第二次回车到这里
之后就会收到服务器的响应,响应中包括了响应消息和响应数据
 
 

 2.HTTP协议简介

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。
HTTP协议的版本:HTTP/1.0、HTTP/1.1
 

 3.HTTP1.0和HTTP1.1的区别

在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
使用telnet举例说明。
一个好多同学搞不清楚的问题:
•一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求。

 

这里我们就来做个实验,验证http1.0和http1.1的区别

首先我们在记事本中写好请求消息

然后链接localhost主机

我们回车之后发现telnet默认是不能回显的,这是为了安全问题,如果想回显,我们可以按快捷键Ctrl+],然后再回车就可以回显示了

之后我们粘贴请求消息就可以看见请求的数据了,这里要注意请求消息头后面要有两个回车

这里我们用的是http1.1,http1.1的特点是拿到web资源的之后不会断开与web资源的链接

我们可以在上一次链接的基础上继续下一个web资源的链接

然后我们退出与服务器的链接,也就是输入一个quit

退出之后我们来测试http1.0

首先链接主机

回车之后按Ctrl+],在回车,回显

然后我们粘贴http1.0的请求协议,这里要搞快点,否则就会与服务器断开连接

输入了请求协议,两次回车之后,得到服务器的响应以后,我们返现与服务器之间的链接断开了

 

然后第二个问题,在一个web资源中,一个img标签就是一个资源,当浏览器访问这个img时就是一个请求

所以如下图的一个web应用就有3个img标签

那么在访问这个资源的时候就会有4个请求,第一个请求是访问这个1.html这个资源,其它三个是访问img的,所以有四个

所以在开发页面的时候一点要减少页面的请求数量

比如这里的页面资源,有三个图片我们就应该将其合成一个图片

在比如,页面中的css和javascript尽量将多个css和javascirpt合并到一个css和javascript中减少请求数

这些都是网站访问性能的细节

 

4.HTTP请求

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:

  一个请求行、若干消息头、以及实体内容,如下所示

5.HTTP请求的细节——请求行

请求行中的GET称之为请求方式,请求方式有:
•POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
•常用的有: GET、 POST
•用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
•如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
•GET /mail/1.html?name=abc&password=xyz HTTP/1.1,但是这种方式没有保密性
•GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
•如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。这里说的请求实体内容就是请求数据中

6.HTTP请求的细节——消息头

用于HTTP请求中的常用头
•Accept: text/html,image/*             //浏览器通过这个消息头告诉服务器我这个浏览器支持什么样的数据类型
•Accept-Charset: ISO-8859-1          //浏览器通过这个消息头高数服务器我这个浏览器支持什么样的字符集编码
•Accept-Encoding: gzip,compress        //浏览器通过这个消息头告诉服务器我这个浏览器支持什么样的压缩格式
•Accept-Language: en-us,zh-cn        //浏览器通过这个消息头告诉服务器我这个浏览器所采用的语言,前面是语言,后面是构架
•Host: www.it315.org:80            //浏览器通过这个消息头告诉服务器我想访问你那个主机
•If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT  //浏览器通过这个消息头告诉服务器我这个浏览器缓存数据的时间是多久
•Referer: http://www.it315.org/index.jsp      //浏览器通过这个消息头告诉服务器我是从哪个网页点过来的,这个在开发里面很有用,主要做防盗链
当我们点击某个超链接的时候,到了指定的页面,到指定页面时会验证这个消息头中的来源文件是否是我指定的来源文件,如果是就让它访问我这个资源,如果不是则不让它访问,从而判断是否是盗链
•User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)  //浏览器通过这个消息头告诉服务器当前操作系统和浏览器的版本号,这里的Mozila/4.0就是IE,而这里的Windows NT 5.0其实就是XP系统
•Cookie                    //这个是cookie,将在专题中讲解
•Connection: close/Keep-Alive          //浏览器通过这个消息头告诉服务器当我得到了资源之后是否断开和服务器的链接,close表示断开Keep-Alive表示链接
•Date: Tue, 11 Jul 2000 18:23:51 GMT    //浏览器通过这个消息头告诉服务器我当前访问的时间

以上是HTTP协议里面常用的请求头

这个里面的UA-CPU: x86表示当前系统的环境为

 

7.HTTP响应

一个HTTP响应代表服务器向客户端回送的数据,它包括:一个状态行、若干消息头、以及实体内容 。

8.HTTP响应的细节——状态行

状态行

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

  举例:HTTP/1.1 200 OK

状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:

300~399表示当客户端请求服务器某个资源时,服务器要求客户端去请求其它资源,这个好像别人找我借钱,我没有,我叫他向其它人借

这个就是302状态码的含义,这个302状态码在网站上用的特别多,比如登陆,当我在登陆页面提交数据的时候服务器就会转到其它首页上面去

这里的304和307是相同的含义,表示当客户端访问服务器,服务器却说我这个数据没有更新,叫客户机去自己的缓存中找资源

404表示客户端找的资源不存在

500表示服务器端出现错误

 

9.HTTP响应细节——常用响应头

HTTP请求中的常用响应头
•Location: http://www.it315.org/index.jsp        //这个响应头通常配合302状态码使用,它告诉浏览器,要浏览器去找那个资源
•Server:apache tomcat                  //这个消息头表示服务器是什么类型,Apache-Coyote/1.1就是tomcat
•Content-Encoding: gzip                 //这个消息头表示服务器会送数据采用的是什么压缩格式
•Content-Length: 80                   //这个消息头表示服务器告诉浏览器压缩数据的长度
•Content-Language: zh-cn                //这个消息头表示服务器告诉浏览器我这个服务器语言和国家
•Content-Type: text/html; charset=GB2312     //这个消息头用于告诉浏览器回送数据的类型,这个消息头很有用,具体的类型可以在web.xml中查找
•Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT   //这个消息头用于高数浏览器数据最后修改的时间
•Refresh: 1;url=http://www.it315.org        //这个消息头用于控制浏览器定时刷新,这个技术用在聊天室,每隔多少时间就刷新一次,这里还可以在时间后面指定刷新到那个页面
•Content-Disposition: attachment; filename=aaa.zip    //这个消息头表示服务器告诉浏览器以下载方式打开回送的数据,后面跟的是下载文件的名称
•Transfer-Encoding: chunked                //这个消息头表示服务器告诉浏览器数据是以分块形式回送的,在HttpWatch中我们可以看见
每块的大小
•Set-Cookie:SS=Q0=5Lb_nQ; path=/search       //服务器通过这个消息头向浏览器回送一个cookie,cookie将在后面有专题讲解
•ETag: W/"7777-1242234904000"             //这个消息头也是用于缓存的,每个网页都有一个编号,当这个网页做出修改了,这个网页的编号也随之改变,但浏览器访问服务器某个资源的时候,服务器会将ETag和数据一起回送给浏览器,当浏览器下次访问服务器这个资源的时候浏览器会带着相同的ETag过去,如果带过去的ETag和服务器那边资源的ETag一致的话表示网页没有被更新,那么这个时候服务器就会叫浏览器去拿它自己缓存中的数据,如果浏览器带过去的Etag和服务器端的ETag不一致则表示服务器端的资源更新了,这个时候服务器就会将新的资源和ETag回送给浏览器,这个ETag可以精确到毫秒,而开始我们讲的If-Modified-Since这个只能将缓存精确到秒
•Expires: -1                       //这个消息头用于说明网页的失效时间,当它的值是0或者是-1表示通知浏览器不要缓存这个页面,也就是说我这个页面永不失效,如果是正值则表示t在这段时间之内网页不会失效,浏览器在这段时间内就可以从它的缓存中取数据
•Cache-Control: no-cache                 //这个消息头也是通知浏览器不要缓存
•Pragma: no-cache                     //这个消息头也是通知浏览器不要缓存,为什么有这么多个消息头通知浏览器不要缓存,这是由于现在的浏览器很多种,通知不同浏览器不要缓存的的方式不同,如果想要控制所有的浏览器不要缓存,那么就必须将上面三个都加上,比如股票网站就要求所有的浏览器不要缓存,所以股票网站就必须同时加上三个通知浏览不要缓存的响应头
•Connection: close/Keep-Alive               //这个消息头表示服务器通知浏览器当得到数据之后是断开和服务器的连接还是保持连接  
•Date: Tue, 11 Jul 2000 18:23:51 GMT         //这个消息头表示回送数据的时间 

 

以上就是常用的http响应头

下面我们写一个servlet来演示HTTP响应头

 Location这个消息头通常和302状态码一起使用,当客户端访问服务器时,服务器会给客户端浏览器响应这个消息头,叫客户端浏览器访问其它资源

/day04/src/cn/itcast/servlet/ServletDemo1.java

package cn.itcast.servlet;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //设置状态码为302,表示通知浏览器访问其它资源
        resp.setStatus(302);
        //这里通知浏览器访问day04下的1.jsp这个资源
        resp.setHeader("Location", "/day04/1.jsp");
        
    }
    
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
        doGet(req, resp);
    }

    
}

 /day04/WebRoot/1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '1.jsp' starting page</title>
  </head>
  
  <body>
    This is my JSP page
  </body>
</html>

 

 Content-Ecoding和Content-length经常一起使用用来压缩数据,然后再将压缩后的数据回送给服务器

/day04/src/cn/itcast/servlet/ServletDemo2.java

package cn.itcast.servlet;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //这里有一段数据
        String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        //比较一下压缩前后数据的大小
        System.out.println("压缩前数据的大小:"+data.getBytes().length);
        //我们现在需要将这段数据压缩后回送给浏览器
        //既然要压缩我们就得找压缩的工具,在java中提供了一个压缩流GZIPOutputStream
        //我们可以将这段数据压缩之后写入到底层流中,这里的底层流其实就是一个字节数组流
        //byteArrayOutputStream
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(out);
        //将数据写入到底层数组流中
        gzip.write(data.getBytes());
        //这里一定要注意关闭流,这样才能将数据刷新到底层流中,因为这个压缩流是一个包换流
        //包装流都是缓冲的,如果数据没有写满缓存是不会自动刷新的,所以这里必须关闭,这样
        //才能将数据写入到底层流中
        gzip.close();
        //获取到底层流中压缩的数据
        byte[] b = out.toByteArray();
        //比较一下压缩前后数据的大小
        System.out.println("压缩后数据的大小:"+b.length);
        //再将数据写给浏览器之前需要通知浏览器我采用的是什么方式的压缩格式以及压缩数据的长度
        resp.setHeader("Content-Encoding", "gzip");
        resp.setHeader("Content-length", b.length+"");
        //将底层流中的数据回显给浏览器
        resp.getOutputStream().write(b);
        
    }
    
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

 在浏览器中我们访问ServletDemo2

http://localhost:8080/day04/servlet/ServletDemo2

然后在MyEclipse中就看见数据压缩前后的压缩大小

 但是这个要注意,这个必须要求压缩的字符串数据,这个数据要求要大一些,才能更好的压缩,不然数据小了压缩则反而更大

 

 然后我们来测试一下Content-Type,这个响应头表示服务器告诉浏览器我这回送的数据是什么类型,在写Content-Type(大小无所谓),我们可以在Tomcat中的web.xml中查看各种类型的具体值

由于这里的类型实在很多,我们这里只列举小部分

/day04/src/cn/itcast/servlet/ServletDemo3.java

package cn.itcast.servlet;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo3 extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //首先设置响应消息头,这里响应头可以在web.xml中查找
        //这里是jpg图片的格式就就是image/jpeg,如果此处我们将类型改成text/plain,则浏览器会以文本来打开数据,但是大部分的浏览器比较智能可以识别
        resp.setHeader("Content-Type", "image/jpeg");
        //通过servletContext将图片读取到流中,注意此处图片的位置
        InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
        //将流中的数据写入到response输入流中,这样就将数据回送给客户端
        OutputStream out = resp.getOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len=in.read(buffer))>0){
            out.write(buffer, 0, len);
        }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

 

接下来我们测试refresh这个响应头,这个响应头表示服务器告诉浏览器多少时间刷新一次,这个响应主要用于聊天室或者股票

/day04/src/cn/itcast/servlet/ServletDemo4.java

package cn.itcast.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo4 extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //这个响应表示服务器告诉浏览器,每隔3秒就访问这个servelet一次
        //resp.setHeader("Refresh", "3");
        //我们也可以在时间后面添加一个url表示每隔多少时间访问一次指定的网站
        resp.setHeader("Refresh", "3;'http://www.baidu.com'");
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

 

然后我们来演示Content-Disposition这个消息头,这个消息头表示服务器告诉浏览器用下载的方式打开回送的数据

/day04/src/cn/itcast/servlet/ServletDemo5.java

package cn.itcast.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo5 extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //这里设置的头表示服务器告诉浏览器用下载的方式处理回送数据,并且给出了下载书记的名称
        resp.setHeader("Content-Disposition", "attachment;filename=a.jpg");
        //将图片读取到流中
        InputStream in = this.getServletContext().getResourceAsStream("/1.jpg");
        //将流中的数据回送给浏览器
        OutputStream out = resp.getOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len=in.read(buffer))!=-1){
            out.write(buffer,0,len);
        }
        //记得要关闭流
        in.close();
        out.close();
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

 以上演示了常用的响应头

 ——————————————————————————————————————————————————————————————————————

10-http响应与断定续传

 9.HTTP实用头字段

HTTP请求头字段
•Range头指示服务器只传输一部分Web资源。这个头可以用来实现断点续传功能。Range字段可以通过三种格式设置要传输的字节范围:
•Range: bytes=1000-2000

传输范围从1000到2000字节。

•Range: bytes=1000-

         传输Web资源中第1000个字节以后的所有内容。

•Range bytes=1000

         传输最后1000个字节。

HTTP响应消息头字段
•Accept-Ranges:这个字段说明Web服务器是否支持Range,支持则返回Accept-Ranges: bytes,如果不支持,则返回Accept-Ranges: none.
•Content-Range:指定了返回的Web资源的字节范围。这个字段值的格式是:例子: Content-Range:1000-3000/5000
 
现在我们就来演示浏览器断点续传的功能
/day04/src/cn/itcast/servlet/Demo1.java
package cn.itcast.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


//我们这里要模拟浏览器向服务器发送http请求,实现断点续传,我们这里就需要用到URLConnection这个类
//这个类就代表浏览器,其实这里的断点续传相当于下载,当断网时只下载一部分内容,当联网时又可以继续下载
public class Demo1 {

    public static void main(String[] args) throws IOException {
        //表示浏览器要访问这个资源
        URL url = new URL("http://localhost:8080/day04/1.txt");
        //得到一个URLConnection,这里就相当于连接上了web服务器
        //URLConnection conn = url.openConnection();
        //由于这里访问的资源是http开头的,所以我们这里获取的连接是一个HttpURLConnecion
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        
        //然后我们向服务器发送断点续传的请求头,这里表示传送10个字节以后的所有内容
        conn.addRequestProperty("Range", "bytes=10-");
        
        //通过HttpURLConnextion将资源读取到流中
        InputStream in = conn.getInputStream();
        int len = 0;
        byte[] buffer = new byte[1024];
        //这里是以追加的方式写入到1.txt中
        FileOutputStream out = new FileOutputStream("c:\\1.txt",true);
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        //记得关流
        in.close();
        out.close();
    }

}

 10.作业

请写一篇关于HTTP协议的笔记,要求:
•描述清楚HTTP请求、响应的格式
•请求头和响应头中各个头字段的含义
如果浏览器传递给WEB服务器的参数内容超过1K,应该使用那种方式发送请求消息?
请描述200、302、304、404和500等响应状态码所表示的意义。
请列举三种禁止浏览器缓存的头字段,并写出相应的设置值。
 
 
 
 
 
 
 
posted @ 2013-12-03 17:50  ysfox  阅读(280)  评论(0)    收藏  举报