实习教程
实习录像
学生作业
实习资料
 
实习教程
网站集GIS开发理论、方法、技术与应用于一体
您的位置:首页 > 教学实践 > 实习教程
GIS网络编程基础学习

 

要求:
进行Java和asp.net的基础学习和实验。
书写WebGIS课程的实验报告《GIS网络编程基础1》
Java实例初步学习
请按照下面的入门代码进行动手实验,对Java有一个感性认识。
 
实验(一)

public class HelloWorld
{public static void main(String args[])
 {System.out.println("Hello World!");
 }
}
保存为:HelloWorld.java
注意:文件名必须与包含main方法的类的名字相同,扩展名必须为java。
运行结果:
在屏幕上打印出:Hello,World!
public class Add
{public static void main(String args[])
 {int a=3,b=6;
    int c=a+b;
   System.out.println("c="+c);
 }
}
保存为:Add.java
运行结果:
在屏幕上输出:c=9
                                     
实验(二)-----基本运算符与表达式
public class Arithmetic
{public static void main(String args[])
 {int i=8,j=4,I=0;              //定义变量
   int a=5,b=6;             //变量初始化
   float f=1.0f;               //单精度类型
   double d=2.5d;              //双精度类型
   int m=i%j;
  
   f=i/j;
   I=++i+j++;   //I=?
   System.out.println("I="+I);
   System.out.println("f="+f);
   int c=a>b?a:b;
  
   d+=a;
 
   System.out.println("d+a="+d);   //自动类型转换
   int n=(int)(d+b);
   System.out.println("n="+n);    //强制类型类型转换,会丢失精度
  
  
   boolean bool=a>b;
   System.out.println("bool="+bool);
   boolean firstbool=true;
   boolean secondbool=bool&&firstbool;
   secondbool=bool||firstbool;
  
   char ch='H';
   System.out.println("ch="+ch);
   String s="Hello,Everyone!";
   System.out.println(s);
 }
}
运算结果:

C:\java>java    Arithmetic
I=13
f=2.0
d+a=7.5
n=13
bool=false
ch=H
Hello,Everyone!
C:\java

实验(三)--获取命令行参数

public class GetArgs
{public static void main(String myargs[])
 {String s="";
   if (myargs.length!=0)
    s=myargs[0];
   System.out.println("s="+s);
 }
}
要点:参数放在字符串数组myargs里;
注意:编译后,必须用命令行运行此程序,方法:
java GetArgs Hello
运行结果为:
 s=Hello
 
实验(四)-----循环语句
/**
 * 编写程序,计算从1到100的累加和,用for语句实现。
 */
public class Sum {
 public static void main(String[] args) {
    int s = 0;      // 用来保存累加和,初始化为 0
    for(int i = 0; i <= 100; i++)
      s += i;       // for 循环体只有一个语句,可不用大括号
    System.out.println("1到100的累加和为:" + s);
 }
}
 /* 计算从正整数n1到n2的累加和,用while语句实现。
 */
// 解法一,固定 n1, n2 的值
public class Sum {
 public static void main(String[] args) {
    int s = 0;            // s 用来保存累加和,初始化为 0
    int n1 = 8, n2 = 66; // 预定 n1, n2 的值
    int i = n1;           // i 用来做循环计数,初始化为 n1
    while(i <= n2){
      s += i;
      i++;
    }
    System.out.println("n1为:" + n1 + "; n2为:" + n2);
    System.out.println("n1到n2的累加和为:" + s);
 }
} // 解法一结束
/*解法二,键盘输入n1, n2的值
import java.io.*;
public class Sum {
 public static void main(String[] args) {
    int s = 0;            // s 用来保存累加和,初始化为 0
    String str = "";      // String对象str用来保存键盘输入的字符串
    int n1 = 0, n2 = 0;
    try{
      java.io.InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      System.out.print("输入正整数n1:");       // 由键盘取得n1
      str = br.readLine();
      n1 = Integer.parseInt(str);
      System.out.print("\n再输入正整数n2:");    // 由键盘取得n2
      str = br.readLine();
      n2 = Integer.parseInt(str);
    }catch(IOException e){ }
    int i = n1;           // i 用来做循环计数,初始化为 n1
    while(i <= n2){
      s += i;
      i++;
    }
    System.out.println("n1到n2的累加和为:" + s);
 }
} // 解法二结束
/**
 * 编写程序,计算从1到100的累加和,用do-while语句实现。
 */
public class Sum {
 public static void main(String[] args) {
    int s = 0;      // s用来保存累加和,初始化为 0
    int i = 1;      // i用来做循环计数,初始化为 1
    do{
      s += i;
      i++;
    }while(i <= 100);
    System.out.println("1到100的累加和为:" + s);
 }
}
 
实验(五)----break语句的使用

/*不带标号的break语句的使用 */
public class BreakOne
{public static void main(String args[])
 {int index=0;
   while (index<=100)
     {index+=10;
      if(index==40)
        break;
       System.out.println("index="+index);
     }
 }
}
运行结果:
index=10
index=20
index=30
/* 带标号的break语句 */
class BreakTwo
{public static void main(String args[])
 {int sum=0;
   coloop:
   while (sum<=100)
    {for(int count=0;count<10;count++)
       {sum+=count;
        if(sum>50)
          break coloop;        //跳出coloop标识的循环
         
       }
     } 
   System.out.println("sum="+sum); 
   
 }
}
运行结果:
sum=51
 
实验(六)----continue语句的使用

/*不带标号的continue语句*/
public class ContinueOne
{public static void main(String args[])
 {int index=0;
   while(index<=99)
     {index+=10;
      if(index==40)
        continue;
      System.out.println("index="+index); 
     }
 }
}
运行结果:
index=10
index=20
index=30
index=50
index=60
index=70
index=80
index=90
index=100
注意:
 为什么40没有打印出来?
/*带标号的continue语句*/
public class ContinueTwo
{public static void main(String args[])
   {System.out.println("**100200之间的所有素数**");
    int n=0;
    outer:for(int i=101;i<200;i+=2)
           { int k=15;
             for(int j=2;j<=k;j++)
               {if(i%j==0)
                  continue outer;
               }
             System.out.print(" "+i);
             n++;
             if(n<10)
               continue;
             System.out.println();
             n=0;   
           }
    System.out.println();      
   }
}
 
/*用switch语句实现学生成绩的百分制到等级制的转换*/
class SwitchDemo
{public static void main(String[] args)
 {int testscore=88;
 char grade='A';
 switch(testscore/10)
 {case 10:
   case 9:
    grade='A';
    break;
 case 8:
    grade='B';
    break; case 7:
    grade='C';
    break;
 case 6:
    grade='D';
    break;
 default:
   grade='F';
   break;
 }
 System.out.println("grade is:"+grade);
 }
}
运行结果:
grade is:B

实验(八)---一维数组的使用

/*冒泡法排序*/
public class BubbleSort
{public static void main(String args[])
 {int i,j;
   int intArray[]={20,1,-3,30,50};
   int len=intArray.length;
   for(i=1;i< len;i++)
     for(j=0;j<=len-i-1;j++)
       if(intArray[j]>intArray[j+1])
         {int t=intArray[j];
          intArray[j]=intArray[j+1];
          intArray[j+1]=t;
         }
   for(i=0;i< len;i++)
     System.out.println(intArray[i]+" ");
 }
}
运行结果:

