蜗牛,在赛跑

--努力去改变吧
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Flash后台——ASP/ASP.NET/PHP/Java/JavaScript/Delphi总动员

Posted on 2007-12-27 13:16  body  阅读(484)  评论(0)    收藏  举报

10.2 两个Demo示例

10.2.1 Demo示例(1):读取ASP.NET返回的值

本节我们将讲解用Flash与ASP. NET交互的基本知识。首先我们在“解决方案资源管理器”面板内的地球标识上点右键,选择“填加新项”,在弹出的命名选项卡中,我们给页面命名为load.aspx,同上节一样,填加之后点击页面左边的+号,即可展开其逻辑代码load.aspx.cs。进入load.aspx的编辑界面,在左下角选择“源”的编辑方式。把除第一句以外的所有代码都删除,第一句修改如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="load.aspx.cs" Inherits="load" CodePage="65001"%>

解释一下这句代码,在ASP章已经学过,一个完整的ASP页包含若干“声明”:文档类型声明、编码声明等等。本句就是ASP.NET中的声明:“<%” 表示HTML页面中ASP.NET代码的开始“%>”表示HTML页面中ASP.NET代码的结束。其他声明的解释如下表:

ASPX页声明

解释

@Page Language="C#"

表示页面后台语言是C#

AutoEventWireup="true"

绑定事件功能开启(可以用”Page_Init”和”Page_Load”事件)

CodeFile="load.aspx.cs"

逻辑代码是load.aspx.cs

Inherits="load"

引用类load

CodePage="65001"

编码方式UTF-8

由于我们通过XML和Flash交互,所以我们删除了load.aspx中所有的HTML代码,让逻辑代码包办一切输出行为。进入逻辑代码load.aspx.cs,并开始构造思路: 我们想让Flash用loadVariables,LoadVars.load和XML.load向load.aspx提出请求,利用myMethod这个GET参数,作为不同请求的标识。load.aspx把参数值送交逻辑层分析选择,最后由逻辑层负责返回相应的结果:

1.    如果myMethod值为空,则load.aspx返回字符串:请求为空。

2.    如果myMethod值为loadvariables,则load.aspx返回字符串:theValue=这个方式是loadVariables!

3.    如果myMethod值为loadvars,则load.aspx返回字符串:“theMethod=这个方式是loadVars&theData=利用字符串Flash与ASP.NET通信”

4.    如果myMethod值为xml,则返回一个XML文档:“<?xml version='1.0' encoding='utf-8'?><data method='这个方式是xml'>利用XML,Flash与ASP.net通信</data>”

看过上面的思路分析,学过程序设计的读者几乎都会选择switch语句:这种分支选择问题,switch语句最为方便,思路也最清晰。下面是逻辑代码:

/*--------------------------------------------------------------------------------------------------------------------------------

以下诸句表示的是导入命名空间,每个页面被创建时,Visual Studio软件自动为我们创建的,如果我们还需要处理其他类的实例,可以导入其他命名空间

---------------------------------------------------------------------------------------------------------------------------------*/

    using System;

    using System.Data;

    using System.Configuration;

    using System.Collections;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

public partial class load : System.Web.UI.Page

{

//你应该记得load.aspx中引用的是load类,在此处我们来定义它

    protected void Page_Load(object sender, EventArgs e)

{

//因为load.aspx中,AutoEventWireup属性被设置为true,所以我们可以使用Page_Init和Page_Load事件,Page_Load是当页面被载入时触发的事件

/*---------------------------------------------------------------

以上诸行代码是编程常用的switch语句,在多条件的选取中,它结构清晰不易混乱。

本例中,我对由GET方式提交过来的myMethod进行选择判断。在ASP.NET中,外部提交的数据,可以按Request["myMethod"]这样的形式接收。

---------------------------------------------------------------*/

        switch (Request["myMethod"])

        {

            case "":

                Response.Write("请求为空");

                break;

            case "loadvariables":

                Response.Write("theValue=这个方式是loadVariables!");

                break;

            case "loadvars":

                Response.Write("theMethod=这个方式是loadVars&theData=利用字符串Flash与ASP.NET通信");

                break;

            case "xml":

                Response.Write("<?xml version='1.0' encoding='utf-8'?><data method='这个方式是xml'>利用XML,Flash与ASP.net通信</data>");

                break;

            default:

                Response.Write("请求为空");

                break;

        }

    }

}

保存,在浏览器中查看将得到图10.26 – 10.29所示:

图10.26

图10.27

图10.28

图10.29

       * 注:这个例子的源文件,在附带光盘下:源文件"第十章"1"load.aspx和load.aspx.cs

从结果来看,测试是成功的!!!接下来该做Flash的部分了,废话不说,打开Flash Professional 8软件,趁它疯狂读硬盘的时候,我们放松一下大脑,顺便来设计一下Flash的设计思路。

10.2.2在Flash中用三种方式显示ASP.NET返回的值

类似于前面的例子,我们仍然用一个ComboBox组件来选择读取方式,用一个TextArea组件来显示结果。

