熊傳玉,徐尤華
摘要:對(duì)在ASP.NET應(yīng)用程序中實(shí)現(xiàn)代碼重用技術(shù)的研究,探討了WEB自定義控件的生成、使用。說(shuō)明利用WEB自定義控件不但可以大量減少代碼的編寫量,還可以提高程序的可讀性。設(shè)計(jì)良好的控件能極大的提高程序開(kāi)發(fā)過(guò)程的效率。利用WEB自定義控件技術(shù),我們可以把自己在開(kāi)發(fā)實(shí)踐中積累的靈感和經(jīng)驗(yàn)沉淀起來(lái),以備后用。此外,如果有好的創(chuàng)意,加上嫻熟的控件開(kāi)發(fā)技術(shù),更可以開(kāi)發(fā)和發(fā)布優(yōu)秀的ASP.NET控件,為整個(gè)開(kāi)發(fā)社區(qū)貢獻(xiàn)自己的智慧和力量。
關(guān)鍵詞:ASP.NET;WEB自定義控件;代碼復(fù)用
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)02-0358-03
The Application of the Technology of Code Share in ASP.NET
XIONG Chuan-yu,XU You-hua
(Guangdong Songshan Polytechnic College,Shaoguan 512126, China)
Abstract: The technology of Code Share In the ASP.NET . The author discuss how to build a WEB custom control. This article points out the use of WEB custom control not only can reduce the amount of program code, but also can improve the readability of the Devel? opment of program.
Key words: ASP.NET; WEB custom controls; the technology of code share
1代碼復(fù)用現(xiàn)象
如果連續(xù)的開(kāi)發(fā)幾個(gè)軟件項(xiàng)目,我們就會(huì)發(fā)現(xiàn)自己編寫了許多重復(fù)功能的代碼,當(dāng)我們認(rèn)識(shí)到這點(diǎn),就會(huì)產(chǎn)生復(fù)用代碼的想法。事實(shí)上很多開(kāi)發(fā)團(tuán)隊(duì)都建立了自己的代碼庫(kù)和組建庫(kù)以方便的將他們應(yīng)用到新的項(xiàng)目中。代碼復(fù)用是絕大多數(shù)程序員所期望的,也是面向?qū)ο蟮哪繕?biāo)之一。
代碼復(fù)用在軟件開(kāi)發(fā)中存在兩個(gè)層次。第一個(gè)層次是,在設(shè)計(jì)一個(gè)新的軟件功能或是開(kāi)發(fā)一個(gè)新的項(xiàng)目時(shí),復(fù)用已存在的軟件模塊。另一個(gè)層次是,程序員在開(kāi)發(fā)一個(gè)軟件模塊時(shí),模塊的內(nèi)部應(yīng)盡可能地復(fù)用。我們這里的案例指的是前者。
2 WEB自定義控件的應(yīng)用
ASP.NET為我們提供了一個(gè)簡(jiǎn)單的工具來(lái)編寫可重用的代碼—WEB自定義控件。WEB自定義控件提供了這樣一種機(jī)制,它使得我們可以開(kāi)發(fā)出能夠非常容易的被ASP.NET頁(yè)面使用或者重新利用的代碼部件。下文所給出的自定義驗(yàn)證碼控件是對(duì)這種代碼復(fù)用技術(shù)的典型應(yīng)用。
在我們的例子當(dāng)中,我們將要建立一個(gè)驗(yàn)證碼控件,用來(lái)驗(yàn)證用戶輸入。在很多網(wǎng)站,不管是大型還是小中型網(wǎng)站,在其登錄頁(yè)面都需要一個(gè)這樣的控件來(lái)防止惡意破解密碼、刷票、論壇灌水等,驗(yàn)證碼還可以有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試。
建立驗(yàn)證碼復(fù)用程序的第一步是新建asp.net網(wǎng)站,第二步是為該站點(diǎn)添加新建項(xiàng)目,在新建的項(xiàng)目中建立兩個(gè)類,第一個(gè)類為WEB用戶控件類AuthCode,用來(lái)定義驗(yàn)證碼的屬性和樣式。該類的核心代碼如下:
public class AuthCode : WebControl
{public string GetValue()
{return HttpContext.Current.Session["value"].ToString();
}internal static int mySize;
public int MySize
{ get { return AuthCode.mySize; }
set { AuthCode.mySize = value; }
}public AuthCode()
: base(HtmlTextWriterTag.Img)
//重寫父類的構(gòu)造(輸出流的HTML標(biāo)記)
{ }
protected override void AddAttributesToRender(HtmlTextWriter writer)
{base.AddAttributesToRender(writer);
//將要輸出的的HTML標(biāo)簽的屬性和樣式添加到指定的HtmlTextWriter中
writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "pointer");
//添加樣式
writer.AddAttribute("onclick", "this.src=img.jd?id=+Math.random()");
//添加js VerifyImg.jd
writer.AddAttribute(HtmlTextWriterAttribute.Src, "img.jd");
writer.AddAttribute("alt", "點(diǎn)擊刷新");}
} }
在該新建項(xiàng)目中再新建一個(gè)類AuthCodeHttpHander,用來(lái)處理IHttpHandler,IRequiresSessionState接口。該類主要是完成驗(yàn)證碼的繪制,的核心代碼如下:
public class AuthCodeHttpHander:IHttpHandler,IRequiresSessionState
{private string GetRandomNumberString(int codeCount)
{string strChoice = "2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] strResult = strChoice.Split(new Char[] { , });
string strReturn = "";
Random rnd = new Random();
for (int i = 0; i〈codeCount; i++)
{ int j = rnd.Next(strResult.Length);
strReturn = strReturn + strResult[j].ToString();
}return strReturn;
}private Color GetColor()
{return Color.Black;
}
private Bitmap CreateImage(string str_AuthCode)
{/* -------------繪制圖片的樣式----------------*/
int width =str_AuthCode.Length* 21;
int height = 30;
Random rad = new Random();
Bitmap bmp = new Bitmap(width, height);
Graphics grp = Graphics.FromImage(bmp);//在圖片上繪制圖形
grp.Clear(Color.YellowGreen);//填充bmp的背景色
grp.DrawRectangle(new Pen(Color.Red, 1), 0, 0, width - 1, height - 1);
//繪制邊框
int num = width * height;
for (int i = 0; i〈num; i++)
//在圖片的指定坐標(biāo)上畫上有顏色的圓點(diǎn)
{int x = rad.Next(width);
int y = rad.Next(height);
int r = rad.Next(255);
int g = rad.Next(255);
int b = rad.Next(255);
Color c = Color.FromArgb(r, g, b);
bmp.SetPixel(x, y, c);//在圖片的指定坐標(biāo)上畫上有顏色的圓點(diǎn)
}
/*--------------在圖片繪制字符串---------------- */
Font f = new Font("宋體", 20, FontStyle.Bold);//定義字體
Brush br = new SolidBrush(Color.Black);
for (int i = 0; i〈str_AuthCode.Length; i++)
{string s = str_AuthCode.Substring(i, 1);
Point p = new Point(i * 20 + rad.Next(3), rad.Next(3) + 1);
grp.DrawString(s, f, br, p);//繪制字符串
}grp.Dispose();
return bmp;
}public bool IsReusable
{get { return true; } }
public void ProcessRequest(HttpContext context)
{int size = AuthCode.mySize; //Int32.Parse((String)context.Session["Size"]);
MemoryStream ms = new MemoryStream();
string NumStr = GetRandomNumberString(size);
//獲得驗(yàn)證碼字符
context.Session.Add("value", NumStr);
Bitmap theBitmap = CreateImage(NumStr);//獲得驗(yàn)證碼圖片
theBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = "image/jpeg";
//需要輸出圖象信息要修改HTTP頭
context.Response.BinaryWrite(ms.ToArray());
theBitmap.Dispose(); //釋放資源
ms.Close();
ms.Dispose();
context.Response.End();
第三步,生成解決方案,之后,打開(kāi)Web窗體,可以看到在工具箱上出現(xiàn)了一個(gè)新的組件,如圖1所示。
圖1
這就是我們生成的驗(yàn)證碼控件,將該控件拖放到窗體上,在頭部源代碼會(huì)自動(dòng)添加該控件的注冊(cè)碼:<%@ Register Assembly="AuthCode" Namespace="AuthCode" TagPrefix="cc1" %>,無(wú)須用戶自己添加。并在頁(yè)面自動(dòng)產(chǎn)生該控件的源碼如下:
<cc1:AuthCode ID="AuthCode1" runat="server" />,
我們需要做的只是在web.config添加如下節(jié)點(diǎn):
<httpHandlers>
<add verb="*" path="*.jd" type="AuthCode.AuthCodeHttpHander" ></add>
</httpHandlers>
就可以在任何頁(yè)面直接使用該控件了。但是值得注意的是,該使用該控件時(shí),需指明MySize屬性的值,這個(gè)值是驗(yàn)證碼的字符長(zhǎng)度。還可以利用this.AuthCode1.GetValue()獲得驗(yàn)證碼的值。圖2是該控件的使用效果。
圖2
3結(jié)論
正如我們所看到的,WEB自定義控件可以提供一個(gè)極好的方法來(lái)實(shí)現(xiàn)代碼的可重用性,相關(guān)的控件可以出現(xiàn)在任何一個(gè)頁(yè)面中,方便而且高效,用戶不需要編寫任何代碼,只需做相關(guān)設(shè)置,重用性很高。利用WEB自定義控件不但可以大量減少代碼的編寫量,還可以提高程序的可讀性。