C:\java>java   BubbleSort
-3
1
20
30
50
 
                     
 
C:\java>
 实验(九)---多维数组的使用
/*打印杨辉三角形*/
public class YangHui
{public static void main(String args[])
   {
    final int ROW=8;
    int a[][]=new int[ROW+1][];
   for(int i=0;i<=ROW;i++)
     {
      a[i]=new int[i+1];         //分配每一行的列数,java语言支持不等维的数组
     
     }
    yanghui(a,ROW);
   }
 static void yanghui(int a[][],int ROW)
 {
  
   for(int i=0;i<=ROW;i++)
     for(int j=0;j<=a[i].length-1;j++)
       {
         if(i==0||j==0||j==a[i].length-1)
           a[i][j]=1;
         else a[i][j]=a[i-1][j-1]+a[i-1][j];
        
       }
   for(int i=0;i<=ROW;i++)
     {
      for(int j=0;j<=a[i].length-1;j++)
        System.out.print(a[i][j]+"\t");
      System.out.println();
     } 
        
 }
}
运行结果:

C:\java>java    YangHui
1
1       1
1       2       1
1       3       3       1
1       4       6       4       1
1       5       10      10      5       1
1       6       15      20      15      6       1
1       7       21      35      35      21      7       1
1       8       28      56      70      56      28      8       1
C:\java>
 
实验(十)---字符串的基本使用方法
public class StringDemo
{
 public static void main(String args[])
    {String s=" Hello ";
     System.out.println("s="+s);
     System.out.println("s.toLowerCase()="+s.toLowerCase());        //转换为小写字符串
     System.out.println("s.t0UpperCase()="+s.toUpperCase());       //转换为大写字符串
     System.out.println("s.trim()="+s.trim());
     System.out.println("s.substring(5)="+s.substring(5));
     System.out.println("s.substring(3,5)="+s.substring(3,5));
     String news=s.replace('l','t');
     System.out.println("replace all 'l' with 't':"+news);
     }
}
 
运行结果:

C:\java>java   StringDemo
s= Hello
s.toLowerCase()= hello
s.t0UpperCase()= HELLO
s.trim()=Hello
s.substring(5)=lo
s.substring(3,5)=el
replace all 'l' with 't': Hetto
C:\java>
Asp.net 实验
1.1.2 微软.NET的介绍
1.1.2.1 MicroSoft .NET综述
MicroSoft .NET平台包括用于创建和操作新一代服务的.NET基础结构和工具;可以启用大量客户机的.NET User Experience;用于建立新一代高度分布式的数以百万计的.NET积木式组件服务;以及用于启用新一代智能互联网设备的.NET设备软件。
MicroSoft .NET产品和服务—包括Windows.NET,连同建立积木式服务的核心集成套件;MSNTM .NET;个人订购服务;Office.NET;Visual Studio .NET;以及用于.NET的bCentralTM。
 
.Net环境中的突破性改进在于
 
1. 使用统一的Internet标准(如XML)将不同的系统对接;
 
2. 这是Internet上首个大规模的高度分布式应用服务架构;
 
3.使用了一个名为“联盟”的管理程序,这个程序能全面管理平台中运行的服务程序,并且为它们提供强大的安全保护后台;
 
.NET平台包括如下组件:
 
1.用户数据访问技术。其中包括一个新的基于XML的、以浏览器为组件的混合信息       架构,叫做“通用画板”;
 
    2.基于Windows DNA 2000的构建和开发工具;
 
    3.一系列模块化的服务,其中包括认证、信息传递、存储、搜索和软件送递功能;
 
4.一系列驱动客户设备的软件;
 
 
1.1.2.2 Microsoft.NET平台带来的重要意义
 
我们来看一下MicroSoft .NET对开发人员、IT专业人员、以及企业应用的巨大意义
对于开发人员
 
    MicroSoft .NET的策略是将互联网本身作为构建新一代操作系统的基础,对互联网和操作系统的设计思想进行合理延伸。这样,开发人员必将创建出摆脱设备硬件束缚的应用程序,以便轻松实现互联网连接。MicroSoft .NET无疑是当今计算机技术通向计算时代的一个非常重要的里程碑。
.NET的核心组件有:
· 一组用于创建互联网操作系统的构建块,其中包括Passport.NET(用于用户认证)以及用于文件存储的服务、用户首选项管理、日历管理以及众多的其它任务
· 构建和管理新一代服务的基本结构和工具,包括Visual Studio.NET、.NET企业服务器、.NET框架和Windows.NET
· 能够启用新型智能互联网设备的.NET设备软件
· .NET用户体验
.NET对最终用户来说非常重要,因为计算机的功能将会得到大幅度提升,同时计算机操作也会变得非常简单。特别地,用户将完全摆脱人为的硬件束缚:用户可以自由冲浪于互联网的多维时空,而不是束缚在便携式电脑的方寸空间——可通过任何桌面系统、任何便携式电脑、任何移动电话或PDA进行访问,并可对其进行跨应用程序的集成。
.NET可使用户轻松进行互联网连接,并轻松完成那些在当今看来十分费时而且费力的事务,它们往往要求用户进行数据重输入并需运行几个小时才能完成。通过将多项安全数据流合并到单一的用户界面(或者甚至是可编程决策引擎),.NET架构将用户从充斥于当今Web的数据竖井的束缚中解脱出来。用户可以自由访问、自由查看、自由使用他们的数据。
 .NET对开发人员来说也十分重要,因为它不但会改变开发人员的开发应用程序的方式,而且使得开发人员能创建出全新的各种应用程序。新型开发范例的核心是Web服务这个概念的引入。Web服务是一种通过简单对象访问协议(SOAP),在互联网上展露其功能性的、极为公开的服务。SOAP是一种基于可扩展标记语言(XML)制定的协议。
