c#生成静态html文件,封装类

由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设计模式,是个好书),好了,废话不多说,先来看看静态类的父类:StaticBase(抽象类)

 1 public abstract class StaticBase : IDisposable
 2     {
 3         /// <summary>
 4         /// 默认编码方式
 5         /// </summary>
 6         protected Encoding code = Encoding.GetEncoding("utf-8");
 7         /// <summary>
 8         /// 写入页面数据流
 9         /// </summary>
10         protected StreamWriter sw = null;
11         /// <summary>
12         /// 读取页面数据流
13         /// </summary>
14         protected StreamReader sr = null;
15         /// <summary>
16         /// 生成的静态页面保存文件夹路径
17         /// </summary>
18         protected string SavePath = "/Default/";
19         /// <summary>
20         /// 模板页面的文件夹路径
21         /// </summary>
22         protected string PagePath = "/Master/";
23         public abstract bool Osucess { set; get; }
24         public abstract string Errorstring { set; get; }
25         /// <summary>
26         /// 具体生成静态方法
27         /// </summary>
28         protected abstract bool WriteFile();
29         /// <summary>
30         /// 不同模块的文件名称
31         /// </summary>
32         protected Dictionary<FlagsFileName, string> FileName
33         {
34             get
35             {
36                 return new Dictionary<FlagsFileName, string>
37                 {
38                     {FlagsFileName.News,"article"},
39                     {FlagsFileName.head,"head"},
40                     {FlagsFileName.foot,"foot"},
41                 };
42             }
43         }
44        // http://www.cnblogs.com/roucheng/
45         #region IDisposable 成员
46 
47         public void Dispose()
48         {
49             sw.Dispose();
50             sr.Dispose();
51         }
52 
53         #endregion
54     }
55     #region 对应的页面名称
56     /// <summary>
57     /// 对应的页面名称
58     /// </summary>
59     public enum FlagsFileName : byte
60     {
61         /// <summary>
62         /// 新闻
63         /// </summary>
64         [Description("新闻")]
65         News = 0,
66         /// <summary>
67         /// 头部
68         /// </summary>
69         [Description("头部")]
70         head=1,
71         /// <summary>
72         /// 脚部
73         /// </summary>
74         [Description("脚部")]
75         foot=2,
76     }

最后的一个枚举用于定义不同位置或不同类别的静态页所对应的子类

,接下来看看其中一个子类的实现(该子类是用于所有单页,如数据库中有100条新闻记录,那相应的生成100个新闻html页面,格式用模板定义的格式确定)

首先模板文件时静态的html页面,其中所有的需要从数据库中替换的字段用一对$包含,如数据库中的新闻标题字段为titles,则模板页中相应的标题位置用$titles$表示,页面如下

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>$Titles$</title>
 6 </script>
 7 </head>
 8 <body>
 9 <div id="wrap">
10   $head$
11   <!--hd end-->
12   <div class="clear"></div>
13   <div id="wp">
14   <table border="0" cellpadding="0" cellspacing="0" width="980">
15     <tr>
16       <td rowspan="3" valign="top" id="main_box" class="index_box2">
17       <div class="subtitle subtitle4"></div>
18       <div class="article">
19       <div class="title">$Titles$</div>
20          $Contents_tw$
21       </div> 
22         
23        
24       </td>
25       <td width="48" height="44" class="ri_top">&nbsp;</td>
26   </tr>
27     <tr>
28       <td class="ri_mid" id="mid_box">&nbsp;</td>
29     </tr>
30     <tr>
31       <td height="44" class="ri_bottom">&nbsp;</td>
32     </tr>
33 </table>
34   </div>
35   <!--wp end-->
36 </div>
37 <!--wrap end-->
38 
39 $foot$
40 <!--ft end-->
41 </body>
42 </html>

http://www.cnblogs.com/roucheng/

到这里知道个大概了吧,接下来就是这中页面类型的子类实现,我将它的名称定义为ViewPage,因为所有可以单独显示的页面都可以用这个子类,代码如下

  1 public class ViewPage : StaticBase
  2     {
  3         /// <summary>
  4         /// 是否操作成功
  5         /// </summary>
  6         private bool o_sucess = true;
  7         /// <summary>
  8         /// 错误信息
  9         /// </summary>
 10         private string errorstring = string.Empty;
 11         /// <summary>
 12         /// 模板文件名称
 13         /// </summary>
 14         private string masterhtml;
 15         /// <summary>
 16         /// 数据源 
 17         /// </summary>
 18         private IEnumerable<DataRow> rowlist;
 19         /// <summary>
 20         /// 模块类别
 21         /// </summary>
 22         private FlagsFileName fname;
 23         /// <summary>
 24         /// 指定命名文件的标志列(从数据库中的字段)
 25         /// </summary>
 26         private string thekey;
 27         public override bool Osucess
 28         {
 29             get { return o_sucess; }
 30             set { o_sucess = value; }
 31         }
 32         public override string Errorstring
 33         {
 34             get { return errorstring; }
 35             set { errorstring = value; }
 36         }
 37         /// <summary>
 38         /// 构造器静态生成对象
 39         /// </summary>
 40         /// <param name="rlist">需要生成静态文件的数据源</param>
 41         /// <param name="fn">文件类别枚举</param>
 42         /// <param name="myid">此字段为数据库表中字段,由该字段指定生成的文件名字标志 </param>
 43         public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid)
 44         {
 45             this.thekey = myid;
 46             this.fname = fn;
 47             this.rowlist = rlist;
 48             this.masterhtml = FileName[fn] + ".html";
 49             WriteFile();
 50         }
 51 
 52         protected override bool WriteFile()
 53         {
 54             string str = "";
 55             try//从指定模板文件中读取html代码
 56             {
 57                 sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
 58                 str = sr.ReadToEnd();
 59             }
 60             catch (Exception ex)//异常则指定返回的错误信息 
 61             {
 62                 sr.Close();
 63                 sr.Dispose();
 64                 this.o_sucess = false;
 65                 this.errorstring = ex.Message;
 66                 return this.o_sucess;
 67             }
 68             sr.Close();
 69             sr.Dispose();
 70             List<FlagsFileName> fn = new List<FlagsFileName>();
 71             fn.Add(FlagsFileName.head);
 72             fn.Add(FlagsFileName.foot);
 73             PointPage pg = new PointPage(fn, str);
 74             //要保存的文件名称
 75             string htmlfilename = string.Empty;
 76             string changestring = "";//要更改的字符串
 77             foreach (DataRow row in this.rowlist)//遍历数据源数组中的每个数据表
 78             {
 79                 string newString = str;
 80                 try
 81                 {
 82                     htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//给文件命名
 83                     foreach (DataColumn c in row.Table.Columns)//遍历单个数据表的列名
 84                     {
 85                         changestring = "$" + c.ColumnName + "$";
 86                         newString = newString.Replace(changestring, row[c].ToString());
 87                     }
 88                     sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);
 89                     sw.Write(newString);
 90                     sw.Flush();
 91                 }
 92                 catch (Exception ex)
 93                 {
 94                     this.o_sucess = false;
 95                     this.errorstring = ex.Message;
 96                     return this.o_sucess;
 97                 }
 98 
 99             }
