day04

一、WEB服务器
1.IE访问web资源的原理:IE浏览器访问某台计算机上的某个端口->web服务器读取资源->将资源以流的形式发送给浏览器
2.常见web服务器:WebLogic、WebSphere、Tomcat(支持servlet,jsp)、Jboss(支持servlet,jsp,ejb),前两个支持J2EE规范(支持13种技术)
3.一些常用端口:http 80、smtp 25、pop3 110、ftp 23、https 443
4.WEB服务器的实现:
import java.net.*;
import java.io.*;
public class Server{
 public static void main(String[] args){
  int port = 3600;
  String path = "c:\\test.html";
  ServerSocket serverSocket = new ServerSocket(port);
  Socket socket = serverSocket.accpet();
  FileInputStream in = new FileInputStream(path);
  OutputStream out = socket.getOutputStream();
  byte[] buffer = new byte[1024];
  int len = 0;
  while((len = in.read(buffer))>0){
   out.write(buffer,0,len);
  }
  serverSocket.close();
  socket.close();
  in.close();
  out.close();
 }
}
二、WEB服务器常见启动问题
1.未配置java_home环境变量:这是因为Tomcat服务器使用java写的,他需要JDk的支持
2.当本地计算机存放多个Tomcat服务器的时候,要注意StartUp的时候,启动的是Catalina_home环境变量(用来指定Tomcat服务器在什么地方)配置的服务器
3.http://www.sina.com->是URL,www.sina.com->是主机名,sina.com->是域名,一个域名下面可以有多个服务器(mail.sina.com,ftp.sina.com)
三、Tomcat的目录结构
1.bin-->Tomcat服务器的一些命令(启动,关闭)
2.conf-->Tomcat服务器的配置文件
3.lib-->Tomcat服务器运行时的支撑jar包
4.logs-->Tomcat服务器的日志文件
5.temp-->存放Tomcat服务器运行时产生的临时文件
6.webapps-->Web应用所在目录
7.work-->Tomcat服务器的工作目录(jsp翻译成servlet后,就在此目录)
四、WEB应用和虚拟目录映射
1.将WEB应用所在目录交给服务器进行管理的过程叫虚拟目录映射
2.虚拟目录映射的两种主要方式:
 a.在server.xml配置文件中添加<Context path="虚拟目录" docBase="WEB应用所在目录"/>节点
  配置服务器的缺省WEB应用<Context path="" docBase="WEB应用所在目录"/>,这种方式要重启服务器
 b.在conf/engineName/hostName/新建一个XXX.xml文件其中XXX就是Context path,并在其中添加<Context docBase="WEB应用所在目录"/>节点,这种方式无需重启服务器
   配置服务器的缺省WEB应用只需将XXX改为ROOT,并在其中添加<Context docBase="WEB应用所在目录"/>节点,要重启
   配置多级虚拟目录,只需将文件名改成如下方式:foo#bar.xml则虚拟目录就是/foo/bar,并在其中添加<Context docBase="WEB应用所在目录"/>节点
3.实际开发中只需将WEB应用放在webapps目录下,服务器会自动映射,所在目录为ROOT的应用会被映射为缺省应用
五、WEB应用的目录结构
1.html,css,jsp,javascript直接放在WEB应用所在目录下,WEB-INF/classes目录下放java类,WEB-INF/lib目录下放支持jar包,通过WEB-INF/web.xml文件可以配置整个WEB应用
六、配置虚拟主机
1.一个Tomcat服务器可以配置多个虚拟主机,配置虚拟主机就是配置一个网站
2.配置虚拟主机,就是在server.xml文件中添加一个<Host name="主机名" appBase="网站目录"></Host>
3.一个网站可以有多个web应用,配置web应用的方法不再赘述。
4.IE通过主机名访问网站的原理:由于现在的计算机网络采用TCP/IP协议,若想访问某台计算机必须通过IP地址,IE从主机中解析出域名,然后访问DNS服务器,寻找域名对应的IP,
通过IP访问某个计算机上的WEB服务器,通过WEB服务器通过主机名来确定要访问的虚拟主机(网站)
5.小细节:其实IE在拿到主机名后并不是直接去访问DNS,而是先访问本机的HOSTS文件,寻找对应的IP,若找不到,采取访问DNS
六、UML描述WEB资源访问流程
1.WEB资源访问流程略
2.将WEB应用打包成WAR,然后发布到服务器,这样服务器会自动解压WAR文件,方法:jar -cvf XXX.war XXX(WEB应用所在目录)
3.在conf/context.xml中的配置会被所有的WEB应用共享。
4.配置<Context reloadable="true">则WEB服务器会自动加载修改过的WEB应用
七、Tomcat的运行体系
1.Server->Service->Connector(通过连接器响应各种请求,如http,https,ajp)->Engine(这里可以配置缺省的虚拟主机)->Host
2.对上图的解释:启动服务器,启动服务,启动多个连接器,启动引擎
八、认识HTTP协议
1.HTTP协议是客户端与主机通信要遵循的格式
2.HTTP协议可以使用TELNET来模拟
3.HTTP协议1.0版,每次建立连接后只能访问一个WEB资源,1.1版,每次建立连接后可以访问多个WEB资源
4.一个很重要的问题浏览器中含有两个<img src="xx.jpg"/>标签,浏览器回会想服务器发三次请求,首先第一次请求页面,拿到html,解析到<img>标签后,会向服务器发送请求,请求图片
 当解析到第二个<img>又会请求一次
