代码改变世界

Web服务器开发学习(1)

2006-01-25 20:27  Clingingboy  阅读(4456)  评论(0编辑  收藏  举报
这几天想学习下简单web服务器开发.被逼的,没办法,必须学习.提高自己

重要概念

1.控件呈现

控件呈现:是指向HTTP输出流中写入标记文本的过程.服务器通过HTTP输出流向客户端发送生成的标记文本,这些文本将会通过客户端浏览器转化为可视化的元素显示出来.

在asp.net中使用Render方法来实现.

学习前,必须要理解HtmlTextWriter 类

概述:将标记字符和文本写入到 ASP.NET 服务器控件输出流。此类提供 ASP.NET 服务器控件在向客户端呈现标记时所使用的格式设置功能。

该类位于System.Web.UI命名空间下

(1)了解其常用方法

AddAttribute(HtmlTextWriterAttribute, String) 向开始标记添加属性(如<img src=...>,img为标记开头,src为属性)
AddStyleAttribute(HtmlTextWriterStyle, String) 添加样式属性(添加css样式格式的属性)
Write(String) 输出为HTML文本流(可理解为输出为字符串,不呈现为HTML格式)
WriteAttribute(String, String) 将指定的标记属性和值写入到输出流如设置img的alt属性
writer.WriteAttribute("alt", "AtlValue");
WriteBeginTag(string tagName) 将任何制表符间距和指定标记元素的开始标记写入到输出流。(如<img src >开头的img标记)
WriteEndTag 写入指定的标记元素的任何制表符间距和结束标记(结束标记)
RenderBeginTag(HtmlTextWriterTag) 将标记元素的开始标记写入到输出流。
RenderEndTag 将标记元素的结束标记写入到输出流。

(2)了解三种枚举类型

一,HtmlTextWriterTag 枚举 该枚举包含了大部分的HTML开头标记(如HtmlTextWriterTag.Img)

二,HtmlTextWriterAttribute 枚举 指定 HTML 属性(如HtmlTextWriterAttribute.Border)

三,HtmlTextWriterStyle 枚举 指定输出流的 HTML 样式(如HtmlTextWriterStyle.Color)

2.使用Control类的呈现方法

System.Web.UI.Control是创建服务器控件的基类

该类有三个方法

Render 将服务器控件内容发送到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
RenderChildren 将服务器控件子级的内容输出到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
RenderControl 已重载。 输出服务器控件内容,并存储有关此控件的跟踪信息(如果已启用跟踪)。

了解三者的关系
 1//RenderControl方法的基本实现
 2 public void RenderControl(HtmlTextWriter writer)
 3 {
 4 if(Visible)
 5 {
 6 Render(writer);
 7 }

 8 }

 9 //Render方法基本实现
10 protected virtual void Render(HtmlTextWriter writer)
11 {
12 RenderChildren(writer);
13 }

14 //RenderChildren方式基本实现
15 protected virtual void RenderChildren(HtmlTextWriter writer)
16 {
17 foreach (Control c in Controls)
18 {
19 c.RenderControl(writer);
20 }

21 }

先将实例对象传递给RenderControl方法

RenderControl方法先检测其Visible然后判断是发否调用Render()方法,Render()方法执行默认实现调用RenderChildren方法.RenderChildRen默认实现调用每个子控件的RenderControl方法. 其是一个递归调用的过程

其中最常用为Render方法.

示例一.
重写Render方法的例子
 1using System;
 2using System.Web.UI;
 3/// <summary>
 4/// link 的摘要说明
 5/// </summary>

 6namespace ClingingBoy
 7{
 8 public class link:Control
 9 {
10 protected override void Render(HtmlTextWriter writer)
11 {
12 writer.Write("<a href='http://www.clingingboy.com'>ClingingBoy</a>");
13 }

14 }

15}

16

aspx要求

先注册控件
<%@ Register TagPrefix="aspSample" Namespace="ClingingBoy"%>

然后在body里呈现
<aspSample:link ID="test" runat=server></aspSample:link>

测试

示例二.使用HtmlTextWriter的多种方法来实现
 1using System;
 2using System.Web;
 3using System.ComponentModel;
 4using System.Web.UI;
 5namespace ClingingBoy
 6{
 7 /// <summary>
 8 /// LinkTwo 的摘要说明
 9 /// </summary>

10 public class LinkTwo : Control
11 {
12 protected override void Render(HtmlTextWriter writer)
13 {
14 writer.AddAttribute(HtmlTextWriterAttribute.Href, "http://www.clingingboy.com");
15 writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "blue");
16 writer.RenderBeginTag(HtmlTextWriterTag.A);
17 writer.Write("ClingingBoy");
18 writer.RenderEndTag();
19 }

20 }

21}

测试

注意点:在呈现控件的过程中,需要先定义服务器的属性和CSS样式等,然后再定义服务器空间的主体内容,位置不能改变.

大家可以打开源代码查看