在过去,开发人员通过集成本地系统服务来构建应用程序。在这种模型下,开发人员可以访问丰富的开发资源并能严格控制应用程序的行为。
如今,开发人员已在很大程度上挣脱了这种模型的束缚,致力于构建具有复杂结构的n层化系统,这种系统能将网络上众多的应用程序一并进行集成,大大提升了应用程序的价值。这样,开发人员便可把精力集中在充分挖掘软件独特的商业价值,而不是构建基本结构上。可喜的局面将应运而生:软件投放市场的时间大大缩短、开发人员的编程效率明显提高,最终把质量上乘的软件呈现给用户。
我们正在进入一个崭新的计算时代——一个由互联网(尤其是Internet核心技术XML)实现的时代。利用XML,能够创建出可供任何人从任何地方使用的、功能非常强大的应用程序。它极大地拓展了应用程序的功能,并实现了软件的动态提供。在这种情况下,软件已不完全指那些从光盘进行安装的程序,而是演变成了一种服务——类似于ID调用程序或按收看次数进行收费的电视——人们可通过通信媒体订购的服务。
n层计算技术具有能够大幅度提高生产力、紧密耦合的特点,而Web概念具有面向消息、松散耦合的特点,我们将二者有机地糅合在一起,实现了上述构想。我们将这种计算风格称为Web服务,它的出现标志着人类已经迈入应用程序开发技术的新纪元。Web服务是一种应用程序,它可以通过编程并使用标准的Internet协议,像超文本传输协议(HTTP)和XML,将功能展示在互联网和企业内部网上。还可将Web服务视作Web上的组件编程。
从理论上讲,开发人员可通过调用Web应用编程接口(API),将Web服务集成到应用程序中。其调用方法与调用本地服务类似,不同的是Web API调用可通过互联网发送给位于远程系统中的某一服务。例如,MicroSoft Passport(Passport)服务使得开发人员能够对应用程序进行认证。通过对Passport服务编程,开发人员可以充分利用Passport的基本结构,通过运行Passport来维护用户数据库,以确保其正常运行、定期备份等等。
.NET正是根据这种Web服务原则而创建的,微软目前正着手提供这个基本结构,以便通过.NET平台的每一部分来实现这种新型的Web服务。而Visual Studio.NET、.NET框架、Windows.NET和.NET企业服务器,正是为进行基于Web服务模型的应用程序开发而度身定做的新一代开发工具和基本结构。.NET构建块服务、新增的.NET设备支持以及即将到来的.NET用户体验,将为人们彻底攻克这一难题划上一个圆满的句号,使人们能够充分利用Web服务模型,如愿以偿地开发出新一代应用程序。
 
.NET对IT专业人员的重要意义
目前,IT专业人员能够利用与构建.NET平台相同的技术。
.NET Enterprise Servers和Windows 2000操作系统,为创建具有高度可管理性的、能迅速投入市场的应用程序提供了坚实基础。它们利用的是可扩展标记语言(XML),因此随着Web体系结构的革新,在此平台上创建的程序依然很有价值。
.NET平台的核心是,采用有效的、分门别类的方式来构建应用程序,达到其前所未有的规模。该平台上的Web服务模型指的是:企业应用程序的中心业务要素通常由本地管理,而支持它们的服务(如用户认证、文件存储、用户首选项管理、日历、邮件等等)却无须本地管理,可以被无缝订购。为了存储用户文件和邮件,IT专业人员往往在服务器上安装新的独立磁盘冗余阵列(RAID阵列),而有了.NET,他们在这一方面将会花费较少的精力,而更多地致力于怎样为公司增加效益。
该Web服务模型还将动态配置新软件的发布和更新。用户将以极其紧密的连接方式工作,因此更易于管理。而简化的管理又可使IT专业人员更能适应变幻莫测的业务需求。
开发应用程序的.NET Web服务模型将为企业应用程序的创建开辟一条新路。通过企业内外多种服务的联合,很容易把企业内部数据和客户及合作伙伴的相关数据结合在一起,大大简化了应用程序的创建过程。这就为最终用户发掘了空前的功能涵盖性。例如,利用某公司的雇员福利程序,可以从其HR数据库订购信息,通过Web订购福利管理公司的服务、订购工资管理公司的服务。终端用户可以在简单、直观的界面下操作,而这个界面可以显示他们的累积休假时间、个人所得福利以及上次工资额。
 
.NET对企业的重要意义
MicroSoft .NET平台将从根本上改善计算机和用户之间进行交互的方式,最大限度地发挥电子商务中计算技术的重要作用。首先,让我们来分析一下当前商务计算世界的现状:
人与计算机进行交互的手段极为有限——通常使用键盘和鼠标进行输入,使用监视器监控输出。
用户信息基本上是本地信息;如果从另一台机器进行登录,则无法获取用户的个人首选项设置、数据及应用程序。
用户必须亲自处理信息,而通过设置智能选项代表用户自动进行操作,则无异于是纸上谈兵。
同一用户存放于不同应用程序和站点的数据,很难(或根本不可能)进行自动合并和关联,用户无法统一进行查看。
想在家里或在路上工作的用户,不能方便地访问办公室电脑中的应用程序和数据。这无疑成为一道阻止人们获得更高工作效率的鸿沟。
不能使用其它设备访问专为特定设备设计的数据(这些设备包括PC、寻呼机、移动电话以及PDA等);最多可以定期进行同步。
.NET将保证完全消除当今计算技术中的所有缺陷。.NET定能实现确保用户从任何地点、任何设备都可访问其个人数据和应用程序的宏伟蓝图。除此之外,.NET技术还可实现多个应用程序在逻辑上的松散耦合链接和紧密耦合链接。
用户可以通过手写、语音和图象技术与其个人数据进行交互。这些数据将安全地存放在互联网上,用户通过办公室(或家庭)PC,还可以通过移动电话或寻呼机、PDA、甚至是新发明的寻呼机——移动电话——PDA——PC联合设备访问这些数据。应用程序可进行灵活的功能调整,以适应用户所用设备的功能状况。应用程序可根据用户预定义的选项集和指令集,完全代替用户自动执行相应的操作。
上述功能将协同作用,以便大幅度地提高用户使用计算技术的生产效率。根据设计,.NET使得用户无需在如何与计算机进行交互上劳神,从而全身心地投入到使计算机自动执行任务、实现最终目标的工作中。通过使用XML行业标准,可将用户数据进行跨站点和应用程序的链接,从而轻松实现当前很难实现的操作。比如:对用户在数家不同银行、信用卡公司以及计费代理商那里的数据进行集中处理;这样,用户便可依据处理后的数据支付帐单,将费用明细报告归档。
.NET把雇员、客户和商务应用程序整和成一个协调的、能进行智能交互的整体,而各公司无疑将是这场效率和生产力革命的最大受益者。简言之,.NET承诺为人类创造一个消除任何沟鸿的商务世界。
 
1.1.2.3 MicroSoft .NET 的基本模块
 
网络服务一览
 
       通常说来,一个网络服务只是一个作为服务――通过Internet标准此服务能与其它
