something

简介: 1. AutoPostback属性     如果希望把Changed事件立即传送给服务器(例如,改变了DropDownList的选项),可以把AutoPostBack属性设置为true。

1. AutoPostback属性

    如果希望把Changed事件立即传送给服务器(例如,改变了DropDownList的选项),可以把AutoPostBack属性设置为true。

________________
2. Page类的PreviousPage属性
    利用PreviousPage从前一个页面定义的控件中获取值,有以下两种方法:

    ·i  利用FindControl()

        例:

            在新页面中写入如下代码

            string firstName = ((TextBox)PreviousPage.FindControl("txtFistName")).Text;  // txtFistName是前一个页面中控件的ID。TextBox将找到的控件转换成TextBox类型。


    ·ii 定制结构,创建强类型化PreviousPage

        例:

           首先,在App_Code中创建一个 新的 C#文件。假设命名为 RegInfo.cs,并在其中创建一个结构,如下:

           public struct RegInfo

           {
                public string FirstName {get; set;}

                public string LastName {get; set;}

                ......

           }

           

           在第一个页面中添加公共属性 RegInfomation

          public RegInfo RegInfomation

           {
                get

                {
                    return new RegInfo()

                    {
                        FirstName = txtFirstName.Text;

                        LastName = txtLastName.Text;

                        .....

                    }

                }

           }

           

           在第二个页面的Page指令下添加 PreviousPageType指令

            «% Page Language="C#" AutoEventWireup="true" CodeFile="SecondPage.aspx.cs" Inherits="SecondPage_aspx" %»

            «% PreviousPageType VirtualPath="~/Default.aspx" %»

   

           然后,就可以在第二个页面中使用如下代码,调用第一个页面的数据,如下:
           RegInfo ri = PreviousPage.RegInfomation;        // 将第一个页面的 公共属性 赋值 给 ri

            label1.Text = ri.FirstName;                            // 用ri.FirstName来获取第一个页面的txtFirstName.Text 的值

            .......

________________
3. PreviousPage.IsValid 验证
    当第一个页面中 包含输入有效性验证控件,而回送的页面不同于 包含验证的第一个页面时,在页面中需要用到IsValid属性,验证上一个页面的结果是否有效。如下:

     protected void Page_Load(object sender, EventArgs e)

     {
        try
        {
            if (!PreviousPage.IsValid)

            {
                labelResult.Text = "Error in previous page";

                return;

            }

            .........

        }   ......

     }

    ********************************

    验证控件创建了客户端的JavaScript代码。
    可在验证控件的EnableClientScript属性设置是否使用JavaScript验证,设置为false就可以关闭JavaScript。

    也可以用Page类的ClientTarget属性:

                 ClientTarget = downlevel 脚本代码不返回给客户端

                 ClientTarget = uplevel    脚本代码返回给客户端

                 ClientTarget = automatic 根据浏览器的功能,自动选择是否返回脚本代码

            
________________
4. 状态管理(ViewState、Cookie、Session、Application、Cache)
    
