c#使用简单工厂模式实现生成html文件的封装类分享
由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式,先来看看静态类的父类:StaticBase(抽象类) 复制代码 代码如下: public abstract class StaticBase : IDisposable { /// <summary> /// 默认编码方式 /// </summary> protected Encoding code = Encoding.GetEncoding("utf-8"); /// <summary> /// 写入页面数据流 /// </summary> protected StreamWriter sw = null; /// <summary> /// 读取页面数据流 /// </summary> protected StreamReader sr = null; /// <summary> /// 生成的静态页面保存文件夹路径 /// </summary> protected string SavePath = "/Default/"; /// <summary> /// 模板页面的文件夹路径 /// </summary> protected string PagePath = "/Master/"; public abstract bool Osucess { set; get; } public abstract string Errorstring { set; get; } /// <summary> /// 具体生成静态方法 /// </summary> protected abstract bool WriteFile(); /// <summary> /// 不同模块的文件名称 /// </summary> protected Dictionary<FlagsFileName,string> FileName { get { return new Dictionary<FlagsFileName,string> { {FlagsFileName.News,"article"}, {FlagsFileName.head,"head"}, {FlagsFileName.foot,"foot"}, }; } } // http://www.cnblogs.com/roucheng/ #region IDisposable 成员 public void Dispose() #endregion 最后的一个枚举用于定义不同位置或不同类别的静态页所对应的子类,接下来看看其中一个子类的实现(该子类是用于所有单页,如数据库中有100条新闻记录,那相应的生成100个新闻html页面,格式用模板定义的格式确定) 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>$Titles$</title> </script> </head> <body> <div id="wrap"> $head$ <!--hd end--> <div class="clear"></div> <div id="wp"> <table border="0" cellpadding="0" cellspacing="0" width="980"> <tr> <td rowspan="3" valign="top" id="main_box" class="index_box2"> <div class="subtitle subtitle4"></div> <div class="article"> <div class="title">$Titles$</div> $Contents_tw$ </div> </td> <td width="48" height="44" class="ri_top"> </td> </tr> <tr> <td class="ri_mid" id="mid_box"> </td> </tr> <tr> <td height="44" class="ri_bottom"> </td> </tr> </table> </div> <!--wp end--> </div> <!--wrap end--> $foot$ 到这里知道个大概了吧,接下来就是这中页面类型的子类实现,我将它的名称定义为ViewPage,因为所有可以单独显示的页面都可以用这个子类,代码如下 复制代码 代码如下: public class ViewPage : StaticBase { /// <summary> /// 是否操作成功 /// </summary> private bool o_sucess = true; /// <summary> /// 错误信息 /// </summary> private string errorstring = string.Empty; /// <summary> /// 模板文件名称 /// </summary> private string masterhtml; /// <summary> /// 数据源 /// </summary> private IEnumerable<DataRow> rowlist; /// <summary> /// 模块类别 /// </summary> private FlagsFileName fname; /// <summary> /// 指定命名文件的标志列(从数据库中的字段) /// </summary> private string thekey; public override bool Osucess { get { return o_sucess; } set { o_sucess = value; } } public override string Errorstring { get { return errorstring; } set { errorstring = value; } } /// <summary> /// 构造器静态生成对象 /// </summary> /// <param name="rlist">需要生成静态文件的数据源</param> /// <param name="fn">文件类别枚举</param> /// <param name="myid">此字段为数据库表中字段,由该字段指定生成的文件名字标志 </param> public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid) { this.thekey = myid; this.fname = fn; this.rowlist = rlist; this.masterhtml = FileName[fn] + ".html"; WriteFile(); } protected override bool WriteFile() } 好,到这里实现了底层的思路设计,那调用就很简单了,某个aspx页面,一个按钮button,一个点击事件Button_Click,点击事件内需要做的就是声明一个基类StaticBase,将它实例化成一个子类ViewPage,传递的参数为一个数据项集合,DataRow[]为从数据表中读取的集合,包含需要替换的字段,如select titles,contens,id from news(从新闻表中获得标识id,标题,内容),以及类型FlagsFileName.News为前天基类提到过的枚举类型,为单独页面的生成方式,已经重命名的标识列,如此处为id,则生成的页面格式为 复制代码 代码如下: protected void Create_Click(object sender,EventArgs e) { IEnumerable<DataRow> rowlist = TNotice_Command.SelectTNotice(-1); using (StaticBase sb = new ViewPage((DataRow[])rowlist,FlagsFileName.News,"NID")) { if (!sb.Osucess) { Response.Write("<script language=javascript>alert('" + sb.Errorstring + "')</script>"); } } } 看到这里大家如果再从头看一遍,相信就能知道静态文件的生成的原理了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |