ASP.NET代码复用技术的典型应用
2012-04-29熊传玉,徐尤华
熊传玉,徐尤华
摘要:对在ASP.NET应用程序中实现代码重用技术的研究,探讨了WEB自定义控件的生成、使用。说明利用WEB自定义控件不但可以大量减少代码的编写量,还可以提高程序的可读性。设计良好的控件能极大的提高程序开发过程的效率。利用WEB自定义控件技术,我们可以把自己在开发实践中积累的灵感和经验沉淀起来,以备后用。此外,如果有好的创意,加上娴熟的控件开发技术,更可以开发和发布优秀的ASP.NET控件,为整个开发社区贡献自己的智慧和力量。
关键词:ASP.NET;WEB自定义控件;代码复用
中图分类号:TP311文献标识码:A文章编号: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代码复用现象
如果连续的开发几个软件项目,我们就会发现自己编写了许多重复功能的代码,当我们认识到这点,就会产生复用代码的想法。事实上很多开发团队都建立了自己的代码库和组建库以方便的将他们应用到新的项目中。代码复用是绝大多数程序员所期望的,也是面向对象的目标之一。
代码复用在软件开发中存在两个层次。第一个层次是,在设计一个新的软件功能或是开发一个新的项目时,复用已存在的软件模块。另一个层次是,程序员在开发一个软件模块时,模块的内部应尽可能地复用。我们这里的案例指的是前者。
2 WEB自定义控件的应用
ASP.NET为我们提供了一个简单的工具来编写可重用的代码—WEB自定义控件。WEB自定义控件提供了这样一种机制,它使得我们可以开发出能够非常容易的被ASP.NET页面使用或者重新利用的代码部件。下文所给出的自定义验证码控件是对这种代码复用技术的典型应用。
在我们的例子当中,我们将要建立一个验证码控件,用来验证用户输入。在很多网站,不管是大型还是小中型网站,在其登录页面都需要一个这样的控件来防止恶意破解密码、刷票、论坛灌水等,验证码还可以有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。
建立验证码复用程序的第一步是新建asp.net网站,第二步是为该站点添加新建项目,在新建的项目中建立两个类,第一个类为WEB用户控件类AuthCode,用来定义验证码的属性和样式。该类的核心代码如下:
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)
//重写父类的构造(输出流的HTML标记)
{ }
protected override void AddAttributesToRender(HtmlTextWriter writer)
{base.AddAttributesToRender(writer);
//将要输出的的HTML标签的属性和样式添加到指定的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", "点击刷新");}
} }
在该新建项目中再新建一个类AuthCodeHttpHander,用来处理IHttpHandler,IRequiresSessionState接口。该类主要是完成验证码的绘制,的核心代码如下:
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++)
//在图片的指定坐标上画上有颜色的圆点
{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);//在图片的指定坐标上画上有颜色的圆点
}
/*--------------在图片绘制字符串---------------- */
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);
//获得验证码字符
context.Session.Add("value", NumStr);
Bitmap theBitmap = CreateImage(NumStr);//获得验证码图片
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();
第三步,生成解决方案,之后,打开Web窗体,可以看到在工具箱上出现了一个新的组件,如图1所示。
图1
这就是我们生成的验证码控件,将该控件拖放到窗体上,在头部源代码会自动添加该控件的注册码:<%@ Register Assembly="AuthCode" Namespace="AuthCode" TagPrefix="cc1" %>,无须用户自己添加。并在页面自动产生该控件的源码如下:
<cc1:AuthCode ID="AuthCode1" runat="server" />,
我们需要做的只是在web.config添加如下节点:
<httpHandlers>
<add verb="*" path="*.jd" type="AuthCode.AuthCodeHttpHander" ></add>
</httpHandlers>
就可以在任何页面直接使用该控件了。但是值得注意的是,该使用该控件时,需指明MySize属性的值,这个值是验证码的字符长度。还可以利用this.AuthCode1.GetValue()获得验证码的值。图2是该控件的使用效果。
图2
3结论
正如我们所看到的,WEB自定义控件可以提供一个极好的方法来实现代码的可重用性,相关的控件可以出现在任何一个页面中,方便而且高效,用户不需要编写任何代码,只需做相关设置,重用性很高。利用WEB自定义控件不但可以大量减少代码的编写量,还可以提高程序的可读性。