首先我们用dataProvider给ComboBox填充文字和初始值,最后给它增加监听器,使之一旦改变,switch函数就执行判断,并执行相应函数。代码如下:

//声明myComboBox为一个新的ComboBox组件

var myComboBox:mx.controls.ComboBox;

//声明myTextArea为一个新的TextArea组件

var myTextArea:mx.controls.TextArea;

//给myComboBox增加数据源

myComboBox.dataProvider = [{data:0, label:"点击选择"}, {data:1, label: "loadVariables方式"}, {data:2, label: "loadVars方式"}, {data:3, label: "XML方式"}];

/*---------------------------------------------------------------------------------------------------------------------------------

为myComboBox组件增加监听事件,从这你应该看出第一章学习Flash监听机制的好处。Switch语句被用在Flash里判定myComboBox组件变化后的值:如果值为1,则用loadVariables方法,如果值为2,则用loadVars方法,如果值为3则用XML.load方法

--------------------------------------------------------------------------------------------------------------------------------*/

//为myComboBox定义监听函数

var listenerObject:Object = new Object();

//当myComboBox改变选项时

listenerObject.change = function(eventObject:Object) {

       //选择comboBox的值

    switch(eventObject.target.value){

              //如果是1,执行firstMethod方法

              case 1: firstMethod();break;

              //如果是2,执行secondMethod方法

              case 2: secondMethod();break;

              //如果是3,执行thirdMethod方法

              case 3: thirdMethod();break;

              //默认情况什么都不做

              default:0;break;

       }

};

//为myComboBox增加监听函数

myComboBox.addEventListener("change", listenerObject);

/*-----------------------------------------------------------------------------------------------------------------------------

由于loadVariables没有onLoad触发事件,所以我们只能不停的利用setInterval一次次的使用checkIt函数检测,一旦读入的_root.theValue值不为空,才删除setInterval,显示读到的值

------------------------------------------------------------------------------------------------------------------------------*/

function firstMethod():Void{

       loadVariables("load.aspx?myMethod=loadvariables",_root, "GET");

       function checkIt() {

    if (_root.theValue == undefined) {

    myTextArea.text = "Loading... ";

    } else {

    myTextArea.text = _root.theValue;

    clearInterval(myInterval);

 }

}

var myInterval:Number = setInterval(checkIt, 100);

}

//定义secondMethod函数

function secondMethod():Void{

       //myTextArea组件显示“Loading……”字符串

       myTextArea.text = "Loading... ";

       //建立myLoadVars为一个新的LoadVars对象

       var myLoadVars:LoadVars = new LoadVars();

       //定义myLoadVars的onLoad函数

       myLoadVars.onLoad = function(success:Boolean):Void{

              //如果读取成功

              if(success){

                     //在myTextArea显示myLoadVars的theMethod属性和theData属性

                     myTextArea.text=myLoadVars.theMethod+""n"n"+myLoadVars.theData;

              }else{

                     //如果读取失败,现在错误信息

                     myTextArea.text = "文件传输错误";

              }

       }

       //myLoadVars读取同目录下的文件,为了防止读取缓存,在地址后加了一个随机数。

       myLoadVars.load("load.aspx?myMethod=loadvars&temp="+Math.random());

}

//定义第三种方式thirdMethod,也就是XML读取

function thirdMethod():Void{

       //myTextArea组件显示“Loading……”

       myTextArea.text = "Loading... ";

       //声明myXML为一个新的XML对象

       var myXML:XML = new XML();

       //声明myXML忽略空白节点

       myXML.ignoreWhite=true;

       //定义myXML的onLoad函数

       myXML.onLoad =function(success:Boolean):Void{

              //如果读取成功

              if(success){

                     //myTextArea组件显示myXML的值

                     myTextArea.text = myXML.toString();

              //如果读取失败

              }else{

                     //显示错误信息

                     myTextArea.text = "文件传输错误";

              }

       }

       //myXML读取同目录下的文件,为了防止读取缓存,在地址后加了一个随机数。

       myXML.load("load.aspx?myMethod=xml&temp="+Math.random());

}

*注:这个例子的源文件,在附带光盘下:源文件"第十章"1"4-1-1.fla,版本为Flash 8,请勿用低于Flash 8版本软件打开。

注意:这个例子我们为了兼顾扩展性,采取了相对路径,所以要把SWF文件导出到和load.aspx页面同一层文件夹内。我建议,所有源文件最好都层级有序地放入同一个顶层文件夹内。这样更有利于你对整个工程的支配。

图10.30为我解决方案管理器的截图:

图10.30

在浏览器中以虚拟路径访问4-4-1.html或4-4-1.swf都可以显示本例效果。图10.31为展开myComboBox但尚未选择的效果:

图10.31

图10.32所示为选择loadVariables选项时的效果:

图10.32

图10.33所示为选择loadVars选项时的效果:

图10.33

图10.34所示为选择XML选项时的效果:

图10.34

