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()
{
sw.Dispose();
sr.Dispose();
}
#endregion
}
#region 对应的页面名称
/// <summary>
/// 对应的页面名称
/// </summary>
public enum FlagsFileName : byte
{
/// <summary>
/// 新闻
/// </summary>
[Description("新闻")]
News = 0,
/// <summary>
/// 头部
/// </summary>
[Description("头部")]
head=1,
/// <summary>
/// 脚部
/// </summary>
[Description("脚部")]
foot=2,
}
最后的一个枚举用于定义不同位置或不同类别的静态页所对应的子类,接下来看看其中一个子类的实现(该子类是用于所有单页,如数据库中有100条新闻记录,那相应的生成100个新闻html页面,格式用模板定义的格式确定)
首先模板文件时静态的html页面,其中所有的需要从数据库中替换的字段用一对$包含,如数据库中的新闻标题字段为titles,则模板页中相应的标题位置用$titles$表示,页面如下
<!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$
<!--ft end-->
</body>
</html>
到这里知道个大概了吧,接下来就是这中页面类型的子类实现,我将它的名称定义为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()
{
string str = "";
try//从指定模板文件中读取html代码
{
sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
str = sr.ReadToEnd();
}
catch (Exception ex)//异常则指定返回的错误信息
{
sr.Close();
sr.Dispose();
this.o_sucess = false;
this.errorstring = ex.Message;
return this.o_sucess;
}
sr.Close();
sr.Dispose();
List<FlagsFileName> fn = new List<FlagsFileName>();
fn.Add(FlagsFileName.head);
fn.Add(FlagsFileName.foot);
PointPage pg = new PointPage(fn, str);
//要保存的文件名称
string htmlfilename = string.Empty;
string changestring = "";//要更改的字符串
foreach (DataRow row in this.rowlist)//遍历数据源数组中的每个数据表
{
string newString = str;
try
{
htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//给文件命名
foreach (DataColumn c in row.Table.Columns)//遍历单个数据表的列名
{
changestring = "$" + c.ColumnName + "$";
newString = newString.Replace(changestring, row[c].ToString());
}
sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);
sw.Write(newString);
sw.Flush();
}
catch (Exception ex)
{
this.o_sucess = false;
this.errorstring = ex.Message;
return this.o_sucess;
}
}
sw.Dispose();
sw.Close();
return true;
}
}
好,到这里实现了底层的思路设计,那调用就很简单了,某个aspx页面,一个按钮button,一个点击事件Button_Click,点击事件内需要做的就是声明一个基类StaticBase,将它实例化成一个子类ViewPage,传递的参数为一个数据项集合,DataRow[]为从数据表中读取的集合,包含需要替换的字段,如select titles,contens,id from news(从新闻表中获得标识id,标题,内容),以及类型FlagsFileName.News为前天基类提到过的枚举类型,为单独页面的生成方式,已经重命名的标识列,如此处为id,则生成的页面格式为
news_1.html,news_2.html以此类推,代码如下
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>");
}
}
}
看到这里大家如果再从头看一遍,相信就能知道静态文件的生成的原理了。
相关文章
- 这篇文章主要介绍了C++设计模式之工厂方法模式,它是对简单工厂模式的扩展,,需要的朋友可以参考下...2020-04-25
- 这篇文章主要为大家详细介绍了Java设计模式之工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助...2021-07-20
- 这篇文章主要介绍了C#基于简单工厂模式实现的计算器功能,结合简单实例形式分析了C#使用工厂模式的数值运算相关操作技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#工厂模式的的相关资料,以计算器实例代码讲解,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了运用了简单工厂模式实现页面静态化封装类,思路比较简单,大家可根据自己的思路再扩展此类...2020-06-25
- 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了于具体产品的依赖...2021-09-22
- 本文是C++设计模式系列文章的第一篇,主要给大家讲述下工厂模式,非常的简单实用,有需要的小伙伴可以参考下...2020-04-25
- 简单工厂模式职责单一,实现简单,且实现了客户端代码与具体实现的解耦。...2020-06-25
- 这篇文章主要介绍了C++设计模式之简单工厂模式实例,工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品,需要的朋友可以参考下...2020-04-25
- 这篇文章主要为大家详细介绍了ASP.NET简单工厂模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 抽象工厂模式用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象...2021-06-19
- 这篇文章主要介绍了浅谈C#设计模式之工厂模式,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c# 设计模式之简单工厂模式的的相关资料,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
- 抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。...2020-06-25
- 本篇文章是对c#中的工厂模式进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了C++设计模式之抽象工厂模式,本文要讲的抽象工厂模式,就是工厂方法模式的扩展和延伸,需要的朋友可以参考下...2020-04-25
- 下面小编就为大家带来一篇java工厂模式入门文章。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-07-21
- 这篇文章主要介绍了浅析.net简单工厂模式,需要的朋友可以参考下...2021-09-22
- 这篇文章主要为大家详细介绍了Java中常用的设计模式之工厂模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...2022-02-27
- 工厂模式有3种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式,工厂模式最大的特点就是解耦合,本篇带你详细了解它...2022-03-26