网络服务集成在一起――发行的简单的应用程序。换句话说,它是可通过URL定位的自动将信息返回到需要它的客户端那里的一种资源。网络服务一个重要的特点是客户不需要知道一种服务是怎样实现的。在本节中,我将向你解释网络及网络服务如何把基于组件技术的最好的方面结合在一起的,并且介绍与网络服务通信所需的基本框架。
同组件一样,网络服务提供“黑匣子”函数,它可以被再次作用而不用关心此服务是怎样实现的。网络服务提供被称为契约的精确定义的接口,此接口描绘了所提供的服务。开发人员可以将远程服务、本地服务和定置代码组合在一起而集成应用程序。例如,某公司可以使用如下服务组建一在线商店:微软护照(原文:Passport)服务以验证用户身份,第三方个人化服务以使网页匹配每一个用户的参数,信用卡处理服务,销售税服务,对每个运输公司的包裹跟踪服务,链接公司内部库存管理程序的内部目录服务,以及少量定置代码以使他们的商店能脱颖而出。
然而,网络服务与现在的组件技术不同,它不使用需要在服务器和客户机有明确的、同类型基本构架的具体的对象模型协议,例如DCOM、 RMI或 IIOP 。尽管与具体组件技术紧密结合的实现在一个受控的环境中能很好地被接受,但它们在网络环境中变得不切实际。因为一个集成商业程序的参与者会发生变化,随着时间的推移,技术也在变化,所以在所有参与者间确保一个单一的、统一的体系架构就变得十分困难。网络服务采取了另外一种途径,它使用普便存在的网络协议和数据格式,如HTTP和XML,进行通信。支持这些网络标准的任何系统都支持网络服务。
而且,网络服务契约描述的是以术语报文形式提供的服务,这些服务是由网络服务生成和接受的,而不是描述服务是如何实现的。通过把重点放在报文上,网络服务模板就完全对语言、平台和对象模板一无所知。 用任何一套编程语言、对象模型和平台的完全特性集,都可实现网络服务。网络 服务可在任何平台被用任何语言所实现的应用程序使用。只要用于解释服务容量、报文序列和所期望协议的契约得到认同,那么所实现的网络服务及网络服务用户就可相互不同,而不会影响会话另一端的应用程序。
网络服务模板对最小体系架构的要求很低,以确保网络服务在使用任何技术和编程语言的平台上实现和访问。对网络服务互用性的解决可只依靠网络标准。然而,为了使应用程序更容易使用网络服务,简单地同意通过标准网络协议就可以访问网络服务是不够的。当网络服务和网络服使用者依靠标准的方式表示数据和命令、表示网络服务契约 、算出网络服务所提供的容量时,网络服务才容易使用。
XML是定义一个标准的、可扩展的用于提供命令和典型数据的语言明显的一种选择。虽然为表示命令和典型数据可以定义使用其它技巧(比如编码为一种查询字符串)的规则,但XML被专门设计为描述数据的标准元语言。简单对象存取协议(SOAP)是以一种可扩展的方式使用XML表示数据和命令的工业标准。网络服务可选择用SOAP决定报文的格式。
XML是网络服务契约的一种使能技术。服务契约语言 (SCL)是记录网络服务契约的XML语法。由于SCL是基于XML的,所以对开发者和开发工具来说,容易生成、解释契约。关于SCL细则的草案很快会出台(注意:现在的SOAP Toolkit for Visual Studio 6.0支持称为SDL的SCL的早期版本)。
Disco 规范为服务提供者发布网络 服务契约和相应的机制描述了一个标准方式,这将使开发者或开发工具可找到契约文献。当你读到这里时, Disco规范的草案应出台了。
象SOAP, SCL和Disco这样的标准有助于开发者,因为它们不需要明白和实现所使用的每一个网络服务的访问方式。支持这些标准的更好的、已充分测试的、高性能的体系架构将由开发平台提供,这会大大简化整个开发过程。
 
MicroSoft .NET Framework
 
MicroSoft .NET框架的目的是使你更容易建立网络应用程序和网络服务。图2 显示了MicroSoft .NET框架的体系。建立在操作系统最上层的服务,是管理运行时代码需求的common language runtime,这些代码可以用任何现代编程语言所写。Runtime提供了许多服务,这些服务有助于简化代码开发和应用程序的开发同时也将提高应用程序的可靠性。.NET Framework包括一套可被开发者用于任何编程语言的类库。在此之上是许多应用程序模板,这些模板特定地为开发网络站点和网络服务提供高级组件和服务。
 
Common Language Runtime
 
运行语言(runtime)调入并运行用任何运行感知编程语言所写的代码。以运行为目标的代码被称为受控(managed )代码,受控代码代码只是意味着在内部可执行代码与运行自身间存在已定义好的合作契约。对于象生成对象、调用方法等这样的任务,被委托给了运行语言,这使得在运行语言能为可执行代码增加额外的服务。
运行语言以交叉语言集成、自描述组件、简单配制和版本化及集成安全服务为特点。
运行语言使用一种新的能表达大部分现代编程语言语义的通用类型系统,通用类型系统定义了一套标准类型及生成新标准的规则。运行语言知道怎样生成、执行这些类型。编译器和解释器使用运行语言服务定义类型、管理对象、进行方法调用,而不是使用工具或特定于语言的方法。
类型系统的主要设计目的是使多种语言能深度集成。用一种语言所写的代码能继承用另一种语言所写的类的实现,用一种语言所写的代码抛出的异常能被用另一种语言写的代码捕获,象调试和剖析之类的操作会在完全封闭下工作,而不用考虑代码所用的语言。这就意味着编写可重用类库的开发者,不再需要为每一种编程语言或编译器生成一个版本,并且使用类库的开发者不再受到为他们使用的编程语言开发的库的限制。
自描述组件――现在MicroSoft .NET框架上已成为可能――简化了开发和配制,并提高了系统的可靠性。许多由运行语言提供的服务是由元数据及用于补充可执行代码的信息所驱动。因为所有的信息都储存在一起,只有可执行的(代码)才被称为自描述组件。
自描述组件的一个主要优点是,使用它们并不需要其它文件。类的定义不需要单独的头文件;通过检查元数据对类的定义可以从组件自身获得。跨语言或过程边界访问组件并不需要各自的IDL文件、类型文件或proxy/stubs;所必需的信息已存在于元数据之中。为识别开发者请示的服务属性,并不需要展开各自的配制信息。 最主要的是,由于元数据是在编译过程中由源代码生成,并与可执行代码储存在一起,它将永远和可执行部分同步。
除了改善对单个组件的配制,Microsft .NET框架定义了一个应用程序配制模板,以解决定置应用程序安装和DLL版本化(通常被称为“DLL Hell”)这一复杂过程的问题,运行语言提供了支持这个模板的服务。
Microsft .NET框架 引入了组合体的概念。一个组合体是一组资源和类型,并包括有关这些资源和类型的元数据,也就是被作为一个单元配制的。元数据被称为组合体的名单,它包含象类型和资源表之类能被组合体外看得见的信息,这个名单也包括有关从属关系之类的信息,例如组合体建立时的版本号。开发人员可以指定版本策略,以指示运行语言是否装入系统上已安装的依赖于组合体的最新版本,装入一指定版本,或在编译时使用的版本。
某软件组件的多个拷贝总可以存在于同样的操作系统上,然而,通常说来,只有其中的一个拷贝能被操作系统注册、调入内存、执行。对系统来说,定位和调入内存的策略是全局性。.NET Framework Common Language Runtime 增加了所必须的体系架构以支持管理组件定位和调入的每个应用程序策略,这通常被称为并行配制。
组合体可以被一个应用程序私有,或被多个应用程序共享。一个组合体的多个版本可以同时配制在同一台机器上。应用程序配制信息定义了到何处去查找组合体,这样runtime就能为同时运行的两个不同的应用程序装入同一组合体的不同版本。这就消除了由组件版本的不兼容性引起的问题,提高了系统整体的稳定性。如果必要,如果必要,管理员可以为配制时刻的组合体增加配制信息,例如一个不同的版本策略,但是编译时提供的原始信息永远不会丢失。
因为组合体是自描述的,所以并不需要在系统上进行显式注册。应用程序的配制简单到只需将文件拷贝到目录中既可(如果为了使应用程序能够运行,必须安装未经组织过的组件的话,情况会稍微复杂一点)。配制信息保存在可被任何文本编辑器编辑的XML文件中。
最后,运行语言也提供完整的、普遍深入的安全服务,以确保未经授权的用户不能访问机器上的资源,并且代码不会执行未经允许的动作。这就提高了系统整体的安全性可靠性。 由于运行语言用于装入代码、生成对象、执行方法调用,所以当受控代码装入内存、执行时,运行语言能进行安全检查,强化安全策略。
Microsft .NET框架不仅规定代码访问安全,还规定基于角色的安全。通过代码访问安全机制,开发人员能为应用程序指定完成工作所必需的权限。例如,代码或许需要写文件或访问环境变量的权力。这类信息和有关代码标志的信息一起存储在配制级上的。当代码装入内存及执行方法调用时,运行语言验证是否能给予代码所要求的权限。如果不能,将记录一条安全冲突信息。给予权限的策略,这被称为信任策略,是由系统管理员建立的,并且是建立在关于代码的证据基础之上,比如:代码是谁发布的,是从什么地方获得的,以及在组合体中找到的代码标志和它要求的权限。开发人员可以指定他们显然不需要的权限,以防止其它人恶意使用他们的代码。如果所需要的权限依赖直到运行时刻才会知道的信息,那么就可写入纲邻性的安全检查。
除了代码访问安全,运行语言还支持基于角色的安全。基于角色的安全建立同代码访问安全一样的权限模板,只是这些权限是建立在用户的身份之上,而不是建立在代码的标志之上。角色表明了用户所属的类,并且可以在开发和配制阶段定义。给予权限的策略被分配到每个预定义的角色。在运行时刻,用户的身份被确定,代码将代表这个身份运行。运行语言决定用户是哪个角色的成员,然后给予基于这个角色的权限。
在查看Microsft .NET框架的可编程模板前,先看一下它所提供的服务。
 