状态类型  客户端 或 服务器 资源  有效时间  
ViewState  客户端  只在一个页面中  
Cookie  客户端  关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上  
Session  服务器  会话状态与浏览器会话相关。会话在超时后无效(默认为20分钟)  
Application  服务器  应用程序状态在所有的客户端上共享,这个状态在服务器重启之前都是有效的  
Cache  服务器  类似于应用程序状态,高速缓存是共享的。但是,是高速缓存无效有更好的控制方式  

   

    ViewState:

        ViewState包含的状态与控件发送给客户端时 包含的状态相同。

        当浏览器把 窗体发送 回服务器时, 控件包含新值,而 ViewState包含初始值。如果ViewState中的初始值 与 控件中的新值有区别时,调用相应的事件处理程序。


        使用ViewState的缺点是,数据总是要从服务器 -» 客户端,再 客户端 -» 服务器。增加了网络流量。
        关闭ViewState的方法:
        «% Page Language="C#" AutoEventWireUp="true" CodeFile="Default.aspx.cs" Inherts="Default_aspx" EnableViewState="false" %»

       

        还可以设置 控件的 EnableViewState属性。只有没有配置ViewState的控件才使用页面配置的值。

       

        还可以把定制的数据存储在ViewState中。为此,可使用索引符 和 Page类的ViewState属性。

        ViewState["mydata"] = "my data";   //将字符串存储在 ViewState中

        读取:

        string mydata = (string)ViewState["mydata"]; //将前面存储的值读取出来。


        在发送客户端的HTML代码中,整个页面的ViewState存储在一个隐藏字段中:

        «input type="hidden" name="_VIEWSTATE" value="/wEPDwUKLTU........................."/»

        使用隐藏字段的优点是,每个浏览器都能使用这个特征,用户不能关闭它。


    Cookie:

        ViewState只能保存在页面中。如果状态应保存在多个不同的页面中,就应使用cookie在客户端保存状态。

       

       cookie在HTTP头中定义。
        使用HttpRespone类可以把cookie发给客户端。
        Response是Page类的一个属性,它返回一个HttpResponse类型的对象。
        HttpResponse类定义了返回HttpCookieCollection的Cookie属性。
        使用HttpCookieCollection可以向客户端返回多个cookie。

       

        如何把cookie发给客户端:

            string myval = "myval";

            HttpCookie cookie = new HttpCookie("mycookie");   //首先实例化一个HttpCookie对象,并设置cookie的名称为“mycookie”

            cookie.Values.Add("mystate",myval);                 // 用HttpCookie类的Value属性可以添加多个cookie值

            Response.Cookie.Add(cookie);                       // 发送cookie


        设置cookie有效期:

            cookie可以是临时的,仅在一个浏览器会话中有效,也可以是存储在客户端磁盘上。

            可以使用HttpCookie对象设置的Expires属性。

            HttpCookie cookie = new HttpCookie("mycookie");

            cookie.Values.Add("mystate","myval");

            cookie.Expires = DateTime.Now.AddMonths(3);    // 设置cookie有效期为3个月

            Response.Cookies.Add(cookie);

        尽管设置了cookie,但不一定能存储那么长时间。
        用户可能会删除cookie;

        如果本地有太多的cookie,浏览器也可能删除它。

        浏览器只能为每个服务器存储 20 个cookie;为所有服务器 存储 300个cookie;cookie大小有限制,cookie不能存储多于4K的数据。达到极限后,就删除有一段时间不用的cookie。


        读取客户端发送的cookie:

        客户从服务器请求页面时,相应的cookie就可以使用了。

        并作为HTTP请求的一部分发送给服务器。

        要读取cookie,可以访问HttpRequest对象的cookie集合。

        与HTTP响应一样,Page类也有一个Request属性 返回 HttpRequest类型的对象。
        Cookies属性返回HttpCookieCollection,它可以读取客户端发送的cookie。

        可以用索引符来访问cookie,并使用HttpCookie的value属性从cookie中获取值。

        HttpCookie cookie = Request.Cookies["mycookie"];

        string myval = cookie.Values["mystate"];


   Session:

        会话状态 与 浏览器会话相关。 当客户第一次打开ASP.NET页面时,会话就开始了。当客户20分钟(session默认值)内没有访问服务器时,会话结束。

       
        可以在Global Application类中定义自己的代码,在会话开始或结束时运行。新的Global Application类会创建global.asax文件。文件中定义了一些事件处理程序:

        «% Application Language="C#" %»

        «script runat="server"»

            void Application_Start(object sender, EventArgs e) {......}

            void Application_End(object sender, EventArgs e) {......}

            .......

        «/script»

       

        会话状态可以存储在HttpSessionState对象中。
        与当前HTTP环境相关的会话状态对象可以使用Page类的Session属性来访问。


      设置会话状态:

        void Session_Start(Object sender, EventArgs e)  { Session["mydata"] = 0; } // 在Session_Start()事件处理程序中,初始化会话变量,mydata会话被初始化为 0

   

       读取会话状态:

        int val = (int)Session["mydata"];

      

       要把客户端 与 会话变量 关联起来, ASP.NET默认使用一个临时cookie 和 一个会话标识符。

       ASP.NET也支持没有cookie的会话,其中URL标示符 用于把 HTTP请求映射到同一个会话。


    Application: 
       如果数据要在多个客户端共享,就可以使用应用程序状态(Application)。比如,网站访问计数器。

       应用程序状态使用HttpApplicationState类,通过Page类的Application属性访问。

   

       以网站访问计数器为例:

       设置状态:

       void Application_start(object sender, EventArgs e) { Application["userCount"] = 0 ; } // Application_Start()是global.asax文件中的事件处理方法,在启动网站的第一个页面时启动。

       

       改变状态:

       void Session_Start(Object sender, EventArgs e)

       {
            Application.Lock();                                    // 应用程序状态改变之前,必须要用Lock()锁定,因为多个用户可以同时访问这个应用程序变量。

            Application["userCount"] = (int) Application["userCount"] +1;       

            Application.UnLock();                          // 锁定 与 解锁之间的时间应尽量短,否则,其他人就得等解锁之后才能操作。

       }


       读取状态:

       label1.Text = Application["userCount"].ToString();


    Cache:

        类似于Application,可以在多个客户端上共享。但Cache可以自定义何时失效。我们不是给每个请求读取文件或数据库,而是把数据存储在高速缓存(Cache)中。

        Cache使用System.Web.Caching名称空间 和 Cache类。


        给Cache添加对象:

        Cache.Add("mycache", myobj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null );

        Page类的Cache属性返回一个Cache对象。使用Cache类的Add()方法可以把任意对象赋予高速缓存。
        第一个参数,定义Cache项的名称;

        第二个参数,是要被缓存的对象;

        第三个参数,定义了依赖关系。比如,Cache依赖于一个文件,当文件改变时,高速缓存对象就失效,本例中没有依赖关系;

        第四个参数,定义了Cache失效的绝对时间;

        第五个参数,定义了Cache失效的相对时间;

        第六个参数,定义了Cache的优先级,当需要删除Cache时,会根据优先级删除。优先级低的先删除。

        最后一个参数,定义了一个方法,当删除Cache调用。当Cache依赖于一个文件时,就可以用该参数:文件改变时,删除Cache,调用方法,再次读取文件,重新建立Cache。


        读取Cache:

        object o = Cache["mycache"];

        if(o == null)

            {  //reload the cache  }

        else

            {  //use the cache
                MyClass myObj = (MyClass)o;
            }

        使用Cache属性返回的对象之前,必须检查结果是否为null,当高速缓存失效时,结果就是null。

________________
5. 母版页
        母版页的扩展名是.master。

        母版前台的第一行指令:

            «% MasterLanguage="C#" AutorEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %»      //AutorEventWireup="true" 意思是会调用Page类的6个事件

             //Page类的六个事件:InitComplete,LoadComplete,PreLoad,PreRenderComplete,SaveStateComplete

        
        在web站点中,只有母版页才使用«html»,«head»,«body»和«form»等HTML元素。

        web页面本身只包含内嵌到«form»元素中的内容,嵌入到母版中的ContentPlaceHolder控件中。母版也可以为ContentPlaceHolder定义默认内容。


        母版前台代码:

            «html xmlns="http://www.w3.org/1999/xhtml

            «head runat="server"»

                «title» *****«/title»

                    «asp:contentplaceholder id="head" runat="server"»   

                    «/asp:contentplaceholder»            
            «/head»

            «body»

                «form id="form1" runat="server"»

                    «div»

                        «asp:contentplaceholder id="ContentPlaceHolder1" runat="server"»

                        «/asp:contentplaceholder»

                    «/div»

                «/form»

            «/body»

            «/html»


        使用母版页:

            在Page指令中使用MasterPageFile指令:

            «%Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="ture" CodeFile="Default.aspx" Inherits="default" Title="Untitled Page" %»  //指定母版页

            «asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="server" » «/asp:Content»

            «asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="server" » «/asp:Content»        //用Content控件把ContentPlaceHolder用ContentPlaceHolderID联系起来


            在web.config文件中配置:

            «configuration»

                «system.web»

                    «pages masterPageFile="~/MasterPage.master"/»

                    «!--....--»

                    «/pages»

                «/system.web»

            «/configuration»

            然后,在web页面中进行Content元素配置。

            如果,同时使用Page指令的masterPageFile属性  与  web.config中的配置,Page指令会覆盖web.config的设置。


        编程修改模板页:

            比如,可以把不同的母版页用于不同的设备 或 不同的浏览器。Page_PreInit(Page类的6个事件之一)是修改母版的最后一个地方。
            下面依客户端浏览器设置母版页:

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

            {
                void Page_Load(object sender, EventArgs e)    {.......}

                void Page_PreInit(object sender, EventArgs e)

                {
                    if (Request.UserAgent.Contains("MSIE"))                      //如果浏览器发送MSIE字符串 和 浏览器名称(由IE发送)

                    {
                        this.MasterPageFile = "~/IE.master";                       //就将母版设置为IE.master

                    }

                    else

                    {
                        this.MasterPageFile = "~/Default.master";

                    }

                }

            }

________________
6. CSS代码
        定义:

        «head runat="server"»

            «title»*****«/title»

            «style type="text/css"»

                .style1

                {
                    width: 100% ;

                    height:353% ;

                }

                .style2

                {
                    text-align: center ;

                    font-size:smaller ;

                }

             «/style»

        «/head»

        使用:

        «table class="style1"»

            «td style="style2"»

________________
7. 站点导航
        导航控件:SiteMapDataSource, Menu, SiteMapPath, TreeView

        
        站点结构由Web.sitemap定义。

        
        SiteMapDataSource是数据源控件,可以使用不同的提供程序。
        默认是使用XmlSiteMapProvider类来获取数据。
        XmlSiteMapProvider类默认使用Web.sitemap页面。
        如果重命名了Web.sitemap这个XML文件,就需要在提供程序的siteMapFile属性重新设置文件名。

________________
8. 用户控件 .ascx
        Control指令:

            在源文件的第一行中使用control指令表示用户控件。CodeFile 和 Inherits属性的用法与Page指令相同。

            «%@ Control Language="C#" AutoEventWireup="true" CodeFile="DemoUserControl.ascx.cs" Inherits="DemoUserControl" %»

            在用户控件中不是用«html»和«form»标记


        静态添加到页面:

            使用Register指令来引用用户控件:

                «%@ Page Language="C#" AuotEventWireup="true" CodeFile="DemoPage.aspx.cs" Inherits="DemoPage" %»

                «%@ Register TagPrefix="ucl" TagName="DemoUserControl" Src="DemoUserControl.ascx" %»   

                «html xmlns="http://www.w3.org/1999/xhtml

                ...

                «ucl:DemoUserControl ID="DemoControlA" runat="server"»    //«ucl:DemoUserControl»是根据Register指令中的设置的来的

                ...


        动态加载:

            void Page_Load(object sender, EventArgs e)

            {
                Control c1 = LoadControl("DemoUserControl.ascx");

                PlaceHolder1.Controls.Add(c1);            //PlaceHolder1是一个PlaceHolder控件

            }

________________
9. 个性化配置
        为了永远记住用户信息:可以使用个性化配置(profile)。

        个性化配置特性:

        ·i    永久存储的。
                    数据由”个性化配置提供程序“ 管理。
                    ASP.NET 3.5 包含了SQL 和 Access的提供程序。 但也可也自己开发提供程序。

        ·ii   强类型化的

                    会话 和 应用程序变量 必须转换类型后才能访问数据。

                    使用个性化配置文件,会生成带有个性化配置名的属性。 该属性的名称 和 类型 在 配置文件中定义。

        ·iii  可用于匿名 和 授权  用户

                    匿名用户的凭证可以存在cookie中。

       

        创建个性化配置:

            在web.config文件中添加«profile»XML元素部分

            «configurationxmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0

                «system.web»

                         .....

                    «profile»

                        «properties»   

                            «add name="Country" /»        //Country属性的默认类型为string

                            «add name="Visits" type="System.Int32" defaultValue="0" /»

                            «add name="LastVisit" type="System.DateTime" /»

                        «/properties»

                    «/profile»

                        .....

                «/system.web»

            «/configuration»


            写入配置:

            protected void OnCountrySelection(object sender, EventArgs e)

            {
                Profile.Country = this.DropDownListCountries.SelectedItem.Value;

                Profile.Save( );

            }   


            显示配置文件中的当前值:

            void Page_Load(object sender, EventArgs e)

            {
                if (!Page.IsPostBack)

                {    DropDwonListCountries.SelectedValue.Value = Profile.Country;}

                     labelLastVisit.Text = Profile.LastVisit.ToLongTimeString();   

                     labelVisitCount.Text = Profile.Visits.ToString( );

                    labelCountry.Text = Profile.Country;             // Profile的属性是强类型化的

                    
                     Profile.Visits++;
                     Profile.LastVisit = DateTime.Now;                    
            }


            Page类中没有Profile这个属性,该属性也不是在web.config中配置的,是动态创建的。
            Profile属性的类型是一个动态创建类,派生于ProfileBase,包含配置文件的定义。

        个性化配置组(«group»元素):

             «profile»

                «properties»

                    «add name="Country" /»

                    «add name="Visits" type="System.Int32" defaultValue="0" /»

                    «group name="ProfileGroup1" »

                       «add name="Country" /»
                        «add name="City" /»

                    «/group»

                «/properties»

            «/profile»

            访问组中定义的配置值:

            string country = Profile.ProfileGroup1.Country;

           

        组件的个性化配置:

            组件代码中,不能用Profile属性,要用HttpContext来访问。
            Current是HttpContext类的一个静态属性,它返回一个HttpContext对象。

            Profile属性返回一个ProfileBase类的对象,每个配置值可以用索引符来访问。

            索引符定义 返回 Object对象,所以,需要类型转换。

            string country = (string) HttpContext.Current.Profile["Country"];

       

        定制数据类型中的个性化配置:

            个性化配置 还可以 储存 定制数据类型,但这些数据需要支持序列化机制。

            个性配置支持的序列化机制: 
                XML序列化::XML序列化是默认的;

                二进制序列化:在二进制序列化中,类必须用[Serializable]属性标记;

                字符串序列化:在字符串序列化中,可以使用类型转换类来序列化;

           

            用serializeAs属性定义序列化方式,属性值有:Binary, Xml 和 String。

            如果没有设置该属性,就是用XML序列化。

                «profile»

                    «properties»

                        «add name="Demo" type="MyClass" serializeAs="Binary" /»

                    «/properties»

                «/profile»


        匿名用户的个性化配置:

            必须在配置文件中启用匿名用户,并逐个设置能用于匿名用户的每个个性化配置属性。

            «configuration»

                «system.web»

                    «anonymousIdentification enabled="true" /»

                    «profile»

                        «properties»

                            «add name="Country" allowAnonymous="ture"»

                        «/properties»

                    «/profile»

            配置匿名用户后,就会在 “个性化配置提供程序的数据库” 中创建匿名用户。
            匿名用户会获得ID,ID默认存储在cookie中。也可以用URL中的标识符来替代cookie。


            匿名配置信息 转移到 授权用户中:

            例如,在购物网站中,将商品加到购物车中,当发送订单时,就必须登录系统。将购物车的信息迁移到授权用户上。

            为处理匿名用户信息,可以利用global.asax中的以下事件:
                AnonymousIdentification_Create :当匿名用户第一次访问站点时,会创建匿名个性化配置。此时,会调用这个事件;

                AnonymousIdentification_Remove :授权用户访问站点,且授权用户请求中包含一个匿名用户的配置信息时,会删除匿名用户配置信息。并会调用这个事件;

                Profile_MigrateAnonymous : 调用完 AnonymousIdentification_Remove 后,会调用这个事件。利用该事件处理程序会把你们pe

            
                void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)

                {
                    if (Profile.Country == null)                                       //登录后,Profile.Country 中存储的是授权用户的值。所以,先检测一下是否有值。

                    {
                        Profile.Ccountry = Profile.GetProfile(e.AnonymousId).Country;      //通过GetProfile(匿名用户ID)方法,读取匿名用户的配置。

                    }

                }