10.2.3 Demo示例(2)利用Flash读取SQL Server数据库的值(1)

本节我们来练习用Flash读取SQL Server数据库中的值,思路如下:用ASP.NET连接读取数据库,并生成XML列表,Flash去读取XML列表并且格式化结果显示在组件中。

    在Visual Studio 2005“解决方案资源管理器”的地球图标上点右键,选择“添加新项”,在弹出的窗口将之命名为xml_list.aspx,稍等片刻,工作区将自动转向该页面,同时在“解决方案资源管理器”内xml_list.aspx下可以展开其逻辑代码xml_list.aspx.cs。因为输出文档类型为text/xml,所以我们把list.aspx除第一行以外的所有代码都删除,且增加两个参数,修改后第代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xml_list.aspx.cs" Inherits="xml_list" ContentType="text/xml" CodePage="65001"%>

    保存为xml_list.aspx即可,新手朋友还可以再增加一个参数 debug=true,这样在程序出错时就会有具体的错误提示,不过记得,发布之前删除为好。接着双击xml_list.aspx.cs进入逻辑代码,把以下代码输入到文件中:

    using System;

    using System.Data;

    using System.Configuration;

    using System.Collections;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

//引入SQL命名空间,这是使用SQL Server 客户端必需的

using System.Data.SqlClient;

//定义被引用的xml_list类

    public partial class xml_list : System.Web.UI.Page

{

       //声明公有变量sql

        public string sql;

        protected void Page_Load(object sender, EventArgs e)

        {

            //设定strConnection为数据库连接字符串

        string strConnection = "Data Source=(local)""SQLEXPRESS;Initial Catalog=myTesterDB;User ID=myTester;Password=abcdefg; ";

        //建立一个SQL连接,连接字符串strConnection作为一个参数

        SqlConnection objConnection=new SqlConnection(strConnection);

        //连接应处于“打开“状态,否则一切操作都是徒劳的。

        objConnection.Open();

              //设置SQL语句,读取myTable中的5条数据

        sql = "SELECT top 5 * FROM [myTable] ORDER BY [myPoints] DESC+ ";";

        //建立一个SQL命令对象,它有两个参数:第一个是命令即SQL语句,第二个是连接名

        SqlCommand cmd = new SqlCommand(sql,objConnection);

       //ASP.NET最快的读取方式:SqlDataReader,与ASP中的“1,1”有些类似,都是快速的,只读的

        SqlDataReader dr = cmd.ExecuteReader();

        //输出XML头,XML根节点设置,其中包括:总记录数、总页数、当前页、管理状态

        Response.Write("<?xml version='1.0' encoding='utf-8'?><数据>");

         //while(dr.Read)相当与“有符合的记录就执行一次”,类似于ASP的rs.MoveNext+LOOP

               while(dr.Read()){

            /*---------------------------------------------------------------------------------------------------------------------

每读取一次就输出一个子节点,类似于ASP要读取RecordSet中的name值用rs("name")一样,ASP.NET要读取DataReader中的name值,用dr["name"];

---------------------------------------------------------------------------------------------------------------------*/

            Response.Write("<资料 用户名='"+dr["myUsername"]+"' 积分='"+dr["myPoints"]+"'介绍='"+dr["selfIntro"]+"'/>");

        }

        //输出XML结尾

        Response.Write("</数据>");

        //释放连接所耗资源

        objConnection.Dispose();

        //连接关闭

        objConnection.Close();

        //释放命令所耗资源

        cmd.Dispose();

        //释放DataReader所耗资源

        dr.Dispose();

        //DataReader关闭

        dr.Close();

    }

}

保存文件为xml_list.cs,在“解决方案资源管理器”中浏览xml_list.aspx效果如图10.35所示:

图10.35

       * 注:该示例的源文件在光盘 第十章"2"xml_list.aspx和xml_list.cs

10.2.4 Demo示例(2)利用Flash读取SQL Server数据库的值(2)

本节只需利用Flash读取ASP.NET取回的XML值即可完成一个简单的交互示例。在Flash软件中新建一个文档,拖入主场景一个TextArea组件,并命名为myTextArea,它用来显示结果,在Flash文档的动作面板中输入以下代码:

var myTextArea:mx.controls.TextArea;

var myXML:XML=new XML();

myXML.ignoreWhite=true;

myXML.onLoad=function(success:Boolean):Void{

       if(success){

              var root:XMLNode=this.firstChild;

              for(var i:Number=0;i<root.childNodes.length;i++){

                     myTextArea.text+="用户名:"+root.childNodes[i].attributes.用户名+""t";

                     myTextArea.text+="积分:"+root.childNodes[i].attributes.积分+""t";

                     myTextArea.text+="介绍:"+root.childNodes[i].attributes.介绍+""t";

                     myTextArea.text+=""n"n";

              }

       }

}

myXML.load("http://localhost:38960/WebSite1/xml_list.aspx ");

保存文件,调试代码,效果如图10.36所示:

图10.36

       * 注:此示例的源文件在 第十章"2"xml_list.fla