服务框架
在Common Language Runtime之上是服务框架,此框架提供能被任何现代编程语言调用的类。所有的类都遵循一套命名和设计方针,以大大减小开发人员的学习上的弯路。
框架包括一套开发人员希望在标准语言库中存在的基类库,例如:集合、输入/输出,字符串及数据类。另外,基类库提供访问操作系统服务如图画、网络、线程、全球化和加密的类。服务框架也包括数据访问类库,及开发工具,如调试和剖析服务,能够使用的类。本文章没有详细讨论所有的类,我将重点放在数据访问类上,因为大多数网络服务需要对数据的访问。当然,你可以在MicroSoft .NET Framework SDK中找到关于服务框架类库的附加信息。
 
数据访问服务
几乎所有的网络服务都需要查询和更新永久性数据,不论是以简单文件,还是以相关数据库,或是以其它的存储类型存在。为了提供对数据的访问,服务框架包括ActiveX Data Objects+ (ADO.NET)类库。如同名子所暗示地那样,ADO.NET由ADO发展而来。ADO+被设计为基于网络的可扩展的应用程序和服务提供数据访问服务。ADO.NET为连接的指针风格的数据访问,同时也为更适合于把数据返回到客户端应用程序的无连接的数据模板提供高性能的APIs流,就象在以后介绍的那样。
就象其余几个部分一样,ADO.NET定义了那些链接数据仓库、 对数据仓库发送命令及从中获取结果的类。这些类由受控数据提供者(managed data provider)实现。ADO+中链接和命令对象看上去和ADO中的是一样的,并且一个名为DataReader的新类提供了通过高性能API流获取结果的能力。DataReader在功能上同前向、只读的ADO记录集(Recordset)是等同的,但是DataReader被设计用来最小化内存中生成的对象的数量,以提高性能,避免垃圾积累。在.NET Framework中包含了针对MicroSoft SQL Server™的受控数据提供者以及可通过OLE DB访问的任何数据仓库。
ADO.NET的一个主要创新是引入了数据集(Dataset)。一个数据集是内存中提供数据关系图的高速缓冲区。数据集对数据源一无所知,它们可以由程序或通过从数据仓库中调入数据而被生成、填充。不论数据从何处获取,数据集都是通过使用同样的程序模板而被操作的,并且它使用相同的潜在的数据缓冲区。使用.NET平台的开发人员能够用数据集代替传统ADO中无连接的记录集。
受控数据提供者为数据仓库和数据集公开一名为DataSetCommand 的接口对象。DataSetCommand 使用ADO.NET链接和命令以从数据仓库中填充数据集,并把在数据集中发生的变化解析到数据仓库中。
就象DataReaders 显示了对于相关数据的有效的流访问一样,XmlReaders 显示了对XML数据的流访问。开发人员使用DataNavigator 可以滚动和编辑内存中的XML文档。DataNavigator在功能上和W3C Document Object Model (DOM)是一样的,但它更有效,并提供了能很好映射关系数据表的对象模板。DataNavigator 支持Xpath语法以对数据流进行导航。ADO.NET为那些希望继续使用DOM作为XML对象模板而不是使用更有效的DataNavigator模板的开发人员提供了一个XMLDocument类。
由于所有的数据都可被看作XML,所以开发人员可以为任何数据使用转换和确认服务。ADO.NET定义了一个消费DataNavigator、生成一个新的XmlReader的通用转换体系。.NET Framework提供了一个支持W3C XSL Transformations (XSLT)细则的特殊转换组件。ADO.NET同时提供了一使用XML简图确认XmlReader的确认引擎。ADO.NET支持通过DTDs, XSD或 XDR定义的简图。
 
表单应用模板
 
从概念上讲,在服务框架的最上面是两个应用程序模板:Windows应用程序模板和网络应用程序模板。尽管我把重点放在把微软.NET 框架用作开发网络服务和网络应用程序的一种途径上,但框架也可用于开发较传统的基于Windows的应用程序(当然,这些应用程序也能使用网络服务)。
编写Windows客户应用程序的开发人员可使用Win表单应用程序模板以利用Windows丰富的用户接口特点,包括现在的ActiveX控件和Windows 2000的新特点,如透明的、分层的、浮动窗口。可以选择传统的Windows或网络外观。得知它和现在的基于Windows表单包的相似性以后,开发人员会发现Win表单可编程模板和对设计阶段的支持非常直观。
Win 表单利用了Microsft .NET框架 runtime以减少基于Windows的客户应用程序的开销。只要应用程序和组件是用Win所写或被Win表单应用程序使用,那么它们就能被框架安全模板在客户机上安全地执行。如果以这种方式使用或执行,那么某人从Internet下载下来的生猛游戏就不会对配制信息和数据产生破坏,否则会自动地给用户地址薄里的每一个人发送电子邮件。
Microsft .NET框架 装配模板简化了应用程序的配制和版本化 。应用程序可被配制为使用它们在编译和测试所用的共享组件,而不是使用恰好在客户机器上安装的随便什么版本的组件,这就提高了应用程序的可靠性,减少了应用程序所支持调用的主要因素:用户接口控件和其它共享组件版本的不兼容性。
 
网络应用程序模板
 