________________
10. Web Parts
        Web Parts框架有 区域(Zone)和 部分(Part)组成。Part 包含在 Zone中。

        共有四个区域(Zone):

            Web Parts Zone:这是主区域。一个页面可以有多个Web Part Zone来定义布局。区域中可以包含多个web part,用户控件 或 web服务器控件;
            Catalog Zone:该区域允许用户从目录中选取要显示的web part。

            Editor Zone:用户可以编辑Web Part的行为和外观。允许修改的web part有:AppearanceEditorPart, BehaviorEditorPart 和 LayoutEditPart。

            Connections Zone: 用于把多个web part连接在一起,实现web part之间的通信。

       

        0)WebPartManager控件:

                每个Web Parts站点都需要一个WebPartManager控件。通过它,可以管理 创建、删除或移动web parts。
                使用的方法:

                将下面的ASPX代码加到Web页面上

                «asp:WebPartManagerID=“WebPartManager1” runat=“server”» «/asp:WebPartManager»

                这个控件在运行期间,没有用户界面,也不需要配置任何属性。它的属性只能用于删除和关闭web part时配置一些警告信息。
                WebPartManager的方法可用于改变显示模式。

        1)WebPartZone控件:

                要使用Web Parts框架,至少要有一个WebPartZone。

                在ASPX页面中代码:

                «asp:WebPartZone ID="EventsZone" runat="server" »

                    «ZoneTemplate»

                        «ucl:ListEvents ID="ListEvents1" runat="server"/»  // 包含了一个用户自定义的控件

                    «/ZoneTemplate»

                «/asp:WebPartZone»

                WebPartZone中可以定义布局,颜色和菜单。 示例见书P546。

                «asp:WebPartZone BorderColor="#CCCCCC" Font-Names="Verdana"..........

       

        2)EditorZone控件:

                 AppearanceEditorPart, BehaviorEditorPart 和 LayoutEditPart三个控件如下图。
 
          
         3)CatalogZone控件:

                 CatalogZone控件是一个真正的目录-可以从目录中选取web part。
                 ASP.NET有三种目录: PageCatalogPart, DeclarativeCatalogPart, ImportCatalogPart。

                    PageCatalogPart:列出了web页面中所有的web part;

                    DeclarativeCatalogPart: 列出在«WebPartsTemplate»中显示定义的web part;

                        «asp:CatalogZone ID="CatalogZone1" runat="server"»

                            «ZoneTemplate»
                                «asp:DeclarativeCatalogPartrunat="server" ID="DeclarativeCatalogPart1" »
                                    «WebPartsTemplate»
                                        «ucl:ListEvents ID="ListEvents2" runat="server" /»

                                        «asp:Calendar ID="Calendar1" runat="server"  /»

                                    «/WebPartsTemplate»   

                            «/ZoneTemplate»

                        «/asp:CatalogZone»

                    ImportCatalogPart:用于将 存储在客户系统 中的Web Part 导入 到服务器上。

        4)ConnectionsZone控件:

                WebPartManager负责 初始化 和 管理Web Parts之间的通信。 web part通信分为:Provider 和 Consumer。

                Provider用属性[ConnectionProvider] & Consumer用属性[connectionConsumer]来标识。

                例:

                    Provider 部分:

                    在App_Code中创建一个文件,建立一个接口

                    public interface ICountry

                    {
                        string GetCountry();

                    }

                    在控件代码中:                    
                    public partial class ListEvents: System.Web.UI.UserControl, ICountry

                    {
                        ......

                        public string GetCountry()

                        {    return DropDownListCountries.SelectedItem.Value; }


                        [ConnectionProvider("Country", "CountryProvider")]

                        public ICountry GetCountryInterface()

                        {   return this;}
                        .......

                    }

                   

                    Consumer部分:

                    [ConnectionProvider("Country", "CountryProvider")]
                    public ICountry SetCountry(ICountry provider)

                    {    
                         string country = provider.GetCountry();

                         if (!string.IsNullOrEmpty(country))  { LabelCountry.Text = country; }

                    }                     
               

                接下来有两种方法建立连接:

                a) 使用WebPartManager建立静态链接:

                    «asp:WebPartManager ID="WebPartManager" runat="server" »

                        «StaticConnection»

                            «asp:Connection ID="CountryConnection"  ProviderID="ListEvents1" ProviderConnectionPointID="CountryProvider"
                                                                                          ConsumerID="Country1"  ConsumerConnectionPointID="CountryConsumer" /»

                        «/StaticConnection»

                    «/asp:WebPartManager»

               

                b) 启用ConnectionsZone,使用户控制连接和断开连接:

                    删除WebPartManager上的静态连接;

                    添加ConnectionsZone控件;

                    把WebPartMananager设置为ConnectDisplayMode;

                    在Provider或Consumer控件上会提供Connect菜单,点击后会打开ConnectionsZone,然后进行设置。

