关键字:Asp.net, 用户控件, 自定义控件
本文适用读者:
- 熟悉aspnet,能创建ascx用户控件
- 想创建自定义控件,而又为其庞杂的实现方法而惧的读者
相关下载:
- 本文使用的ascx控件例程:WebFtp060308(pm06).rar
- 本文使用的自定义控件例程:WebFtpControl 1.0.2259_source.rar
术语声明:
Field 类成员变量
Property 类属性
Attribute 类特性
NameSpace 命名空间
Assembly程序集
引言:
asp.net自定义控件使用起来相当方便,但相对ascx用户控件而言,由于其没有可视化编程支持,编写时相当困难。
有没有简单的办法呢?既可以使用ascx可视化编程的优点,又可以发挥自定义控件使用方便的特点。
本文介绍一种解决方案:先设计好ascx控件,再转化为用户控件。以下为具体步骤。
一、创建ascx控件,并调试通过
具体怎么创建ascx用户控件不是本文的重点,跳过啦~
本文使用到的ascx例程可点击此处下载。该例程创建了一个web文件管理的ascx控件。效果如:
二、将ascx移植为自定义控件
(一)新建工程aspnet自定义控件工程,将原ascx类中的所有cs代码都拷贝到自定义控件类中去
(二)修改InitializeComponent()函数以初始化控件。可将其扩充为三个小函数,如:
{
CreateComponent();
SetComponentProperty();
SetComponentEvent();
}
其中
(1)CreateComponent()函数用于新建出所有使用到的控件,并组织好其层次关系
privatevoidCreateComponent()
{
//create
lblCurrPath=newLabel();
lblUpload=newLabel();
lblNewFolder=newLabel();
//nest
Controls.Add(this.lblCurrPath);
Controls.Add(newHtmlGenericControl("br"));
this.panAdmin.Controls.Add(this.file);
}
(2)SetComponentProperty()函数用于设置这些控件的属性,如
privatevoidSetComponentProperty()
{
lblCurrPath.Font.Size=FontUnit.XLarge;
lblCurrPath.CssClass="webftp_title";
panInfo.BackColor=Color.Yellow;
panInfo.Visible=false;
}
值得注意的是,aspnet提供的组合绑定控件(如DataGrid,DataList..)的属性设置较为复杂,参见附录二
(3)SetComponentEvent()函数中设置控件的事件句柄,这个从原有的InitializeComponent函数中拷贝过来就可,如
privatevoidSetComponentEvent()
{
this.btnUpload.Click+=newSystem.EventHandler(this.btnUpload_Click);
this.btnNewFolder.Click+=newSystem.EventHandler(this.btnNewFolder_Click);
this.dg.ItemCommand+=newSystem.Web.UI.WebControls.DataGridCommandEventHandler(this.dg_ItemCommand);
this.Load+=newSystem.EventHandler(this.Page_Load);
}
(三)填充Render()函数用以渲染输出效果。可将其扩展为两个小函数,如
{
RenderClientScript(output);
RenderServerComponent(output);
}
其中
(1)RenderClientScript函数可用于输出客户端脚本,以及样式style代码,如:
privatevoidRenderClientScript(HtmlTextWriteroutput)
{
output.Write(" ","A{TEXT-DECORATION:none}","A:hover{TEXT-DECORATION:underline}");
}
(2)RenderServerComponent函数用于输出各控件,也可在此添加一些普通html代码的输出,如
privatevoidRenderServerComponent(HtmlTextWriteroutput)
{
this.lblCurrPath.RenderControl(output);
output.Write("
this.panAdmin.RenderControl(output);
this.dg.RenderControl(output);
}
(四)让类实现INamingContainer接口,以避免页面上放置多个该控件而导致子控件id冲突的情况
该接口无任何函数,只需声明实现就可,如
只要让类实现该接口,系统将自动实现避免id冲突的方法
具体步骤是将内部控件id名前都附上父控件的id。如在panel(id=pan)中有一个lable(id=lblName),那么label的id会给自动改为pan_lblName;
至此,编译调试成功后,该控件就可以使用了。再加上图片,效果可以是这样:
三、商业标准化自定义控件
第二步完成后,该控件已经可以使用了(如何使用?晕,请看附录五),但其还是一个粗胚,例如没有控件图标,没有设计时外观等。
以下将介绍如何修饰该控件,令其像个标准化的商业控件。
(1)为控件的属性添加例如类别、描述、默认值等Attribute特性
这些特性将影响到控件在属性工具栏中的内容
格式如:[Bindable(true), Category("类别"), Description("描述信息"), DefaultValue("缺省字符串类型值")]
常用的Attribute有:
BrowsableAttribute属性可否显示
DefaultPropertyAttribute控件的缺省属性
DefaultValueAttribute属性的缺省值
DescriptionAttribute属性的描述信息
ReadOnlyAttribute属性是否只读
BindableAttribute属性是否可绑定
NotifyParentPropertyAttribute修改该属性后是否通知控件
更多的Attribute 请查阅附录三、附录四、以及 System.ComponentModel 命名空间
(2)添加工具栏图标
为类添加特性:[ToolboxBitmap(typeof(WebFtp), "Kingsoc.Web.Controls.WebFtp.bmp")]
其中要注意的是:
- 项目的默认命名空间为Kingsoc.Web.Controls
- 图片名称为webftp.bmp,并需要设置其编译选项为“嵌入的资源”
这样工具栏上图标就变成这样咯~:
(3)添加设计时外观支持
为类添加特性:[Designer(typeof(Kingsoc.Web.Controls.WebFtpDesigner))]
其中,类 Kingsoc.Web.Controls.WebFtpDesigner 继承至ControlDesigner,用于绘制设计时的控件外观,如:
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.ComponentModel;
usingSystem.ComponentModel.Design;
usingSystem.Web.UI.Design;
usingSystem.Text;
namespaceKingsoc.Web.Controls
{
publicclassWebFtpDesigner:ControlDesigner
{
publicoverridestringGetDesignTimeHtml()
{
//returnbase.GetDesignTimeHtml();
WebControlctrl=(WebControl)this.Component;
StringBuildersb=newStringBuilder();
sb.AppendFormat(
"
ctrl.Width,
ctrl.Height,
ctrl.ID);
returnsb.ToString();
}
publicoverrideboolAllowResize
{
get{returntrue;}
}
}
}
这样,设计时控件就有了外观支持:。
(嫌太简陋?自己用dreamweaver等设计工具设计,想多好看就多好看!再拷贝html代码到GetDesignTimeHtml()函数内部去)
(4)添加TagPrefix
用于指定将控件从工具栏中拖放到窗体中,自动生成的控件名称前缀(实际上是控件所属的命名空间的别名)
在AssemblyInfo.cs文件中添加:[assembly: TagPrefix("Kingsoc.Web.Controls", "ks")]
这样,添加了该控件的web窗体就会自动生成类似代码
<ks:WebFtpid="webFtp"runat="server">ks:WebFtp>
(5)设置版权信息
修改AssemblyInfo.cs文件中的以下特性
[assembly:AssemblyDescription("")]
[assembly:AssemblyConfiguration("")]
[assembly:AssemblyCompany("Kingsocsoftware")]
[assembly:AssemblyProduct("")]
[assembly:AssemblyCopyright("")]
[assembly:AssemblyTrademark("Kingsoc")]
[assembly:AssemblyCulture("")]
(6)将控件添加到GAC中。见附件五
(7)添加控件注册保护。见附件六
--------------------------------------------------------------------
附录
--------------------------------------------------------------------
附录一:自定义控件基类的选择
Control 所有web控件的基类
WebControl 继承至Control类,并添加了例如Width,Height等属性,这是常用且默认的基类,常用于有外观的控件
Component 常用于无外观的控件,例如:数据访问控件
故,对于组合控件,一般使用WebControl作为基类。而对于无界面的控件,一般使用Component就可以了
附录二:用代码创建DataGrid绑定列
(1)普通绑定列
col.DataField="name";
col.ReadOnly=true;
dg.Columns.Add(col);
(2)模板绑定列
col.ItemTemplate=newLinkButtonTemplate("btnName","name","Select");
col.EditItemTemplate=newTextBoxTemplate("txtName","name");
dg.Columns.Add(col);
其中LinkButtonTemplate和TextBoxTemplate模板代码如下:
//LinkButton模板
publicclassLinkButtonTemplate:ITemplate
{
string_id;
string_bindField;
string_commandName;
publicLinkButtonTemplate(stringid,stringbindField,stringcommandName)
{
_id=id;
_commandName=commandName;
_bindField=bindField;
}
publicvoidInstantiateIn(Controlcontainer)
{
LinkButtonctrl=newLinkButton();
ctrl.ID=_id;
ctrl.CommandName=_commandName;
ctrl.DataBinding+=newEventHandler(this.BindData);
container.Controls.Add(ctrl);
}
voidBindData(objectsender,System.EventArgse)
{
LinkButtonctrl=senderasLinkButton;
ctrl.Text=DataBinder.Eval(ctrl.NamingContainer,"DataItem."+_bindField).ToString();
//或ctrl.Text=((ctrl.NamingContainerasDataGridItem).DataItemasDataRowView)[_bindField].ToString();
}
}
//TextBox模板
publicclassTextBoxTemplate:ITemplate
{
string_id;
string_bindField;
publicTextBoxTemplate(stringid,stringbindField)
{
_id=id;
_bindField=bindField;
}
publicvoidInstantiateIn(Controlcontainer)
{
TextBoxctrl=newTextBox();
ctrl.ID=_id;
ctrl.DataBinding+=newEventHandler(this.BindData);
container.Controls.Add(ctrl);
}
voidBindData(objectsender,System.EventArgse)
{
TextBoxctrl=senderasTextBox;
ctrl.Text=DataBinder.Eval(ctrl.NamingContainer,"DataItem."+_bindField).ToString();
}
}
附录三:自定义控件可用的特性(Attribute)
System.ComponentModel 命名空间提供用于实现组件和控件运行时和设计时行为的类。
此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。
CategoryAttribute
BrowsableAttribute
DefaultPropertyAttribute
DefaultValueAttribute
DescriptionAttribute
ReadOnlyAttribute
NotifyParentPropertyAttribute
AmbientValueAttribute
BindableAttribute
DefaultEventAttribute
DesignerAttribute
DesignerCategoryAttribute
DesignerSerializationVisibilityAttribute
DesignOnlyAttribute
DesignTimeVisibleAttribute
EditorBrowsableAttribute
ImmutableObjectAttribute
InheritanceAttribute
InstallerTypeAttribute
LicenseProviderAttribute
ListBindableAttribute
MergablePropertyAttribute
ParenthesizePropertyNameAttribute
ProvidePropertyAttribute
RecommendedAsConfigurableAttribute
RefreshPropertiesAttribute
RunInstallerAttribute
ToolboxItemAttribute
ToolboxItemFilterAttribute
TypeConverterAttribute
附录四:关于DefaultValue特性
只用于检测用户输入值是否与该值相同,若相同,则不会在asp页面代码中显示出该属性值;反之则显示。实际并没有修改该属性的值!
例如,对于以下语句,AttachTimeStampToUploadedFile 应该等于构造函数中指定的true,而非DefaultValue中提供的false
publicboolAttachTimeStampToUploadedFile
{
get{return_AttachTimeStampToUploadedFile;}
set{_AttachTimeStampToUploadedFile=value;}
}
publicWebFtp()
{
AttachTimeStampToUploadedFile=true;
}
所以,设置默认值时应该确保与初始化值相同,否则会带来令人困惑的结果。要么干脆就不写。
附录五:如何将自定义控件添加到工具栏
(1)在工具栏面板中点击右键,点击”添加/移除项..."
(2)在弹出的“自定义工具箱”对话框中点击“浏览”按钮,选择自定义控件dll文件
(3)点击确定,关闭对话框。控件图标将显示在工具栏面板上
附录六:将控件添加到GAC中
.Net framework 要求组件必须是 Strong-Name Assembly类型才能部署到GAC(全局程序集缓存Global Assembly Cache)。将组件部署到GAC中的好处就像是以往把Win32 DLL放置到System32目录中的效果,所有程序都可以共享这个组件,而无需再每个程序的目录中都放置一个assembly,这样可以减少部署的文件数和大小。
(1) 首先先生成keyfile,可以用sn.EXE工具(在VS安装目录\SDK\v1.1\Bin下可找到)生成:
sn -k MyCompany.snk
(2) 把keyfile放置到项目根目录下,并在AssemblyInfo.cs中指定这个keyfile,并重新编译
[assembly: AssemblyKeyFile(@"..\..\MyCompany.keys")]
(3) 部署到GAC中:管理工具->Microsoft.Net Framework 1.1 配置->任务"向程序集缓存中添加程序集",指定编译好的dll。也可以直接使用GACUtil:
- 把程序集添加到GAC中: GACUtil /i sample.dll
- 把程序集移出GAC:GACUtil /u sample.dll
附录七:添加控件注册保护
未完成
--------------------------------------------------------------------
参考文章
--------------------------------------------------------------------
《ASP.NET组件设计指南》
2006年3月9日
Kingsoc.Web.Controls.WebFtp
[最后修改日期 2006-03-12, Kevin Cheng]
- /Files/surfsky/WebFtp2/webftp2.3.rar(版本2.3.2263.36853)2006-03-13 20:41
- /Files/surfsky/WebFtp2/webftp2.2.rar(版本2.2.2262.27391)2006-03-12 15:17
- /Files/surfsky/WebFtp/Kingsoc.Web.Controls.WebFtp 1.0.2259.39656.rar(版本1.0.2259.39656,无需图片)2006-03-09
注:2.3为稳定版本,现停止更新。下一版本将为3.0,将提供大图标视图
一、功能
- ASP.NET 1.1 控件,可用以web方式进行文件的上传和下载操作
- 仿windows资源管理器,提供详细信息形式视图
- 支持60多种常用的文件格式图标,并提供xml文件,可任意扩充
- 所有的文件操作都被限定在指定的根目录下,杜绝安全隐患
- 提供文件过滤器,禁止指定扩展名的文件被下载或上传
- 控件所有的操作消息都Post给自身进行处理,非url方式,无泄漏链接地址的危险
- 上传文件可选自动打上时间标签,以避免文件冲突
- 提供只读(可下载)和可编辑两种视图
二、使用该控件可以做什么
- 只需拖拉配置,无需任何代码就可以实现文件下载和管理功能
- 只要附上用户管理模块,很容易就能实现类似多用户网络硬盘的功能
- 本控件是免费的!可任意下载使用,但分发拷贝时请保留本文档信息
三、使用步骤
- 新建ASP.NET工程
- 将webftp目录拷贝到工程目录下(一般放置到images目录内即可)
- 在工具栏中添加项目,选定WebFtp.dll
- 将该控件拖动到窗体上,并设置属性:
Root:根目录路径
ReadOnly:是否只读
DenyFileFilter:文件过滤器
AttachTimeStampToUploadedFile:是否修改上传文件名并自动打上时间标签
ClientFilesFolder:客户端文件目录
ShowRootPath: 是否显示根目录路径
ShowMouseOverEffect: 是否显示鼠标移动背景改变效果
MouseOverColor: 鼠标悬停背景色
- 运行查看效果
四、功能展示
2005年12月30日
语法高亮控件ICSharpCode.TextEditor来自开源项目SharpDevelop,今天才知道,汗!害我白白花费时间自己编了一个SyntaxTextBox(http://surfsky.cnblogs.com/archive/2005/12/12/295814.html)。不妨发挥拿来主义风格,解剖了它再说!科学研究发现,咳咳,这个控件比较牛了啦~。VisualStudio代码编辑器的功能基本都能实现(包括CodeComplete和tip功能),速度也很快,而且是--开源免费软件!(大家鼓掌:),我想我爱上它了^_^,在此严重推荐一下!
1。以下是该控件的源代码和自己草编的简单使用例程:
ICSharpCode.TextEditor1.1的源代码:【下载】
ICSharpCode.TextEditor2.2的源代码:【下载】
自己编的使用例程:【下载】
2。使用效果:
3。使用该控件的关键句子:
usingICSharpCode.TextEditor.Gui.CompletionWindow;
usingICSharpCode.TextEditor.Document;
usingICSharpCode.TextEditor.Actions;
protectedICSharpCode.TextEditor.TextEditorControltxtContent;
txtContent.Document.HighlightingStrategy=HighlightingStrategyFactory.CreateHighlightingStrategy("C#");
txtContent.Encoding=System.Text.Encoding.Default;
这几句代码若是不写的话,会无法高亮显示代码且汉字会变乱码的。切记切记,阿弥陀佛~
欢迎大家讨论该控件的使用方法~~
2005年12月29日
-支持Oracle, SqlServer, Access, Excel, Text, FoxPro等,并支持数据库插件扩展
-可生成8位DES加密后的数据库连接字符串文件
2005年12月21日
O'Reilly总裁提姆-奥莱理谈Web2.0原则
Web2.0的观念已经被传播得如此广泛,以至于很多公司正将这个词加入到他们的行销炒作中,事实上,却没有真正理解其含义。到底是什么使得我们认定一个应用程序或一种方式,就是所谓的“Web 2.0”呢?我们来探讨一些原则。
Google是Web2.0的旗手
正如许多重要的理念一样,Web 2.0没有一个明确的界限,而是一个重力核心。如果Netscape可以被称为Web 1.0的旗手,那么Google几乎可以肯定是Web 2.0的旗手。所以我们就从这两个公司和其定位的差别入手来讨论。
Netscape以传统的软件摹本来勾勒其所谓的“互联网作为平台”:其旗舰产品是互联网浏览器,一个桌面应用程序。同时,他们的战略是利用其在浏览器市场的统治地位,来为昂贵的服务器产品建立起市场。最终,浏览器和网络服务器都变成了“日用品”,同时价值链条也向上移动到了在互联网平台上传递的服务。
作为对比,Google则以天生的网络应用程序的角色问世,它从不出售或者打包程序,而是以服务的方式来传递。客户们直接或间接地为所使用的服务向Google付费。原有软件工业的缺陷荡然无存。没有了定期的软件发布,只需要持续的改善。没有了许可证或销售,只需要使用。没有了为了让用户在其设备上运行软件而不得不进行的平台迁移,只需要搭建宏大的、由众多个人计算机组成的、可伸缩的网络,其上运行开源操作系统,及其自行研制的应用程序和工具,而公司之外的任何人则永远无法接触到这些东西。
Google所提供的服务不是一个简单的服务器,虽然其服务是通过大规模的互联网服务器集合来传递的;它的服务也不是一个浏览器,虽然这种服务是被用户在浏览器中体验到的。Google的旗舰产品—搜索服务,甚至不托管供用户搜寻的内容。很像一个电话通话过程,不仅发生在通话的两端,而且发生在中间的网络上。作为用户和其在线体验的一个中介,Google作用于浏览器、搜索引擎和最终的内容服务器之间的空间中。
20世纪90年代的互联网观念围绕着出版,而不是参与,围绕着广告客户,而不是消费者来进行操纵。当持有这种观念的公司(如DoubleClick)为获得“超过2000种成功应用”而沾沾自喜时,雅虎公司的搜索市场(从前的Overture)和Google的AdSense产品,已经在为几十万的广告客户服务了。
Overture和Google的成功源自于对“长尾”的领悟,即众多小网站的集体力量提供了互联网的大多数内容。
Web 2.0的经验是:有效利用消费者的自助服务和算法上的数据管理,以便能够将触角延伸至整个互联网,延伸至各个边缘而不仅仅是中心,延伸至长尾而不仅仅是头部。
BitTorrent采用了一种激进的方式来达到互联网去中心化的目的,由此显示出Web 2.0的一个关键原则:用户越多,服务越好。可以说,有一种隐性的“参与体系”内置在合作准则中。在这种参与体系中,服务主要扮演着一个智能代理的作用,将网络上的各个边缘连接起来,同时充分利用了用户自身的力量。
利用集体智慧
在诞生于Web 1.0时代并且存活了下来,而且要继续领导Web 2.0时代的那些巨人的背后,有一个核心原则,就是他们借助了网络的力量来利用集体智慧。
超级链接是互联网的基础。当用户添加新的内容和新的网站时,将被限定在一种特定的网络结构中。这种网络结构是由其他用户发现内容并建立链接的。如同大脑中的神经突触,随着彼此的联系通过复制和强化变得越来越强,而作为所有网络用户的所有活动的直接结果,互联的网络将有机地成长。
雅虎是首例伟大的成功故事,诞生于一个分类目录,或者说是链接目录,一个对数万甚至数百万网络用户的最精彩作品的汇总。虽然后来雅虎创建了五花八门的内容业务,但其作为一个门户来收集网络用户们集体作品的角色,依然是其价值核心。
亚马逊在线也缔造出了一门关于激发用户参与的科学。亚马逊拥有比其竞争者高出一个数量级以上的用户评价,以及更多的邀请,来让用户以五花八门的方式,在几乎所有的页面上进行参与。而更为重要的是,他们利用用户的活动来产生更好的搜索结果。因此,亚马逊销售额超出竞争对手也就不足为奇了。
经验是:源于用户贡献的网络效应,是在Web 2.0时代中统治市场的关键。
终结软件发布周期
上文在对Google和Netscape的比较中谈到的,互联网时代软件的代表性特征就是,它应该被作为服务来交付。这种事实导致这类公司在商业模式上发生了很多根本性的变化。
运营必须成为一种核心竞争力。Google或者雅虎在产品开发方面的专门技术,必须同日常运营方面的专门技术相匹配。从软件作为制造品到作为服务的变化是如此地根本,以至于软件将不再能完成任务,除非每日加以维护。对Google而言,它必须持续抓取互联网并更新其索引,持续滤掉链接垃圾和其它影响其结果的东西,持续并且动态地响应数千万异步的用户查询,并同步地将这些查询同上下文相关的广告相匹配。
所以,Google的系统管理、网络和负载均衡技术,可能比其搜索算法更被严加看管,也就不足为奇了。Google在自动化这些步骤上的成功,是其同竞争者相比更有成本优势的一个关键方面。
用户必须被作为共同开发者来对待。这是从对开放源码开发实践的一种反思中得出的(即便所涉及的软件不太可能以开放源码授权方式来发行)。开放源码的格言“早发布并常发布”,事实上已经演变成一种更为极端的定位“永远的测试版”。其中产品在开放状态下开发,新的功能以每月、每周、甚至每天的速度被加入进来。Gmail、Google地图、Flickr、del.icio.us和其他类似的服务,可能会在某个阶段打着测试版的标识多年。
故实时地监测用户行为来考察哪些新特性被使用了,以及如何被使用的,将成为另外一种必须的核心竞争力。一位工作于一个主流在线服务网络商的开发者评论道:“我们每天在网站的某些部分提供两到三个新的特性,而且如果用户不采用它们,我们就将其撤掉。如果用户喜欢它们,我们就将其推广到整个网站。”
虽然微软已经体现了从竞争中学习并最终做到最好的强大能力,但是毫无疑问这一次的竞争要求微软(可以扩展到任何现存的软件公司)成为一种在深入层面上显著有别的公司。天生的Web 2.0公司在享受自然而然的优势,因为它们不需要去摆脱陈旧的模式(及其相应的商业模式和营收来源)。
轻量型商业模型是对轻量型编程和轻量型结合的一种自然产物。Web 2.0的理念善于重用。一种像HousingMaps.com这样的新服务,是通过将两个现存服务抓取到一起来简单地创建起来的。这些案例为Web 2.0的另外一个关键原则提供了启发,我们将之称为“装配中的创新”。当商品组件充裕时,你可以通过以新颖的或者有效的方式来装配这些组件,进而创建价值。很像PC革命为硬件商品装配提供的许多创新的机会,其中像戴尔这样的公司创造了这种装配的科学,从而打败了那些商业模式上要求产品开发创新的公司。我们相信,Web 2.0为各个公司提供了通过在利用和整合由其他人提供的服务方面逐渐完善来赢得竞争的机会。
软件超越单一设备
另外一个值得一提的Web 2.0特性是,它已经不再局限于PC平台这样一个事实。
当然,任何的网络程序都可被视为超越单一设备的软件。毕竟,即便是最简单的互联网程序也涉及至少两台计算机:一个负责网络服务器,而另一个负责浏览器。而且就如我们已经探讨过的,在将网络作为平台的开发中,把这个概念拓展到由多台计算机提供的服务而组成的合成应用程序中。
但是如同Web 2.0的许多领域一样,在那些领域中“2.0版的事物”并不是全新的,而是对互联网平台真正潜能的一种更完美的实现。软件超越单一设备这一说法,赋予我们为新平台设计程序和服务的洞察力。
迄今为止,iTunes是这一原则的最佳范例。该程序无缝地从掌上设备延伸到巨大的互联网后台。其中,PC扮演着一个本地缓存和控制站点的角色。之前已经有许多将互联网的内容带到便携设备的尝试,但是iPod与iTunes的组合,却是这类应用中第一个从开始就被设计用于跨越多种设备。TiVo(可编程的数字记录装置,可定制电视节目)则是另外一个不错的例子。
iTunes和TiVo也体现了Web 2.0的其他一些核心原则。它们本身都不是网络程序,但都利用了互联网平台的力量,使网络成为其体系中无缝连接的、几乎不可察觉的一部分。数据管理显然是它们所提供的价值的核心。它们也是服务,而非打包的程序(虽然对于iTunes来说,它可以被用作一个打包的程序来仅仅管理用户本地的数据)。不仅如此,TiVo和iTunes都展示了一些集体智慧的方兴未艾的应用。
经过10年发展后,人们通过互联网已经可以完成比之前多得多的工作,得到更丰富、更精确、更迅捷的反馈,以及更加美妙的体验。然而再过10年我们会发现媒体,无论报纸、电视还是互联网,与现在都完全不同,手机而不是纸或pc成为最常用的载体;看电视不再是被动的收看电视台播放的节目而是自己订阅的,而节目呢也许是某个人自己摄制的;你也可能在电视或者网络上看到你的手机在不经意间拍摄上传的画面,并因此获得一笔不菲的酬劳。这不是呓语,也不是幻想,这是Web2.0给我们展现的互联网,届时上网将不再是简单的游戏或者阅读,网络将提供各种服务,无论是银行支付、旅游出行还是搜索爱情。
Web2.0对Web1.0的冲击
在web1.0时代信息的生产没有脱离传统的信息生产模式,即:记者-编辑-发布的精英模式;但web 2.0却完全颠覆了这个模式,麻省理工的《技术观察》称web 2.0"......在强调分众传播的对等信息交互,也就是信息接受者同时也是这些信息的创造者,若干的博客汇集成新的信息输出者,每个人在挤奶的时候还要喝奶,这其中自身的商业循环,绝不可能以浅薄的收费服务或者广告来衡量。"
首先挑动这种变化的就是blog,也称博客,这是web2.0中最为人所熟悉的元素。互联网上很早就他的影子,但在人们的观念中它只是主流媒体的一种补充,不过今年发生的一系列事件正在改变人们对它的看法:blog正在成为一种主流媒体。
如果说发生在今年2月发生的印度洋海啸,博客还只是传统媒体的补充的话,那么半年后发生的伦敦系列爆炸案中,博客正式成为一种主要的报道方式,简单精确的图片,简短直接的文字,在第一时间将新闻事件报道传至自己的博客中,人们开始习惯通过博客获得信息,而不是电视或者报纸,甚至不是门户网站。
除了个人博客外,博客也开始进入企业家的视野,进而形成企业博客。今年9月Google推出"Google与李开复博士"中文博客,对李开复跳槽引发的纠纷都可以在这里查询和提问。同样微软也鼓励员工们写博客。通用公司副总裁鲍勃·鲁兹的"快车道"博客,已经成为通用公司与公众沟通的重要场所。正在这么做的公司还有Sun、宝洁、波音公司等。博客正在逐步颠覆传统的新闻媒体。
在形形色色的文字博客之外,还有一种新的"博客",可以发布声音和图像的"博客",在Web2.0家族中被称为播客(Podcast)。它是收音机、iPod、博客和宽带互联网的集体产物。用最简单的方式描述,播客就是用嘴写,用耳朵看的博客。
对大多数中国人来说,播客还是新鲜事,在今年上半年国内还只有屈指可数的几家播客网站,但笔者近日在Google中搜索播客,得到318,000条结果,在百度中得到1,570,000条结果其中不少是播客网站或频道,虽然如此播客目前在国内还是面临几年前博客网站类似的局面,但在美国,2005年播客的人数将达到450万,而2010年这个数字将达到惊人的5680万。而传统广播公司、电视台、互联网站都从其中看到了机会和威胁。
我们也许可以从早期互联网的网络电台中找到播客的身影,但播客与网络电台最大的不同在于,它采用rss2.0可以订阅模式,不再是单纯的音频文件,任何p2p文件都可以成为播客,任何个人都可以制作节目发布广播,任何拥有mp3、智能手机的人都可以自由的收听播客节目。
相对于传统广播或者电视台而言,播客不需要频道资源,不需要大量的设备,数码摄像机、录音软件、麦克风等目前家庭常用设备就可以帮助你成为一名播音员或节目主持人,播客们常说每一名读者就是一名博客,那么每一名听众也就是一名播客。
播客的内容制作和收听方式极具个性化,打破传统的广播方式,因此它一经诞生,就受到传媒的注意,目前,海外广播公司纷纷开始增加播客节目,美国波士顿公共电视台、加拿大多伦多音乐电台以及英国BBC公司都开通了正常的播客服务,美国卫星广播公司也将启动播客节目。同时播客也在影响娱乐界,唱片公司开始通过播客建立歌手与歌迷之间的联系,不过这仅仅是开始。
互联网迈向个性化时代
在Web 1.0时代,网站之间是互不相通的,各网站自行其道,但在Web2.0时代借助rss和xml技术,实现网站之间的交流。Sina点点通、雅虎的my yahoo就加入数十家网站的内容,读者可以根据自己的喜好,自由选择信息。
但这一切还仅仅是表面现象。Web2.0倡导的个性化,与传统网站的个性化有本质的区别。在传统门户网站中,个性化意味着页面设计风格和内容组织方式而非内容本身,不管怎样都没有脱离大而全的中心门户的特点。web 2.0倡导的个性化则意味着精而专,网站之间有明确的分工,好像同样报道超女,有人只做李宇春的新闻,有人只做张靓影的新闻一样,通过RSS将其组合起来,这时的RSS就起到门户网站的作用,不同的是其中的内容都是你自己选择的。
更精彩的还在于,个性化已经由用户层面进入企业服务层面,IT精英们已经在实践个性化服务。美国房地产交易地图网(HousingMaps.com)是目前美国最受欢迎的房地产交易网站之一。它的特点就在于把时下流行Web2.0式网站craigslist的租房信息和Google Maps结合起来,以可视图钉的方式将全美房屋交易信息详细现实出来。
简而言之,web 2.0时代的个性化不是原来的网页个性化,而是服务个性化,我们面对的将是一个全新的个性化互联网。
技术引领Web 2.0
一直以来技术人员都有这样一个设想,与其安装昂贵的软件,不如通过互联网来使用安装在服务器上的软件。Web 2.0中的AJAX技术使这种设想成为可能。
·AJAX赋予软件新面孔
AJAX的全称是Asynchronous JavaScript and XML,它不是一种技术而是数种技术的组合。AJAX采用远程脚本调用技术,通过JavaScript语言与XMLHttpRequest对象来实现数据请求,将处理由服务器转移到客户端,减少了服务器的资源占用,加快了数据处理的速度。采用AJAX开发的软件能让你在使用网络应用软件时感觉就象在本机上一样。
目前AJAX技术已经广泛应用于网络应用软件开发中,Google也许是AJAX技术开发投入最大收获最多的公司,AJAX已经成功应用于GMail、Google Suggest和Google Maps等网络应用软件中。
除了Google以外还有更多的公司在采用AJAX。在AJAX的帮助下Zimbra公司开发的电子邮件中,比GMail和HotMail更加互动。Meebo.com公司也在即时通讯软件中采用AJAX技术,以创造更好的用户体验。即使微软也不能阻挡AJAX的魅力,微软声称将在下一代HotMail中加入AJAX工具条。
·开放API
以前的开放API(应用程序接口)主要指桌面应用软件,希望通过开放API融合更多的应用。在WEB1.0时代只有少数网站,比如EBAY, 亚马逊公司(Amazon)、雅虎公司、Google公司等,在设计之初就遵循各种工业化标准,进而开放API接口,正是由于这些开放的API,他们获得了不少有趣、有意思的应用。但大多数公司当时还没有这种意识,不过在Web 2.0时代,开放API已经成为不可忽视的趋势。
对于公司来说,技术领域的竞争已经演化为标准之争,标准的形成在于有多少人在使用,因此开放API就意味更多的人采用,也就意味着标准。Google公司显然深谙此道。它所推出的诸多产品都是基于开放的API标准。最典型的例子就是Google map,开放Google Map的API后,Google公司无需花费力气做更多的市场推广,其他公司就会主动地整合它的应用。如前文我们提到的美国房地产交易地图网就是在其网站中主动整合Google Map。正是看到开放后的巨大前景,微软、雅虎、Skype也纷纷加入其中。
·软件向互联网转变
在盗版最猖獗的时候,软件开发商曾经提出一个设想:免费软件,有偿服务;这个设想今天看来有望实现。
在美国诞生了一批新公司,其中就有Upstartle,该公司开发出了一种基于网络的文字处理软件Writely,进入该公司的网站,注册后就可以开始写作,文档可以保存在该公司的服务器上,然后可以在任何地方打开。这种基于网络的文字处理系统很快吸引了大批用户,一度导致服务器堵塞。与writely相同字处理软件还有goffice,Google也在加紧开发他的在线文字处理软件openoffice。
而软件霸主微软的参与也许更有震撼性。不久前微软宣布将推出Live战略,此战略以其旗舰产品Windows操作系统和Office办公软件为基础,打造Live.com平台,在此平台上通过互联网向用户提供软件服务。在这个战略下微软将为Live捆绑多种软件,而且完全免费,通过广告和定购方式获取利润,这是微软自.net以后的又一次战略转变,也标志着软件业向服务业转变的开始。
后Web 2.0更值得期待
我们今天所谈论的web 2.0应用只是web 2.0初级阶段的应用,很多web 2.0应用的商业模式还处于晦暗不明中,web 2.0的倡导者们还在苦苦寻觅合适的商业模式,我们唯一可以肯定的web 2.0是互联网发展的必然方向,他带来的冲击将不仅仅局限于互联网,很可将全面改变我们现在的生活和工作方式。
·Web 2.0改造传统电视
宽带的迅速发展使网络电视的普及成为可能,敏锐的互联网精英们纷纷把目光投向IPTV,希冀再挖掘一座金山,但如果以传统的电视台模式来发展IPTV,必然陷入高投入,低产出的怪圈,但以web 2.0的理念来发展IPTV则可走出这个怪圈。
数码产品的发展使用户制作电视节目的设备费用大幅降低,后期制作软件也可以免费从网络上下载,用户可以自己制作节目,然后将节目上传,由观众自由订阅,网站进而可以对高收视率节目实行收费,如此就改变了传统电视中观众只能被动收看节目的模式。
·网站小型化成为可能
WEB 2.0倡导专业模式使网站小型化成为可能。在web 1.0时代,网站无不走大型化道路,比拼的是编辑数量,网站规模,web 2.0的社会化、开放化的特性使中心不再成为必需,相反共同参与,使信息来源更加丰富更专业;而且小型化网站成本更容易控制。
与小型网站类似的个人网站将成为互联网的另一大特色。技术门槛的下降使个人建站更加容易,即使不知道HTML也可以轻松的搭建个人电台、个人电视台、个人DJ、个人游戏、个人商店将充斥互联网,甚至还可以拥有个人聊天工具,只有你的好友才知道。
·无线应用成为web 2.0应用的下一个扩展空间
中国是个手机大国,手机拥有量已经超越美国,无限互联网的发展迅速,另一方面,网络终端小型化十分迅速,手写输入技术的应用使使用手持设备进行书写变得十分便捷。
一些web 2.0网站已经将移动博客栏目,但博客只是先行者,只是移动web2.0的初级阶段,更多的应用还将陆续产生,如播客、移动商务。
移动web2.0一旦发展起来,好处是显而易见的,因为他的客户个体更易确认,服务更加精确。
结束语
现在的互联网是一个单向的互联网,Web 2.0正在将互联网改造成为以人为中心的多向的互联网,网络反过来也在改变我们的工作和生活方式,也许将来SOHO将成为主要的工作方式,外出也不再需要旅行社的安排,因为你可以通过互联网安排好一切。
Web 2.0带来的冲击将不会仅仅局限于互联网或者媒体,它对我们的影响也许比你想象的还要大,美国《商业周刊》认为,从软件业、电信业、媒体业、市场营销业到娱乐业,几乎都将受到了这股趋势的强烈冲击,并且即将发生翻天覆地的变化。
(1)生成的代码基于OracleBase类(用于数据库开闭及command参数预处理)。请将该类包含进工程。
(2)数据库连接字符串默认保存在工程的config配置文件中,如
(4)对于游标类型的输出参数,在oracle中定义为:
procedureexample(p_idint,p_curoutgenrefcur);
{
db.FUNC1(..);
db.FUNC2(..);
}
2005年12月19日
最近在学习 Firebird Embeded Database。作为一款单文件型小型数据库,Firebird 具有很多吸引人的特征,比如支持事务、支持存储过程、触发器等,而且 Embeded 版本的 Firebird 在 .NET 开发中只需要拷贝两个文件:一个 fbembed.dll (非托管但不需要注册的动态链接库)和一个 ADO.NET Data Provider 的 FirebirdSql.Data.Firebird.dll。这些特征都非常适合那些需要在客户端存储一些数据,但又不想安装数据库(比如MSDE)软件的情形。
据称,在国外,需要使用客户端数据库的情况中,有30%左右的开发者选择Access,有30%的开发者选择MSDE 2000,有30%的开发者选择Embedded Firebird,剩余10%选择其他小型数据库,如SQLite,MySQL 等。
上面所说的Access,MSDE 2000,Embedded Firebird,SQLite等都是可以免费再分发(free redistributable)的数据库。相比而言,MSDE 2000 显著缺点是需要安装,最大优点是和服务器端的 SQL Server 编程模型一致,开发便利。Access的显著缺点是功能较少,不支持事务等常用功能,最大优点是简单、多数开发者都很熟悉,部署也很方便。SQLite支持事务,也是一款单文件数据库,比较不足的是 .NET Data Provider 还不是很成熟。Firebird则同时具有:单文件、部署简单不需安装(只需 XCOPY 两个文件)、支持事务、存储过程、触发器,.NET Data Provider比较稳定成熟等优点。
Firebird 本身有SuperServer和Embedded版本之分,后者只能本机访问,不接受TCP连接。对于开发者而言,从Embedded数据库切换到SuperServer,只需更改数据库连接串中的ServerType值就行。
但是,在你正式决定使用?Firebird 之前,请你注意下面这个 known issue(已知问题): Firebird 数据库文件不能放置在含有中文等字符的路径中。Firebird 的文件名不可以用中文字符,所在路径的任何部分如果含有中文字符,都将无法访问到数据库。举个例子,中文Windows桌面所在的目录一般是“C:\Documents and Settings\用户名\桌面”,如果数据库文件放置在桌面上,就无法访问到。当然,Firebird 内部是可以存储中文字符的,因为它支持 GB2312 和 UNICODE 等字符集。
我已向 Firebird 开发者报告了这个 BUG,希望能早日解决这个 BUG。
需要注意一点,连接串中的 Database 地址如果使用相对路径,请一定注意这个相对路径是相对于 fbembed.dll 所在目录的。
2005年12月12日
还没回来么...立翔低估了一句,弯腰使劲拽下皮靴,轻轻放在鞋架上。换上拖鞋,起身,往自己的小间瞄去,屋里也是一片漆黑。
上哪去了,都这个时候了,该回来了吧?立翔脑子转了一小圈,不免泛起一点失落。随即不甘的看了看表,10点5分,还早吧,应该没有回来。这丫头,上哪溜达去了。
立翔走进里间,点亮了灯,解下外套往床上一扔,很自然的又将桌上的电脑打了开来。“滴~~嗡~~”冬天电脑启动时噪音特别大,将他小吓了一跳,随后让立翔感觉到更多的忧郁:电脑,电脑,我是喜欢你没错,可是刚从公司加班回来,看得眼镜都疼了,回来还要面对它 ,虽然是花了2500大洋新添的曾令我欢喜无比液晶显示器。没办法,晚上还要帮人上传一下产品图片。
没见她熟悉的姿势,懒洋洋的倚着靠背椅,双脚塞进我的被窝,悠闲的上着网,看的不是肥皂剧就是娱乐片。往常都是这个样子,见我回来了,头侧到一边,笑嘻嘻的说道“你回来了”,然后继续全神的看碟。立翔则放下辎重,坐在阿丹放脚的床沿上,陪她一起休闲一下,一半看碟,一半时间看阿丹。立翔很喜欢这种温馨的感觉,尤其是到了这个既熟悉又陌生的城市以后。
然而,今晚阿丹似乎没有回来。
立翔有些不甘,转身踱回大厅。大厅里很静,仅开了一盏白色的节能灯,立翔再次往门侧的小间望去,门缝里依旧黑漆漆,没有透出一丝光亮。外面寒热的天气已让立翔蹉唆不以,从公交车下来后几乎是小跑回的家,而这张静静关闭的小间门,则把立翔心里唯一的希望和热量都带走了。
立翔哆嗦了一下,不甘而又无奈返回里间,做他该做的事去。门半开闭着,几声似有非有的破寂之声惹他时不时往大厅里瞄瞄,可是该回来的人还是没有回来。立翔不知道自己是怎么了,连上线,打开自己博客写下:
2005年12月12日 我很寂寞,是的,非常的寂寞