建立在Microsft .NET框架 上网络应用程序共享一个通用应用程序模板。在这个模型中,网络应用程序是一套起源于基URL 的URLs。因此它包含用于生成在浏览器中观看的网页的网络应用程序和网络服务。在本节中,我将详细介绍称为Active Server Pages+ (ASP.NET)的网络应用程序可编程模板
如同你从名字猜到的那样,ASP.NET是由活动服务器页面发展而来。ASP.NET利用common language runtime 和服务框架网络应用程序提供了一个可靠的、自动化的、可扩展的主机环境。ASP.NET也受益于common language runtime 集成模板,简化了应用程序的配制。另外,它提供简化应用程序开发的服务(如状态管理服务)以及高水平的编程模板(如ASP.NET Web Forms和ASP.NET Web Services)。
ASP.NET的核心是HTTP运行语言,一个高性能的用于处理基于低级结构的HTTP请求的运行语言,而基于的结构与MicroSoft Internet Information Services (IIS)所提供的ISAPI结构相似。如同你在图5所看到的,HTTP 运行语言是在象服务器上的IIS或客户机上的IE之类的unmanaged 主机过程中运行的受控代码。HTTP runtime负责处理引入的所有HTTP请求,并对每个请求应用程序的URL进行解析,然后把请求分配到应用程序以进行进一步的处理。HTTP 运行语言是多线程的,并异步处理请求,因此劣质的应用程序代码阻碍不了它对新请求的处理。而且HTTP 运行语言假定失败必会发生,因此它被控制为尽最大力量自动地从访问冲突、内存泄漏、死锁等事故中恢复过来。除非是硬件故障,运行语言的目标是100%的可靠性。
ASP.NET使用基于构件的Microsft .NET框架配制模板,因此它获得了如XCOPY配制、构件并行配制、基于XML配制等优点。ASP.NET另一个主要优点是,它支持应用程序的实时更新。管理员不必关掉网络服务器或者甚至不用停止应用程序的运行就可以更新应用文件。应用程序文件永远不会被加锁,因此甚至在程序运行时文件就可以被覆盖。当文件更新后,系统会温和地转换到新的版本。系统检测文件变化,并用新的应用程序代码建立一个新的应用程序实例,然后将引入的请求路由到应用程序。当所有被现存的应用程序实例处理的未完成的请求处理完后,该实例就被销毁了。
在应用程序中,HTTP请求是通过HTTP模块的一个管道路由的,最终到达请求处理程序。HTTP模块和请求处理程序是一些实现特殊接口的受控类,而这些接口是由ASP.NET定义的。这种管道结构使得为应用程序增加服务非常方便:只需补充一个HTTP模块。例如,安全,状态管理及跟踪都被实现为HTTP模块。高级可编程模块,如网络服务和网络表单,通常被实现为请求处理程序。一个应用程序能链接与多个请求处理程序——每个处理程序一个URL,但是所有的HTTP请求都通过同样的管道路由。
网络基本上是一个无状态模型,并且在HTTP请求间没有联系,这使得编写网络应用程序很困难,因为应用程序通常需要维护跨多个请求的状态。ASP.NET增强了由ASP引入的状态管理服务,以便为网络应用程序提供三种类型的状态:应用程序、会话、用户。就象在ASP中一样,应用程序状态特定于一个应用程序实例,并且不会持久。会话状态是特定于一个用户与应用程序间的会话的。与ASP会话状态不同,ASP.NET会话状态储存在一个独立的过程中,并且可把它配制成可以储存到一个独立的机器上。这使得会话状态当应用程序在网络群(Web farm)扩展时非常有用。用户状态类似于会话状态,但通常它不会超时,并且是永久性的。因此,用户状态对储存用户参数和其它个性化的信息是有用的。所有状态管理服务都被实现为HTTP模块,因此它们容易增加到应用程序管道中,或从中删除。如果除了由ASP.NET提供的服务外,还需要额外的状态管理服务,那么可由第三方的模块提供。
ASP.NET同样提供高速缓冲服务,以改善性能。输出缓冲可完全节省网页翻译,段缓冲储存部分的网页。由于提供了相应的类,所以只要需要,应用程序、HTTP模块以及请求处理程序可以在高速缓存中储存任意数量的对象。
下面快速浏览一下建立在ASP.NET可编程模块之上的两个高级可编程模块:ASP.NET 网络 表单和 ASP.NET 网络 服务。
 
ASP.NET 网络表单
 
网络表单把基于Visual Basic®的表单的高生产性的优点带到了网络应用程序的开发中来。网络表单支持传统的将HTML内容与角本代码混合的ASP语法,但是它提出了一种将应用程序代码和用户接口内容分离的更加结构化的方法。引入的网络表单控件用于为封装通用用户接口元素提供了一种机制。这些新的特点使得开发工具在支持VB小应用程序的同时,也支持设计时模块,使得WUSIWYG工具支持网页布局。
网络表单控件负责生成用户接口,典型情况是在HTML表单中。ASP.NET是提供了一套映射传统的HTML用户接口小部件(包括列表框,文本框和按钮)的网络表单控件和一套附加的更加复杂的网络控件(如日历和广告转板)。这些控件的一个重要特点是,它们可以被编写以适应客户端的能力;同一网页把大范围的客户端平台和表单因素作为目标。换句话说,网络表单控件能“嗅”到正在查找表单的客户,然后返回合适的用户经验――可能是适合低级浏览器的HTML3.2或是适于IE5.0的动态HTML。
考虑到网络是一种无状态的联接模型,网络应用程序开发人员所面临的一个很复杂的问题是,他们要对用户与基于网络的接口的交互作用作出反应。网络利用ASP.NET的体系架构提供了一套丰富的服务,以帮助开发人员建立交互式网页。这些服务的净作用是使基于组件的、事件驱动的可编程模块,对开发人员来说,非常象客户端的表单程序设计。用户与网页交互作用的状态管理的复杂性被ASP.NET 网络 表单和网络表单控件隐藏起来了。对开发人员来说,提供的丰富数据绑定服务使得显示通过数据访问服务得到的数据变得非常容易。
代码与内容的分离使ASP.NET网页能动态地编译到受控类中,用以提高性能。每个引入的HTTP请求都被传递到一个新的网页实例,因此开发人员不需要关心代码中的线程安全性。
 
ASP.NET 网络 服务
 