________________
11. JavaScript
        ECMAScript是这个脚本语言的标准化版本。

        Script元素:

            在HTML代码中添加JavaScript代码
            «script language="javascript" type="text/javascript"»
                «!--
                function foo()
                { ..... }
               --»
            «/script»    
            也可以把脚本代码放在一个单独的.js文件中, 然后,在script块中用src属性引用这个单独的文件:
            «script language="javascript" type="text/javascript" src="SampleScripts.js" /»   


        变量的声明:

            变量用var关键字声明(但这个var与C#3.0中的完全不同)。

            JavaScript不是强类型化语言,var声明的变量可以是任何类型,比如:

            var x=3;
            x="text";

            x=new Object();

            x.FistName = "Tom";

            变量时动态创建 和 赋值的。

       

            也可以在一行代码上声明和初始化对象:

            var p = {"FirstName":"Tom", "LastName": Turbo };

           

            访问属性值:

            var f = p.FirstName;

            var l = p["LastName"];


        定义函数:

            函数用function关键字定义
            function foo(arg1, arg2)
            {    ......    }
            也可以用Function对象来定义引用函数的变量。
            var add = new Function("x","y","return x + y");   //最后一个参数定义了函数的执行方式,之前的参数列出函数的变元。

        语句:

            JavaScript可以使用 :for,while,do...while,if...else,switch,for...in(代替foreach)

            
            for...in不仅可以迭代数组,还可以迭代对象的所有属性,如下所示:

            var p = {"FirstName":"Tom", "LastName": Turbo, "Country":"Austria"};  //三个属性

            var s = "";

            for (key in p)

            {
                s += key;        //key 为 p对象的属性

                s += ":"

                s += p[key];

                s += "/t";

            }


        预定义对象 和 方法:

            JavaScript提供了一些预定义对象 和 几个方法。

            string对象:
                用于处理字符串。
                方法有 toUpperCase()、toLowerCase()、indexOf()、LastIndexOf() 和 slice().
                IndexOf( )返回字符串中第一个子字符串;LastIndexOf()返回组合一个子字符串;slice根据指定的开始和结束为止返回一个子字符串。
            Math对象:

                可以进行一些计算。

                方法有abs(),sin(),cos(),tan(),random()和round。

            Date对象:

                表示时间和日期。

                方法getYear(),getMonth(),getDay(),getHours(),getMinutes()

         *********************************************************************************************************

         JavaScript例:

           

            创建对象:

            «script type="text/javascript"»

            function Person(firstName, lastName)            //用this关键字创建属性

            {
                this.firstName = firstName;

                this.lastName = lastName;

            }

           

            function toString()

            {
                return this.firstName + " " + this.lastName;

            }

       

            Person.prototype.constructor = Person;        //指定构造函数

            Person.prototype.toString = toString;           //指定类的成员函数

            //以上代码创建了一个Person类

   

            //应用Person对象的方法

            function getPerson()

            {
                var p = new Person ( "Natalie","Portman" );

                var label = document.getElementById("div1");    //在页面查找标记div1
                label.innerHTML = p.toString();

            }

            «/script»


            打开窗口:

            «script type="text/javascript"»

                function openWindow()

                {    window.open("ObjectDemo.aspx"); }

            «/script»

            添加HTML的Button控件,调用 上面的函数:

            «input id="Button1" type="button" value="button" onclick="openWindow();"/»

            open方法的参数:

            window.open("ObjectDemo.aspx", "_blank", "menubar=no, resizable=no, status=no, titlebar=no, width=300, height=300");

            第一个参数:应打开的文档;

            第二个参数:定义窗口的名称;

            第三个参数:是一个逗号分隔的特性列表。可以指定窗口的大小,是否显示几个选项。如菜单、标题和状态栏。

________________
                ****************************************Web 服务*****************************************************
12. SOAP
        简单对象访问协议,Simple Object Access Protocol。

        最初SOAP定义使用HTTP协议,所以SOAP调用可以通过Internet实现。
        SOAP1.2中,Web服务独立于HTTP协议,可以使用任意传输协议。但醉成用的协议仍是HTTP。(www.w3.org/tr/soap/ 可以获得规范)
________________
13. XML数据工具
        .net framework XML类提供了一些方法用来得到需要的数据。
        可用来得到web服务以XML显示的信息。如果用C#,有工具直接生成执行任务的代码。
________________
14.   Web服务的体系结构
        WSDL文档:
        Web服务描述语言,Web Service Description Language.

        WSDL包含的信息:服务支持的方法,如何调用方法,给服务传送的参数类型,从服务返回的参数类型。

        WSDL文档用于:创建带有相同方法 和 参数的 客户代理程序。
        规范:www.w3.org/tr/wsdl

       

            获得WSDL的方法:

            在.asmx后面加上?wsdl, 比如:http://localhost:1234/service1.asmx?wsdl

            所有ASP.NET Web服务都用.asmx扩展名来标识(就像.aspx)。


            生成WSDL:

            WSDL文档是用[WebMethod]属性自动生成的;

            [WebMethod]属性标记:
                例:

                   下面的是一段.NET Web服务程序
                    using System.Web;
                    using System.Web.Services;
                    .....
                    pulbic class Service:System.Web.Services.WebService
                    {
                        [WebMethod]

                        pulic string HelloWord()

                        {
                            return "Hello World";

                        }

                    } 
                服务中可以使用的方法都必须用[WebMethod]来标记。没有这个标记的方法可以从WebMethod中调用,但不能在客户机上调用。

            

       服务的调用方法:    

            要调用web服务上的方法,该调用 要先转换为 SOAP信息,SOAP信息是在WSDL文档中定义的。

            SOAP是客户机 和 服务器之间通信的 基本单元。


            SOAP可以由代理程序创建

            P567有详细的“HTTP POST请求” SOAP  消息 的 范例。

     

       WS-I基本个性化配置:

        SOAP存在有段日子了,有时很难其他销售商的web服务交互。所以,建立了WS-I组织。

        WS-I定义了Web服务需求。

        Web服务交互操作组织(Web Service Interoperability Organization) http://ws-i.org
        WS-I规范:www.ws-i.org/profile/basicprofile-1.1.html

          
________________
15. Web服务 和 .NET FRAMEWORK
        .net framework中用于处理web服务的namespace:

            a)System.Web.Services 用于创建web服务

            b)System.Web.Services.Description 可以通过WSDL描述 Web服务

            c)System.Web.Services.Protocols 可以创建SOAP请求和响应

        
       web服务程序:

            创建一个ASP.NET Web Service Application的project。起个名,比如WebServiceSample。

            项目模板生成的文件:Service1.asmx & Service1.asmx.cs

            在文件中写入代码,服务方法要用[WebMethod]标识           

       

             要为服务生成的描述信息 加一个唯一的标识--加一个命名空间。在Service1.asmx.cs文件中:
            [WebService(Namespace="http://www.areslab.com/WebService")]    //可以用公司的网址做标示符(可以确保其他公司不会用),链接不是一定要存在。

            [WebServiceBinding.......

            ......

       客户代理程序:

            客户机必须创建一个与 web服务所在的服务器之间的连接。

            并发送一个HTTP请求,传送一个SOAP消息(方法调用必须转换为SOAP信息)。这些有客户代理程序实现。

            客户代理执行程序的代码在SoapHttpClientProtocol类中

           

            a) System.Web.Service.Protocols.SoapHttpClientProtocol是客户代理程序的基类。

                Invoke()方法:转换参数,建立一个SOAP消息,发送给Web服务。

                Url属性:确定调用哪个web服务。

                BeginInvoke() & EndInvoke():用于异步调用。

            b) 其他客户协议:

                HttpGetClientProtocol & HttpPostClientProtocol 类,仅执行简单的HTTP GET & HTTP POST请求,没有SOAP调用系统的开销。

                但只能用于.NET客户机和服务器上都是使用.Net的情况。

                如果使用的是不同技术,就只能使用SOAP协议。

           

        客户程序:

            在解决方案中创建一个新的应用程序。

            添加一个服务引用--Project|Add service Reference--»
                                       discover|Service in solution(先前创建的服务会显示出来)--»

                                       在namespace上输入名称::WebServicesSample.

        
           程序代码:

                WebServicesSample.Service1SoapClient client = new WebServicesSample.Service1SoapClient();   //WebServiceSample就是上面添加用时输入的namespace;
                                                                                                                                                              //Service1SoapClient是生成的代理类(Service1.asmx & ~.cs),client为代理类的一个实例。

                textBox2.Text = client.ReverseString(textBox1.Text);        //代理类的实例,调用web服务的方法ReverseString

                //Service1SoapClient派生于ClientBase«Service1Soap»基类,这个基类在Invoke()方法中创建了一个SOAP消息。

                //WebServiceBingdingAttribute属性设置为Web服务:
                ....

                [System.Web.Services.WebServiceBindingAttribute(Name="ServiceSoap", Namespace="http://www.areslab.com/webservices")]    //标示符与web服务的标示符相同,绑定服务。

                public partial class Service: System.Web.Services.Protocols.SoapHttpClientProtocol

                {
                    public Service()

                    {    this.Url = SimpleClient.Properties.Settings.Default.SimpleClient_WebServicesSample_Service;   }    //构造函数中,url设置为Web服务。这个属性用于SoapHttpClientProtocol类,以请求一个服务。

                }

  