100             sw.Dispose();
101             sw.Close();
102             return true;
103         }
104     }

好,到这里实现了底层的思路设计,那调用就很简单了,某个aspx页面,一个按钮button,一个点击事件Button_Click,点击事件内需要做的就是声明一个基类StaticBase,将它实例化成一个子类ViewPage,传递的参数为一个数据项集合,DataRow[]为从数据表中读取的集合,包含需要替换的字段,如select titles,contens,id from news(从新闻表中获得标识id,标题,内容),以及类型FlagsFileName.News为前天基类提到过的枚举类型,为单独页面的生成方式,已经重命名的标识列,如此处为id,则生成的页面格式为

news_1.html,news_2.html以此类推,代码如下

 1 protected void Create_Click(object sender, EventArgs e)
 2         {
 3             IEnumerable<DataRow> rowlist = TNotice_Command.SelectTNotice(-1);
 4             using (StaticBase sb = new ViewPage((DataRow[])rowlist, FlagsFileName.News, "NID"))
 5             {
 6                 if (!sb.Osucess)
 7                 {
 8                     Response.Write("<script language=javascript>alert('" + sb.Errorstring + "')</script>");
 9                 }
10             }
11         }

看到这里大家如果再从头看一遍,相信就能知道静态文件的生成的原理了,接下来研究如果生成分页页面的静态文件,文章内容简单,但希望能大家一点思路。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120729.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vdbench的作用_基于SSD的iSCSI target的建立和Vdbench测试「建议收藏」

    vdbench的作用_基于SSD的iSCSI target的建立和Vdbench测试「建议收藏」在SAN存储系统中,LIO是把存储设备直接转化为可用存储资源的高效工具,它实现了基于文件/块设备/ramdisk甚至回环设备创建存储设备的iscsitarget接口和CLI。通过iSCSIinitiator访问iSCSItarget的典型应用场景和联接如下图所示意:上图非常直观地显示了基于ram、/dev/下的设备以及文件,创建iSCSItarget的数据流。如果更深入地再往下看,可以看到它和…

    2022年5月19日
    34
  • 免费mt4下载软件mt4交易平台下载_MT5架设

    免费mt4下载软件mt4交易平台下载_MT5架设众所周知,外汇市场是全球最大的金融市场,而利用白标技术成为外汇服务提供商是很多人选择运营外汇业务的第一步。相对于外汇主标需要购买整套系统和独立服务器这样的高额成本,搭建一个白标平台要容易的多,也可以相对较快地开展外汇业务。为了帮助中小型对冲基金、高频交易机构、自营交易公司以及大型代理等快速完成外汇平台搭建,泰坦科技(STANDARDFINTECH)推出一站式白标解决方案,帮助客户以最低的成本和最高的效率开启外汇经纪事业。泰坦科技一站式白标提供最高水准解决方案泰坦科技一站…

    2025年10月23日
    4
  • 电容与部分电容_接地电容不能太大

    电容与部分电容_接地电容不能太大转载自:http://emakerzone.com/article/229关键字:薄膜电容,电解电容,陶瓷电容,铝电解电容,钽电容,安规电容之前的文章中,介绍了电感的一些知识。本文将谈谈电容,介绍电容的知识和如何选型。一、电容的基本原理电容,和电感、电阻一起,是电子学三大基本无源器件;电容的功能就是以电场能的形式储存电能量。以平行板电容器为例,简单介绍下电容的基本原理如…

    2022年8月22日
    7
  • filter dispatcher_EncodingFilter

    filter dispatcher_EncodingFilterFilterDispatcher的作用1.用来装载配置和设置静态资源的package publicvoidinit(FilterConfigfilterConfig)throwsServletException{               init();              Stringparam=filterConfig.getInitPa

    2022年8月16日
    8
  • 深浅copy

    python——赋值与深浅拷贝备注:此文为转发连接,初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~预备知识一——

    2022年3月29日
    44
  • [计算机网络]交换机VLAN的作用和原理

    [计算机网络]交换机VLAN的作用和原理本节将讨论什么是交换机VLAN产生的原因,以及如何起作用的

    2022年8月10日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号