ASP.NET 网络 服务体系架构为用ASP.NET建立网络 服务提供了一高级可编程模板。虽然建立网络服务并不需要使用网络 服务平台,但是它提供许多的优点将简化开发过程,并且它使用的编程模型对用ASP或VB工作的开发人员来说是很熟悉的。使用这个可编程模型,开发人员不需要理解HTTP、SOAP或其它任何网络服务规范。
开发人员用ASP.NET生成一个扩展名为.asmx的文件,并把此文件配制为网络应用程序的一部分,就建立起了一个网络 服务。ASMX文件或者包含对在其它地方定义的受控类的引用,或者包含这个类的定义。这个类是由ASP.NET提供的WebService类所派生。公有的类方法在标记上WebMethod属性后,就会成为网络服务方法,把HTTP请求发送到ASMX文件中的URL后,这些方法就会被调用。你不必手工为你的网络服务建立一个契约。当被调用者请求时,ASP.NET检查类的元数据,以自动生成SCL文件。
客户可通过SOAP,HTTP GET 和HTTP POST提交请求。对方法和参数进行编码的约定是:对HTTP GET,将被编码为查询字符串;对HTTP POST,将被编码为表单数据。HTTP GET 和HTTP POST 的机制不如SOAP有力,但是它们使得客户在访问网络服务时不必支持SOAP。
ASP.NET 网络服务模型假定了一个无状态服务结构。无状态结构通常比有状态结构更具可扩展性。每次收到一个服务请求后,就生成一个新对象,请求被转化为一个方法调用,当方法调用返回时对象被销毁。如果这些服务需要跨请求维护状态,那么它们将使用ASP.NET状态管理服务。基于ASP.NET的网络服务在网络应用程序模型中运行,因此它们得到了该模型的所有安全、配制和其它优点。
ASP.NET 网络服务还提供了一个为在SCL文件中描述的网络服务生成分类的受控代理工具。代理生成器把SCL文件中描述的消息映射成受控类中的方法。代理对应用程序代码隐藏了所有的网络和引导设备,因此使用网络服务看起来就象使用其它受控代码一样。代理将优先使用SOAP链接网络服务,但是它同样支持HTTP GET和 HTTP POST机制。因此HTTP GET和 HTTP POST同样也能被使用。
网络服务为在Internet上绑定应用程序提供了一个利用现存体系架构和应用程序的简单的、灵活的、基于许多标准的模型。网络应用程序很容易与当地开发的服务或已存在的服务集成在一起,而不用考虑开发平台、开发语言或使用的对象模型,以用于实现任何组成的服务或应用程序。
Microsft .NET框架在现有开发人员技巧之上,提供了一个应用程序模板和关键技术,用于简化安全、可靠、可扩展、高可用性的网络服务的建立、部署和不断的发展。
通过上面的介绍,我们能够感觉到MicroSoft .NET对于我们今后的程序设计将产生巨大的影响。
WEB FORM
表单,英文单词是Form,学习过VB的朋友一定不会陌生。在MS.NET架构里,Form是一个经常使用到的词汇。比如:编写Windows 应用时会提到Windows Form,编写Web 应用时会提到Web Form。Windows Form可以看作一个Windows窗体,这和在VB里面一样。而Web Form则代表了一个一个的Web页面。总的看来,Form就像是一个容纳各种控件的容器,各种控件都必须直接或者间接的和它有依存关系。Form在这里译作“WEB表单”似乎有些不妥。“表单”这个词,在WEB程序员看来,总是和HTML里面的“Form”相混淆。“WEB表单”似乎翻译成“WEB页面”更加妥当一些。
大家还记得VB里面的Form实际上就是一个对象吧,它可以有自己的属性、方法、事件等等。WEB表单,或者说WEB页面,实际上是一个“对象” (Object)。MS.NET架构里面一个比较重要的概念就是“对象”:所有的控件都是对象,甚至数据类型都成了对象;每种数据类型都有自己特有的属性和方法。我们在后面的编程中将可以体会到。
 WEB FORM的后缀名是ASPX。当一个浏览器第一次请求一个ASPX文件时,WEB FORM页面将被CLR(common language runtime)编译器编译。此后,当再有用户访问此页面的时候,由于ASPX页面已经被编译过,所以,CLR会直接执行编译过的代码。这和ASP的情况完全不同。ASP只支持VBScript和JavaScript这样的解释性的脚本语言。所以ASP页面是解释执行的。当用户发出请求后,无论是第一次,还是第一千次,ASP的页面都将被动态解释执行。而asp.net支持可编译的语言,包括VB.NET、C#、Jscript.NET等。所以,asp.net是一次编译多次执行。
 为了简化程序员的工作,ASPX页面不需要手工编译,而是在页面被调用的时候,由CLR自行决定是否编译。一般来说,下面两种情况下,ASPX会被重新编译:
 1.ASPX页面第一次被浏览器请求;
    2.ASPX被改写
 由于ASPX页面可以被编译,所以ASPX页面具有组件一样的性能。这就使得ASPX页面至少比同样功能的ASP页面快250%!
 下面我们来看一下简单的WEB页面。
2.1.2 我的第一个Page
 把下面的代码拷贝到myfirstpage.aspx文件中,然后从浏览器访问这个文件:
<!--源文件:form\web页面简介\myfirstpage.aspx-->
<form action="myfirstpage.aspx" method="post">
 
           <h3> 姓名: <input id="name" type=text>
 
           所在城市: <select id="city" size=1>
                          <option>北京</option>
                          <option>上海</option>
                          <option>重庆</option>
                      </select>
 
           <input type=submit value="查询">
 
</form>
         你可能觉得这个页面太简单了,用HTML就可以完成。是的!微软建议你将所有的文件哪怕是纯HTML文件都保存为ASPX文件后缀,这样可以加快页面的访问效率!不仅仅是在asp.net环境中,在IIS5.0以后的ASP3.0就已经支持这个特性了。
         由于我们没有对表单提交做任何响应,所以,当你按下“查询”按钮,页面的内容没有什么改变。
下面我们将逐步使用asp.net的思考方式,来完成我们的页面。
2.1.3 WEB页面处理过程
         这一节我们将深入到asp.net内部,看看页面是怎样被处理的。
         和所有的服务器端进程一样,当ASPX页面被客户端请求时,页面的服务器端代码被执行,执行结果被送回到浏览器端。这一点和ASP并没有太大的不同。
         但是,asp.net的架构为我们做了许多别的事情。比如,它会自动处理浏览器的表单提交,把各个表单域的输入值变成对象的属性,使得我们可以像访问对象属性那样来访问客户的输入。它还把客户的点击映射到不同的服务器端事件。
         了解WEB页面的处理过程很重要。这样你可以仔细地优化你的代码,提高代码的效率。
2.1.3.1 页面的一次往返处理
    用户对Server Control的一次操作,就可能引起页面的一次往返处理:页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端。
正因为每个Control都可能引发一次页面的服务器端事件,所以,asp.net尽量减少了控件的事件类型。很多组件都只有OnClick事件。特别的,asp.net不支持服务器端的OnMouseOver事件。因为OnMouseOver事件发生得非常频繁。所以,支持服务器端的OnMouseOver事件是非常不现实的。
2.1.3.2 页面重建
    每一次页面被请求,或者页面事件被提交到服务器,asp.net运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。当下一次页面被处理时,asp.net运行环境是不知道它的上一次执行情况的。在这个意义上,ASPX页面是没有状态的。这也是HTTP协议的特点(为了加速页面的访问,在asp.net页面里面可以使用缓存机制,也就是保存页面的执行结果,下一次页面被请求时,直接送回上一次的执行结果。)。
    在ASP中,当页面被提交到服务器端时,只有那些用户输入的值被传递到服务器。其他的比如组件的属性、变量的值,是不会传递的。所以服务器无法了解组件的进一步的信息。