________________
16.  Ajax编程
        Ajax基于以下技术:

            DHTML, JavaScript, XmlHttpRequest, JSON(JavaScript Object Notation)
        ASP.NET 2.0 需要下载AJAX 库和控件, ASP.NET 3.5包含了ASP.NET AJAX。

        Microsoft提供了其他的一些工具,用于AJAX应用程序开发。可从 http://ajax.asp.net 下载。


        ASP.NET AJAX服务器端控件:

        ScriptManager: 每个AJAX页面都需要一个该控件实例;

        UpdatePanel:部分更新功能;

        Timer:定时调用一个函数;

        UpdateProgress:发送请求时,显示进度。


       ASP.NET AJAX客户端脚本扩展:

        Array类扩展,Date类扩展,String类扩展,Sys名称空间,Sys.Net名称空间。 说明见P587页。

   

        ScriptMannager的属性:

            EnablePageMethods:指定 ASPX页面上的静态方法,是否可以从客户端 脚本中,作为web服务方法 进行调用

            EnablePartialRendering:ture为激活UpdatePanel部分更新功能;

            LoadScriptsBeforeUI:指定脚本放在 返回的HTML页面的位置,如果放在«head»上,就会在加载UI之前加载脚本;
            ScriptMode:指定使用调试版 还是发布版 脚本;

            ScriptPath:指定脚本坐在目录;

            Services:包含 Web服务引用集合。


        UpdatePanel控件:

            属性:

                ChildrenAsTriggers:为true时,将子控件设为触发器(子控件可以更新UpdatePanel的内容);

                RenderMode:指定显示方式,UpdatePanelRenderMode.Block 或是 *.Inline。Block显示«div»,Inline显示«span»;

                UpdateMode:设为 Always (会在每个Ajax回送时,全部更新)或 Conditional(更新依赖于触发器);

                Triggers:指定AsyncPostbackTrigger 和 PostbackTrigger元素集合,指定了更新内容的时间(?)。

           

            ***************************************************

            使用UpdatePanel控件:

            1)添加ScriptManager控件:

                 建立站点,并在.aspx页面中添加控件。
                  «asp:ScriptManager ID="ScriptManager1" runat="server"»   «/asp:ScriptManager»
            2)添加UpdatePanel控件:
                 «asp:UpdatePanel ID="UpdatePanel1" runat="server"»     «/asp:UpdatePanel»

            3)在UpdatePanel内部添加标 签 和 按钮 控件:

                 «asp:UpdatePanel ID="UpdatePanel1" runat="server"»

                        «ContentTemplate»

                                «asp:Label ID="Label1" runat="server" Text="Label" »  «/asp:Label»

                                «asp:Button ID="Button1" runat="server" Text="AJAX Postback" /»

                        «/ContentTemplate»

                 «/asp:UpdatePanel»

       

            启动程序后,点击button,发送一个Ajax POST请求,而不是HTTP POST请求,只有UpdatePanel内的控件进行了刷新。页面内UpdatePanel控件之外的内容没有刷新。

            (Ajax POST请求使用XmlHttpRequest对象给服务器发送一个请求。服务器只返回更新UI所需数据。然后,JavaScript代码就修改UpdatePanel内部的HTML控件。

            一个页面可以有多个UpdatePanel。

            ********************************************************************

            使用触发器更新:

                当页面中有两组UpdatePanel控件时,在UpdatePanel控件的UpdateMode属性为Always时,无论点击那组控件中的按钮,两个组都会刷新。

                
                当UpdateMode属性为Conditional时,只用Button所在的UpdatePanel中的控件才会刷新;或者,用触发器可以更新其他UpdatePanel中的控件。
                    选择其中一个UpdataPanel,点击 Triggers属性旁边的"..." , 添加一个AsyncPostBack触发器,把ControlID设置为其他的按钮的ID,比如:Button2,把EventName设置为Click。  

                        通过上面的设置,当点击所指定的按钮时,就会更新这个UpdatePanel中的内容。

                            ......

                        «asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"»

                            «ContentTemplate»

                                «asp:Label ID="Label1" runat="server" Text="Label"» «/asp:Label»

                                «asp:Button ID="Button1" runat="server" Text="Button" OnClick="OnButtonClick"/»

                           «/ContentTemplate»   

                           «Triggers»

                                «asp:AsyncPostBackTrigger ControlID="Button2" EventName="Click"/»

                           «/Triggers»

                        «/asp:UpdatePanel»


        Timer控件:

            例:

                在UpdatePanel控件中添加 Label 和 Timer控件,并将Timer的Interal属性设为5000,给Tick事件添加OnTick方法。
                    protected void OnTick(object sender,EventArgs e)

                    {
                        Label1.Text = DateTime.Now.ToLongTimeString();

                    }

                    启动程序后,每5秒更新一次Label里的内容。


        UpdateProgress控件:

            当后台操作超时,超过DisplayAfter属性指定的世,就显示«ProgressTemplate»模板的内容。

            DisplayAfter默认500ms。

            例:
                «asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"» «/asp:ScriptManager»

                «asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1"»

                    «ProcessTemple»

                        Waiting......

                    «/ProcessTemplae»

                «/asp:UpdateProgress»

                   

                «asp:UpdatePanel ID="UpdatePanel1" runat="server"»

                    ........

                «/asp:UpdatePanel»

        *********************************************************************

        应用Ajax的web服务:

            1)建立站点后,添加一个Ajax的WCF服务(AJAX-enable WCF Service),命名为HelloService.svc,建立Web服务。

                    创建Ajax WCF服务,会在web.config中添加enableWebScript字段,给web服务添加JSON支持(这样web服务就能接受和返回 JavaScript客户端能使用的JSON对象了)。

                    «system.serviceModel»

                        «behaviors»

                            «endpointBefaviors»

                                «enableWebScript /»

                            «/endpointBehaviors»

                        «/behavior»

                        «serviceHostingEnvironment aspNetCompatibilityEnabled="true"»

                    ...............

                   

            2)在HelloService.svc中添加Greeting()方法:

                 using System.ServiceModel;

                 .....
                 [ServiceContract(Namespace=" ")]

                 [AspNetComatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

                 public class HelloService

                 {
                    [WebGet]

                    [OperationContract]

                    public string Greeting(string name)

                    {
                        return "Hello, "+ name;

                    }

                 }

            *************************************************************************************

           3)建客户端,建一个AJAX Web窗体CallService.aspx

                编辑aspx页面中的ScriptManager控件的属性,在属性编辑器中,点击Service属性的省略号按钮,add一个服务应用,把path属性改为HelloService.svc;

                    «asp:ScriptManager ID="ScriptManager1" runat="server"»

                        «service»

                            «asp:ServiceReference Path="HelloService.svc"»

                        «/service»

                    «/asp:ScriptManager»

               

                在页面上添加HTML控件;

       

                修改页面脚本块:

                «script type="text/javascript"»

                    var helloService;                
                    function pageload()
                    {
                        helloService = new HelloService();    //创建Web服务代理的实例。HelloService与ScriptManager的Service属性定义类型相同。

                        helloService.set_defaultSucceededCallback(helloSucceed);    //用代理对象的set_defaultSucceededCallback方法,指定异步调用web服务成功时调用函数 helloSucceed(在下面)。
                        helloService.set_defaultFailedCallback(heelFailed);    //用代理对象的set_defaultFailedCallback方法,指定异步调用web服务失败时调用函数 helloFailed(在下面)。

                    }


                    function helloSucceed(result)

                    {
                        var d = document.getElementById("result");

                        d.innerHTML = result;

                    }


                    function helloFailed(result)     {     .........     }

                    function callService()

                    {
                        var l = document.getElementById("input");

                        helloService.Greeting(l.value);    //用代理对象实例(helloService)调用web服务。可以添加一个HTML Button调用callService,来调用Web服务。

                    }


                «/script»

                除了使用set_defaultSucceededCallback和set_defaultFailedCallback方法 设置默认方法外,还可以:

                    helloService.Greeting(l.value, helloSucceed, helloFailed,null); //单独指定 传送的 成功 和 失败函数。

             *******************************************************************************************************************************
        用AJAX扩展控件:

              1)在www.asp.net/ajax/downloads下载ASP.NET AJAX控件工具集(AjaxControlToolkitFramework3.5-NoSource.zip),并解压缩。

              2)添加扩展控件:

                        在工具箱中,右击--选Add Tab;创建一个新类别,并命名;

                        右击新类别的内容,选Choose Item, 找到刚解压缩的程序集(AjaxControlToolkit.dll)
                        把ajaxToolkit tagPrefix添加到web.config中,引用程序集AjaxControlToolkit.

                             «pages»

                                «controls»

                                    «add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken="31BF3856AD364E35"" /»

                                    ........ 
                                    «add tagPrefix="ajaxToolkit" namespace="AjaxControlToolkit" assembly=“AjaxControlToolkit” /»

                                «/controls»

                            «/pages»

            3)在aspx页面中使用:

                    添加一个文本框,TextBox1,点击该控件的“智能标记”(把鼠标停在控件上,就会显示只能标记),从菜单中选Add Extender;
                    就会打开Extender Wizard,选择TextBoxWatermarkExtender(用来扩展)。

                    在文本框的属性编辑器中展开组 TextBox1WatermarkExtender,把WatermarkText属性设置成想显示的文本,比如:Enter your name之类的。

                        产生的代码如下:

                        «asp:TextBox ID="TextBox1" runat="server" »  «/asp:TextBox»

                        «ajaxToolkit:TextBoxWatermarkExtender ID="TextBox1_TextBoxWatermarkExtender" runat="server" Enabled="True" TargetControlID="TextBox1" WatermarkText="Enter your name"»

                        «/ajaxToolkit:TextBoxWatermarkExtender»
   

                        TargetControlID用来关联到指定的文本框--TextBox1上。

