• 总结:web 发展的4个阶段


    一、概述

      随着人们的需求发展,web技术的发展也经历了多个阶段,下一个阶段总是伴随着解决上一阶段的问题,从静态文本、动态执行、动态自动生成文本,web应用,到web2.0,本文就详细描述这些阶段的特征。

    特别说明,本文主要是参考《Tomcat 与java web开发技术详解》(第二版)孙卫琴著,此书介绍的非常详细。

        简述一下,web发展的目前4个阶段如下:

        

    (1)静态文档阶段。

    (2)浏览器提供的用户动态交互阶段

    (3)服务器端提供的用户动态交互阶段

    (4)web应用阶段

    (5)web 2.0阶段

    二、静态文档阶段。

    1、特点:

      用户只能查看静态HTML文档,或者通过点击超链接,看到的还是静态文档的内容,不能参与交互操作。

    2、浏览器和服务器端的交互过程

    3、代码示例与运行结果

      服务器端代码:

            

      1 package server;
      2 import java.io.*;
      3 import java.net.*;
      4 
      5 public class HTTPServer{
      6   public static void main(String args[]) {
      7     int port;
      8     ServerSocket serverSocket;
      9       
     10     try { 
     11        port = Integer.parseInt(args[0]);
     12      }catch (Exception e) {
     13        System.out.println("port = 8080 (默认)");
     14        port = 8080; //默认端口为8080
     15      }
     16 
     17      try{
     18        serverSocket = new ServerSocket(port); 
     19        System.out.println("服务器正在监听端口:" + serverSocket.getLocalPort());
     20         
     21        while(true) { //服务器在一个无限循环中不断接收来自客户的TCP连接请求
     22          try{
     23            //等待客户的TCP连接请求
     24            final Socket socket = serverSocket.accept(); 
     25            System.out.println("建立了与客户的一个新的TCP连接,该客户的地址为:"+
     26                 socket.getInetAddress()+":" + socket.getPort());
     27           
     28            service(socket);  //响应客户请求
     29         }catch(Exception e){e.printStackTrace();} 
     30       } //#while
     31     }catch (Exception e) {e.printStackTrace();}
     32   }
     33 
     34   /** 响应客户的HTTP请求 */
     35   public static void service(Socket socket)throws Exception{
     36     
     37     /*读取HTTP请求信息*/
     38     InputStream socketIn=socket.getInputStream(); //获得输入流
     39     Thread.sleep(500);  //睡眠500毫秒,等待HTTP请求  
     40     int size=socketIn.available();
     41     byte[] requestBuffer=new byte[size];
     42     socketIn.read(requestBuffer);
     43     String request=new String(requestBuffer);
     44     System.out.println(request); //打印HTTP请求数据
     45      
     46     /*解析HTTP请求*/
     47     //获得HTTP请求的第一行
     48     String firstLineOfRequest=request.substring(0,request.indexOf("
    "));
     49     //解析HTTP请求的第一行 
     50     String[] parts=firstLineOfRequest.split(" ");
     51     String getMethod = "GET";
     52     if(true != parts[0].equals("GET"))
     53     {
     54         System.out.println("client Bad request:" + parts[0] + " method length=" + parts[0].length() ); //打印错误的请求
     55         System.out.println("correct request is:" + getMethod ); 
     56     }
     57     
     58     String uri=parts[1]; //获得HTTP请求中的uri
     59     
     60     /*决定HTTP响应正文的类型*/
     61     String contentType;
     62     if(uri.indexOf("html")!=-1 || uri.indexOf("htm")!=-1)
     63       contentType="text/html";
     64     else if(uri.indexOf("jpg")!=-1 || uri.indexOf("jpeg")!=-1)
     65       contentType="image/jpeg";
     66     else if(uri.indexOf("gif")!=-1) 
     67       contentType="image/gif";
     68     else
     69       contentType="application/octet-stream"; 
     70     
     71     
     72     /*创建HTTP响应结果 */
     73     //HTTP响应的第一行
     74     String responseFirstLine="HTTP/1.1 200 OK
    ";
     75     //HTTP响应头
     76     String responseHeader="Content-Type:"+contentType+"
    
    ";
     77     //获得读取响应正文数据的输入流
     78     InputStream in=HTTPServer.class.getResourceAsStream("root/"+uri);
     79     
     80     /*发送HTTP响应结果 */
     81     OutputStream socketOut=socket.getOutputStream(); //获得输出流
     82     //发送HTTP响应的第一行
     83     socketOut.write(responseFirstLine.getBytes());
     84     //发送HTTP响应的头
     85     socketOut.write(responseHeader.getBytes());
     86     //发送HTTP响应的正文
     87     int len=0;
     88     byte[] buffer=new byte[128];
     89     while((len=in.read(buffer))!=-1)
     90     socketOut.write(buffer,0,len);  
     91     
     92     Thread.sleep(1000);  //睡眠1秒,等待客户接收HTTP响应结果        
     93     socket.close(); //关闭TCP连接  
     94     
     95   }
     96 }
     97 
     98 
     99 
    100 
    101 /****************************************************
    102  * 作者:孙卫琴                                     *
    103  * 来源:<<Tomcat与Java Web开发技术详解>>           *
    104  * 技术支持网址:www.javathinker.org                *
    105  ***************************************************/

      客户端代码:

      

     1 package client;
     2 import java.net.*;
     3 import java.io.*;
     4 import java.util.*;
     5 
     6 public class HTTPClient {
     7   public static void main(String args[]){
     8     //确定HTTP请求的uri
     9     String uri="index.htm";
    10     if(args.length !=0)uri=args[0]; 
    11     
    12     doGet("localhost",8080,uri); //按照GET请求方式访问HTTPServer 
    13   }
    14   
    15   /** 按照GET请求方式访问HTTPServer */
    16   public static void doGet(String host,int port,String uri){
    17     Socket socket=null;
    18     
    19     try{
    20       socket=new Socket(host,port); //与HTTPServer建立FTP连接
    21     }catch(Exception e){e.printStackTrace();}
    22   
    23     try{
    24       /*创建HTTP请求 */
    25       StringBuffer sb=new StringBuffer("GET1 "+uri+" HTTP/1.1
    ");
    26       sb.append("Accept: */*
    ");
    27       sb.append("Accept-Language: zh-cn
    ");
    28       sb.append("Accept-Encoding: gzip, deflate
    ");
    29       sb.append("User-Agent: HTTPClient
    ");
    30       sb.append("Host: localhost:8080
    ");
    31       sb.append("Connection: Keep-Alive
    
    ");
    32     
    33       /*发送HTTP请求*/
    34       OutputStream socketOut=socket.getOutputStream(); //获得输出流  
    35       socketOut.write(sb.toString().getBytes());
    36     
    37       Thread.sleep(2000); //睡眠2秒,等待响应结果
    38     
    39       /*接收响应结果*/
    40       InputStream socketIn=socket.getInputStream(); //获得输入流
    41       int size=socketIn.available();
    42       byte[] buffer=new byte[size];
    43       socketIn.read(buffer);
    44       System.out.println(new String(buffer)); //打印响应结果
    45       
    46     }catch(Exception e){ 
    47       e.printStackTrace();
    48     }finally{
    49       try{
    50         socket.close();  
    51       }catch(Exception e){e.printStackTrace();}
    52     }
    53   } //#doGet()
    54 }
    55 
    56 
    57 
    58 
    59 /****************************************************
    60  * 作者:孙卫琴                                     *
    61  * 来源:<<Tomcat与Java Web开发技术详解>>           *
    62  * 技术支持网址:www.javathinker.org                *
    63  ***************************************************/

      运行结果:

    4、总结:

     静态文档,包括静态的html文档,txt文档、图片、音频、视频文件等,凡是早就存在于服务器端文件系统中的文件都认为是静态文本。

    三、浏览器提供的用户交互阶段

    1、特点:

      用户可以参与交互操作,方便了客户使用。

    2、浏览器和服务器端的交互过程

      

             

    3、代码示例与运行结果

      服务器端代码:

      同上,不过,需要在服务器的文件系统root目录下存放JAVA Applet、ASP、JSP等文件,以便客户端来获取。

      客户端代码:

            不变,直接按照hello3.html中的tag标记,<applet code=HelloApplet.class ... > 进行运行即可。        

      运行结果:

            略。

    4、总结:

      这个阶段已经初步满足客户需要,不过,由于这些脚本文件都是在浏览器上执行,对客户的浏览器要求越来越高,一旦用户浏览器版本或者插件不支持,则无法参与交互,

    所以,需要解决此问题。

    四、服务器端提供的用户交互阶段

    1、特点:

      用户参与交互操作,所有的运算都是在服务器端提供的,对客户端而言就是简单的运行html文件,对浏览器要求低。

    2、浏览器和服务器端的交互过程

      

    3、代码示例与运行结果

      服务器端代码:

            几点说明,

        第一、Servlet是JAVA的一个接口,服务器端新写的java类必须实现这个接口(implements Servlet),像下面这种格式:

                  

                    

     1 package server;
     2 import java.io.*;
     3 public class HelloServlet implements Servlet{
     4   public void init()throws Exception{
     5     System.out.println("HelloServlet is inited");
     6   }
     7   public void service(byte[] requestBuffer, OutputStream out)throws Exception{
     8     String request=new String(requestBuffer);
     9 
    10     //获得HTTP请求的第一行
    11     String firstLineOfRequest=request.substring(0,request.indexOf("
    "));
    12     //解析HTTP请求的第一行 
    13     String[] parts=firstLineOfRequest.split(" "); 
    14     String method=parts[0]; //获得HTTP请求中的请求方式
    15     String uri=parts[1]; //获得HTTP请求中的uri
    16     
    17                     
    18     /*获得请求参数username */
    19     String username=null;
    20     if(method.equalsIgnoreCase("get") && uri.indexOf("username=")!=-1){
    21       
    22       /*假定uri="servlet/HelloServlet?username=Tom&password=1234"*/
    23       //parameters="username=Tom&password=1234"
    24       String parameters=uri.substring(uri.indexOf("?"),uri.length()); 
    25       
    26       //parts={"username=Tom","password=1234"};
    27       parts=parameters.split("&");
    28       //parts={"username","Tom"};
    29       parts=parts[0].split("=");
    30       username=parts[1];   
    31     } 
    32     if(method.equalsIgnoreCase("post")){
    33       int locate=request.indexOf("
    
    ");
    34       //获得响应正文 
    35       String content=request.substring(locate+4,request.length());
    36       if(content.indexOf("username=")!=-1){
    37         /*假定content="username=Tom&password=1234"*/
    38         //parts={"username=Tom","password=1234"};
    39         parts=content.split("&");
    40         //parts={"username","Tom"};
    41         parts=parts[0].split("=");
    42         username=parts[1];   
    43       } 
    44     } 
    45     
    46     /*创建并发送HTTP响应*/
    47     //发送HTTP响应第一行
    48     out.write("HTTP/1.1 200 OK
    ".getBytes());
    49     //发送HTTP响应头
    50     out.write("Content-Type:text/html
    
    ".getBytes());
    51     //发送HTTP响应正文
    52     out.write("<html><head><title>HelloWorld</title></head><body>".getBytes());
    53     out.write(new String("<h1>Hello:"+username+"</h1></body><head>").getBytes());
    54     
    55   }
    56 }
    57 
    58 
    59 
    60 /****************************************************
    61  * 作者:孙卫琴                                     *
    62  * 来源:<<Tomcat与Java Web开发技术详解>>           *
    63  * 技术支持网址:www.javathinker.org                *
    64  ***************************************************/

            第二、服务器端必须把这个新写的Servlet加载到内存中,按照如下的格式:

           

      1 package server;
      2 import java.io.*;
      3 import java.net.*;
      4 import java.util.*;
      5 public class HTTPServer1{
      6   private static Map servletCache=new HashMap();
      7   
      8   public static void main(String args[]) {
      9     int port;
     10     ServerSocket serverSocket;
     11       
     12     try { 
     13        port = Integer.parseInt(args[0]);
     14      }catch (Exception e) {
     15        System.out.println("port = 8080 (默认)");
     16        port = 8080; //默认端口为8080
     17      }
     18 
     19      try{
     20        serverSocket = new ServerSocket(port); 
     21        System.out.println("服务器正在监听端口:" + serverSocket.getLocalPort());
     22         
     23        while(true) { //服务器在一个无限循环中不断接收来自客户的TCP连接请求
     24          try{
     25            //等待客户的TCP连接请求
     26            final Socket socket = serverSocket.accept(); 
     27            System.out.println("建立了与客户的一个新的TCP连接,该客户的地址为:"+
     28                 socket.getInetAddress()+":" + socket.getPort());
     29           
     30            service(socket);  //响应客户请求
     31         }catch(Exception e){e.printStackTrace();} 
     32       } //#while
     33     }catch (Exception e) {e.printStackTrace();}
     34   }
     35 
     36   /** 响应客户的HTTP请求 */
     37   public static void service(Socket socket)throws Exception{
     38     
     39     /*读取HTTP请求信息*/
     40     InputStream socketIn=socket.getInputStream(); //获得输入流
     41     Thread.sleep(500);  //睡眠500毫秒,等待HTTP请求  
     42     int size=socketIn.available();
     43     byte[] requestBuffer=new byte[size];
     44     socketIn.read(requestBuffer);
     45     String request=new String(requestBuffer);
     46     System.out.println(request); //打印HTTP请求数据
     47      
     48     /*解析HTTP请求*/
     49     //获得HTTP请求的第一行
     50     String firstLineOfRequest=request.substring(0,request.indexOf("
    "));
     51     //解析HTTP请求的第一行 
     52     String[] parts=firstLineOfRequest.split(" "); 
     53     String uri=parts[1]; //获得HTTP请求中的uri
     54     
     55     /*如果请求访问Servlet,则动态调用Servlet对象的service()方法*/   
     56     if(uri.indexOf("servlet")!=-1){
     57       //获得Servlet的名字
     58       String servletName=null;
     59       if(uri.indexOf("?")!=-1)
     60         servletName=uri.substring(uri.indexOf("servlet/")+8,uri.indexOf("?"));
     61       else
     62         servletName=uri.substring(uri.indexOf("servlet/")+8,uri.length());
     63       //尝试从Servlet缓存中获取Servlet对象
     64       Servlet servlet=(Servlet)servletCache.get(servletName);
     65       //如果Servlet缓存中不存在Servlet对象,就创建它,并把它存放在Servlet缓存中
     66       if(servlet==null){
     67         servlet=(Servlet)Class.forName("server."+servletName).newInstance(); 
     68         servlet.init();//先调用Servlet对象的init()方法
     69         servletCache.put(servletName,servlet);
     70       }   
     71       
     72       //调用Servlet的service()方法      
     73       servlet.service(requestBuffer,socket.getOutputStream());
     74       
     75       Thread.sleep(1000);  //睡眠1秒,等待客户接收HTTP响应结果        
     76       socket.close(); //关闭TCP连接  
     77       return;
     78     } 
     79   
     80   
     81     /*决定HTTP响应正文的类型*/
     82     String contentType;
     83     if(uri.indexOf("html")!=-1 || uri.indexOf("htm")!=-1)
     84       contentType="text/html";
     85     else if(uri.indexOf("jpg")!=-1 || uri.indexOf("jpeg")!=-1)
     86       contentType="image/jpeg";
     87     else if(uri.indexOf("gif")!=-1) 
     88       contentType="image/gif";
     89     else
     90       contentType="application/octet-stream"; 
     91     
     92     
     93     /*创建HTTP响应结果 */
     94     //HTTP响应的第一行
     95     String responseFirstLine="HTTP/1.1 200 OK
    ";
     96     //HTTP响应头
     97     String responseHeader="Content-Type:"+contentType+"
    
    ";
     98     //获得读取响应正文数据的输入流
     99     InputStream in=HTTPServer1.class.getResourceAsStream("root/"+uri);
    100     
    101     /*发送HTTP响应结果 */
    102     OutputStream socketOut=socket.getOutputStream(); //获得输出流
    103     //发送HTTP响应的第一行
    104     socketOut.write(responseFirstLine.toString().getBytes());
    105     //发送HTTP响应的头
    106     socketOut.write(responseHeader.toString().getBytes());
    107     //发送HTTP响应的正文
    108     int len=0;
    109     byte[] buffer=new byte[128];  
    110     while((len=in.read(buffer))!=-1)
    111     socketOut.write(buffer,0,len);  
    112     
    113     Thread.sleep(1000);  //睡眠1秒,等待客户接收HTTP响应结果        
    114     socket.close(); //关闭TCP连接  
    115     
    116   }
    117 }
    118 
    119 
    120 
    121 
    122 /****************************************************
    123  * 作者:孙卫琴                                     *
    124  * 来源:<<Tomcat与Java Web开发技术详解>>           *
    125  * 技术支持网址:www.javathinker.org                *
    126  ***************************************************/

      客户端代码:

            无特殊。

      运行结果:

           服务器端先运行,

      客户端在浏览器中输入:   

            http://localhost:8080/servlet/HelloServlet?username=Tom

    五、web 2.0阶段

    1、特点:

      在web1.0中,广大用户主要是Web提供的信息的消费者,用户通过浏览器来获取信息,而Web2.0则强调全名织网,发动广大民众来共同为Web提供信息来源,Web2.0注重用户与Web的交互,用户既是Web信息的消费者,也是Web信息的制造者,典型的应用是:博客、RSS(站点摘要)、WIKI、SNS(社交网络软件)、IM(及时通信)如QQ、MSN。

    七、处理HTTP请求参数和HTML表单

    1、HTTP表单就是指客户端发送GET或者POST请求时,在HTML的文本框,或者其他的控件输入的参数值,就是表单的意思,例如下面的用户名、密码。例如:

          用GET方法时,GET /servlet/HelloServlet?username=Tom&password=1234&submit=submit HTTP/1.1

          用POST方法时,POST  /servlet/HelloServlet HTTP/1.1

              ......

            username=Tom&password=1234&submit=submit

           

      

  • 相关阅读:
    存储映射--mmap
    进程间通信之管道--pipe和fifo使用
    dup和dup2函数简单使用
    Open_Read_Write函数基本使用
    Makefile简单编写实例
    仿函数、谓词、适配器、内建对象配合常见算法的使用
    20169219 2016-2017-2《移动平台开发》第六周作业
    20169219 2016-2017-2《网络攻防》第六周作业
    20169219 2016-2017-2《移动平台开发》第五周作业
    20169219 2016-2017-2《网络攻防》第五周作业
  • 原文地址:https://www.cnblogs.com/zhouhaibing/p/8598942.html
Copyright © 2020-2023  润新知