在asp.net中,页面对象的属性、页面控件的属性被称为“view state”(页面状态)。页面状态在asp.net中被受到特别关照。请看服务器端(page1.aspx)的代码:
<!--源文件:form\web页面简介\page1.aspx-->
 <HTML>
 <BODY>
 <SCRIPT language="VB" runat="server">
   Sub ShowValues(Sender As Object, Args As EventArgs)
     divResult.innerText = "You selected '" _ 
 & selOpSys.value & "' for machine '" _ 
     & txtName.value & "'."
     End Sub
 </SCRIPT>
 <DIV id="divResult" runat="server">
</DIV>
<FORM runat="server">
机器名:
<INPUT type="text" id="txtName" runat="server">
   <P />
 操作系统:
      <select id="selOpSys" size="1" runat="server">
          <OPTION>Windows 95</OPTION>
         <OPTION>Windows 98</OPTION>
         <OPTION>Windows NT4</OPTION>
          <OPTION>Windows 2000</OPTION>
       </SELECT>
     <P />
 <INPUT type="submit" value="Submit" runat="server" onserverclick="ShowValues">        
 </FORM>
   </BODY>
</HTML>
 
    运行后将自动被解释成客户端代码,如下:
<HTML>
<BODY>
You selected 'Windows 98' for machine 'iceberg'.
<FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0">
<INPUT type="hidden" name="__VIEWSTATE" value="a0z1741688109__x">
机器名:
<INPUT type="text" id="txtName" name="txtName" value="tizzy">
       <P />
操作系统:
<SELECT id="selOpSys" size="1" name="selOpSys">
   <OPTION value="Windows 95">Windows 95</OPTION>
     <OPTION selected value="Windows 98">Windows 98</OPTION>
         <OPTION value="Windows NT4">Windows NT4</OPTION>
   <OPTION value="Windows 2000">Windows 2000</OPTION>
     </SELECT>
 <P />
   <INPUT type="submit" value="Submit">
   </FORM>
 </BODY>
</HTML>
 
    对于上面的代码,服务器端控件能在服务器端脚本中被自由运用。如果我们用传统的ASP代码实现上述的功能的话:
    If Len(Request.Form("selOpSys")) > 0 Then
        StrOpSys = Request.Form("selOpSys")
        StrName = Request.Form("txtName")
        Response.Write("You selected '" & strOpSys _                                        
        & "' for machine '" & strName & "'.")
    End If
  
    如果我们用asp.net的话,程序代码如下:
     If Len(selOpSys.value) > 0 Then
        Response.Write("You selected '" & selOpSys.value _
        & "' for machine '" & txtName.value & "'.")
     End If
    通过上面例子不难看出:asp.net页面具有组件方式的方便性和灵活性。
    请注意:asp.net通过把页面的状态封装到一个隐藏的输入域,从而可以在不同的页面之间实现传递页面的状态。
    另外,asp.net也支持应用程序一级的状态管理。这个特性在ASP中就已经实现。
2.1.3.3 页面处理内部过程
我们来看看页面处理的内部过程。下面的过程是依次进行的:
2.1.3.3.1 Page_load
首先,页面的状态被恢复,然后触发Page_OnLoad事件。在这个过程中,你可以读取或者重置页面的属性和控件的属性,根据IsPostBack属性判定页面是否为第一次被请求,执行数据绑定,等等。
现在我们通过一个具体的例子,来详细讲述Page_load事件:
    我们所做的这个例子关于用户登录的。
    我们先来看page.aspx的代码:
<!--源文件:form\web页面简介\page.aspx-->   
<%@ Register TagPrefix="Acme" TagName="Login" Src="page.ascx" %>
    <html>
    <title>登录演示</title>
    <script language="VB" runat="server">
    Sub Page_Load(Sender As Object, E As EventArgs)
      If (Page.IsPostBack)
      MyLabel.Text &= "用户名:" & MyLogin.UserId & "<br>"  
      MyLabel.Text &= "密码: " & MyLogin.Password & "<br>"
      End If
    End Sub
</script>
<body style="font: 10pt verdana">
 <center> <h3>登录</h3></center>
 <form runat="server">
    <Acme:Login id="MyLogin" UserId="" Password="" BackColor="beige" runat="server"/>
 </form>
 <asp:Label id="MyLabel" runat="server"/>
 </body>
</html>
    在这个文件中,我们使用了Page_OnLoad事件的IsPostBack属性,用来显示用户登录时的用户名和密码。
在来看一下page.ascx文件:
<!--源文件:form\web页面简介\page.ascx-->
    <script language="VB" runat="server">
    Public BackColor As String = "white"
    Public Property UserId As String
      Get
        Return UserName.Text
      End Get
      Set
        UserName.Text = Value
      End Set
    End Property
    Public Property Password As String
      Get
        Return Pass.Text
      End Get
      Set
        Pass.Text = Value
      End Set
    End Property
 </script>
<center>
<table style="background-color:<%=BackColor%>;font: 10pt verdana;border-width:1;
border-style:solid;border-color:black;" cellspacing=15>
 <tr>
    <td><b>用户名: </b></td>
    <td><ASP:TextBox id="UserName" runat="server"/></td>
 </tr>
 <tr>
    <td><b>密码: </b></td>
 <td><ASP:TextBox id="Pass" TextMode="Password" runat="server"/></td>
 </tr>
 <tr>
    <td></td>
    <td><ASP:Button Text="提交" runat="server"/></td>
 </tr>
</table>
</center>
   在这个文件中,我们设置了控件的属性。使之能在page.aspx中调用
   程序的运行如图:
 
 
 
 
 
 
 
 
 
 
 
 

 


 

    在下一个例子中,我们将使用Page_OnLoad事件,来执行数据绑定:
文件databind.aspx代码如下:
<!--源文件:form\web页面简介\databind.aspx-->
   <html>
   <head>
   <title>数据绑定演示</title>
     <script language="VB" runat="server">
        Sub Page_Load(sender As Object, e As EventArgs)
            If Not IsPostBack Then
               Dim values as ArrayList= new ArrayList()
               values.Add ("北京")
               values.Add ("上海")
               values.Add ("杭州")
               values.Add ("成都")
               values.Add ("重庆")
               values.Add ("西安")
               DropDown1.DataSource = values
               DropDown1.DataBind
            End If
        End Sub
     ‘定义按钮的单击事件
       Sub SubmitBtn_Click(sender As Object, e As EventArgs)
       ’结果显示
           Label1.Text = "你选择的城市是: " + DropDown1.SelectedItem.Text
        End Sub
    </script>
</head>
<body>
<center><h3><font>数据绑定演示</font></h3></center>
    <form runat=server>
<center><asp:DropDownList id="DropDown1" runat="server" /></center>
<center><asp:button Text="提交" OnClick="SubmitBtn_Click" runat=server/></center>
        <p>
<center><asp:Label id=Label1 font-name="Verdana" font-size="10pt" runat="server" /></center>
   </form>
 <body>
</html>
 
程序运行效果如图:

当我们点击“提交”按钮时:
 
 
关于我们 | 法律申明 | 地理学科网 | 联系方式
广西师范学院资源与环境科学学院 - copyright@2009-2010 nnnug,all rights reserved.