________________
                ***************************************部署Web 应用程序******************************************
17.ASP.NET运行库必须用IIS配置,才能运行ASP.NET Web应用程序。    
     用IIS管理工具检查处理程序映射,就可以验证ASP.NET运行库是否配置。

    其他信息见P601 & P602。

________________
18.IIS配置
        创建应用程序池(Application Pools):

        启动 IIS管理工具;
        选择Application pools右击,选择Add Application Pool;

        输入Name,选择程序.NET Framework version v2.0.50727,然后OK。

            ASP.NET 3.5 和 ASP.NET 2.0使用的运行库都是.NET Framework version v2.0.50727。

        创建Application poosl后,从IIS管理工具右边的Action类别中选择Application Pools(在vista界面中,其他不知道在哪儿选),就可以配置高级设置了。

        ************************

       创建Web应用程序:

       在IIS Manager中,选择Default Web Site;

       右击,选择Add Application;

       输入Web站点的物理路径 和 别名。选择创建好的Application Pool,然后,点OK;
       完成。

       配置好虚拟目录后,就可以发布Web站点了。

________________
19. 复制Web站点
        在VS中打开Web应用程序;

        在菜单中,点击 网站|复制网站(Website|Copy Web Site);

        点击窗口顶部的 连接(Connect)按钮,选择要复制的目的地。可以双向复制,进行同步。

              

       编译时在浏览器访问为文件时进行的。也可也使用.net运行库目录下的命令行工具aspnetc_compiler -v /BegVCSharpWebsite预编译站点BegVCSharpWebsite。