九、HTTP请求的细节
1.请求行(请求方式,请求资源,http版本)
2.请求头
 a.accept:客户端支持的数据类型
 b.Accept-Charset:客户端的编码方式
 c.Accept-Encoding:客户端支持的压缩类型
 d.Accept-Language:客户端的语言环境
 e.Host:客户端要请求的主机
 f.If-Modified-Since:上次请求资源的缓存时间
 g.Referer:访问当前资源的前一个资源
 h.User-Agent:客户端的软件环境
 i.Connection:请求结束后,是否关闭连接
十、HTTP响应
1.状态行(HTTP版本,状态码) 200-服务器成功处理客户端请求 302-让客户端重定向  304/307-让客户端拿缓存 403-服务器有资源,但是用户无权限
 404-服务器无资源 500-服务器处理出现问题
2.响应头(服务器通过响应头来控制浏览器如何处理响应数据)
3.响应数据
4.响应头详解:
 a.Location:配合302状态码使用,告诉浏览器重定向的页面
 b.Server:服务器的相关信息
 c.Content-Encoding:响应数据的压缩格式(浏览器接到压缩后的数据后,会根据该压缩类型,进行解压)
 d.Content-Length:回送数据的长度(字节)
 e.Content-Type:回送数据的类型
 f.Last-Modified:服务器通过该头,告诉浏览器当前资源的缓存时间
 g.Refresh:控制浏览器多长时间刷新一次
 h.Content-Disposition:控制浏览器以下载方式打开数据
 i.Transfer-Encoding:告诉浏览器数据的传送格式
 j.ETag:缓存相关的头(服务器为每个WEB资源生成一个串,ETag就是该串,如果WEB资源发生改变,则串就会改变,通过比较客户端带来的ETag和WEB资源的ETag进行比较,就可以知道该WEB资源
 是否被修改过,如果修改过,则不能拿缓存)
 k.Expires:服务器通过该头控制浏览器把本次响应的数据缓存多长时间,-1,0是不缓存
 l.Cache-Control:no-cache;Pragma:no-cache;服务器通过这两个头,控制浏览器是否缓存本次数据(no-cache为不要缓存)

为保证所有浏览器都不缓存,我们要设置以上expires,cache-control,pragma三个头
5.将数据压缩后,发送给浏览器的代码:
  String data = "adadadadadadadadada";
  ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//这是因为数据写到字节数组流之后,比较方便发送
  GZIPOutputStream zipOutputStream = new GZIPOutputStream(outputStream);//将数据以ZIP的格式压缩后写入输出流,带缓存
  zipOutputStream.write(data.getBytes());
  zipOutputStream.close();
  byte[] buffer = outputStream.toByteArray();
  System.out.println("after:"+buffer.length);
  response.setHeader("Content-Encoding", "gzip");
  //response.setHeader("Content-Length",buffer.length);//最好设置一下回送数据长度,不设置服务器会自动设置
  response.getOutputStream().write(buffer);

posted @ 2012-05-23 06:39  xiao秋  阅读(559)  评论(0编辑  收藏  举报