________________
20. 发布Web站点
        打开Web应用程序;

        在菜单选择 生成|发布网站(Build|Publish Web Site);

            配置选项:

            允许更新此编译站点:后台文件编译为程序集,前台用源码发布;

            使用固定命名和单页程序集:为每个页面创建一个程序集,程序集有固定名称,下次发布时不变。这个选项允许部分更新Web站点,更新或增加程序集。

            对编译程序集启用强命名:允许指定键文件,给程序集签名。

________________
21. 创建Window安装程序  
        如果,Web应用程序,需要共享程序集,就需要创建安装程序。

        使用安装程序的优点是,虚拟目录由IIS配置,不需要手动创建虚拟目录。

目录
相关文章
|
6天前
|
监控 Cloud Native 测试技术
PTS 3.0:开启智能化的压测瓶颈分析
PTS 3.0:开启智能化的压测瓶颈分析
204610 3
|
6天前
|
弹性计算 API Python
如何利用通义千问查询阿里云资源
本篇文章详细阐述了如何利用LangChain框架构建一款Python工具,该工具能够调用通义千问大模型来查询和获取阿里云资源信息。
|
6天前
|
存储 JSON BI
友盟+Hologres:千亿级多维分析平台建设实践
Hologres 在友盟+统计分析、营销等多个产品线使用,很好地满足了用户行为分析、人群圈选与洞察场景的多维度分析、灵活下钻、快速人群预估和圈选等分析需求,提供客户更流畅的数据查询和分析体验。
|
6天前
|
SQL 数据采集 JSON
弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙
123407 5
|
8天前
|
存储 运维 监控
飞书深诺基于Flink+Hudi+Hologres的实时数据湖建设实践
通过对各个业务线实时需求的调研了解到,当前实时数据处理场景是各个业务线基于Java服务独自处理的。各个业务线实时能力不能复用且存在计算资源的扩展性问题,而且实时处理的时效已不能满足业务需求。鉴于当前大数据团队数据架构主要解决离线场景,无法承接更多实时业务,因此我们需要重新设计整合,从架构合理性,复用性以及开发运维成本出发,建设一套通用的大数据实时数仓链路。本次实时数仓建设将以游戏运营业务为典型场景进行方案设计,综合业务时效性、资源成本和数仓开发运维成本等考虑,我们最终决定基于Flink + Hudi + Hologres来构建阿里云云原生实时湖仓,并在此文中探讨实时数据架构的具体落地实践。
飞书深诺基于Flink+Hudi+Hologres的实时数据湖建设实践
|
6天前
|
存储 缓存 Java
蚂蚁流场景状态演进和优化
本文整理自蚂蚁集团实时计算组技术专家闵文俊在 FFA 2023 核心技术(一)中 的分享,内容关于蚂蚁流场景状态演进和优化的研究。
83196 0
蚂蚁流场景状态演进和优化
|
11天前
|
SQL 关系型数据库 分布式数据库
|
12天前
|
弹性计算 网络安全 数据安全/隐私保护
ECS热门应用 | 解决Guestosssh异常
通过ECS实例快速发现操作系统内部的问题,并给出对应的修复方案。
129126 5
|
12天前
|
存储 固态存储 Java
软硬协同设计下的飞天盘古,是如何降低存储系统开销的?
历经 15 载,如今的飞天盘古系统已迭代至第三代,数千万行代码和 1,000 余项专利,从大规模、到高性能、到高效能的分布式存储系统的演进,更高效地让数据中心成为一台计算机。
136067 29
软硬协同设计下的飞天盘古,是如何降低存储系统开销的?
|
12天前
|
机器学习/深度学习 消息中间件 算法
Flink ML的新特性解析与应用
本文整理自阿里巴巴算法专家赵伟波,在 Flink Forward Asia 2023 AI特征工程专场的分享。
129072 4
Flink ML的新特性解析与应用

相关产品

  • 云迁移中心