专注于技术经验交流

水至清则无鱼、宁静而致远!

技术、经验、学习共同打造网络新生活!
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

动态生成静态页

Posted on 2006-12-06 17:14  小鱼儿  阅读(1067)  评论(2编辑  收藏  举报
动态生成静态页思路:
1:建立一个html页面模板,在这个页面中把你想要动态显示的地方用特殊的字符串表示(如$htmlstrstr$);
2:在程序中用将这个html页面读到一个字符串变量如str;
3:用字符串的resplace方法将在第一步中特殊字符替换成你想要的内容;
4保存;
return null;
207            }
208        }
209        /// <summary>
210        /// 开始进行aspxTohtml转换
211        /// </summary>
212        /// <param name="htmlparam">html模板页中的所有参数数组</param>
213        /// <param name="aspxparam">aspx页面中要代替html模板页中参数值数组</param>
214        /// <returns>返回值为成功创建后的文件名称</returns>

215        public string StartConvert(string[] htmlparam,string[] aspxparam)
216        {
217            //先调用setTemplateFileparameter 和setAspxFileparameter方法,进行付值操作
218            setTemplateFileparameter(htmlparam);
219            setAspxFileparameter(aspxparam);
220            //
221            string fn=this.StartConvert();
222            //
223            _convertedFilename=fn;
224            //
225            return fn;
226        }

227        
228        /// <summary>
229        /// 用时间加随机数生成一个文件名
230        /// </summary>
231        /// <returns></returns>

232        private string getfilename()
233        {
234            //用时间加随机数生成一个文件名
235            System.Threading.Thread.Sleep(50);
236            string yearStr = System.DateTime.Now.Year.ToString();
237            string monthStr = string.Format("{0:0#}",System.DateTime.Now.Month);
238            string dayStr = string.Format("{0:0#}",System.DateTime.Now.Day); 
239            string hourStr = string.Format("{0:0#}",System.DateTime.Now.Hour);
240            string minuteStr = string.Format("{0:0#}",System.DateTime.Now.Minute);
241            string secondStr = string.Format("{0:0#}",System.DateTime.Now.Second);
242            string millisecondStr = string.Format("{0:000#}",System.DateTime.Now.Millisecond);                    
243            System.Random rd = new System.Random();
244            return yearStr + monthStr + dayStr + hourStr + minuteStr + secondStr + millisecondStr + string.Format("{0:0000#}",rd.Next(100))+".html";
245            //return DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
246        }

247        /// <summary>
248        /// 进行转换处理
249        /// </summary>
250        /// <returns>返回以时间命名的文件名</returns>

251        private string writeFile()
252        {
253            
254            // 读取模板文件
255            string temp = HttpContext.Current.Server.MapPath(this.TemplateFilePath);
256            StreamReader sr=null;            
257            string str=""
258            try
259            {
260                sr = new StreamReader(temp, this.TemplateHtmlCode);
261                str = sr.ReadToEnd(); // 读取文件
262            }

263            catch(Exception ex)
264            {
265                //HttpContext.Current.Response.Write(exp.Message);
266                //HttpContext.Current.Response.End();        
267                WriteErrFile(ex);
268            }

269            finally
270            {
271                sr.Close();
272            }
            
273            // 替换内容
274            // 这时,模板文件已经读入到名称为str的变量中了
275            for(int i=0;i<this.TemplateParamCount;i++)
276            {
277                str =str.Replace(this._templateFileparameter[i],this._aspxFileparameter[i]); 
278            }
        
279
280            return savefile(str); 
281        }

282
283        /// <summary>
284        /// 
285        /// </summary>
286        /// <param name="str"></param>
287        /// <returns></returns>

288
289        private string savefile(string str)
290        {
291            // 写文件
292            StreamWriter sw=null;
293            try
294            {
295                
296                string path = HttpContext.Current.Server.MapPath(this.HtmlFilePath);
297                //html文件名称    
298                string htmlfilename=getfilename();
299                sw = new StreamWriter(path + htmlfilename , falsethis.Code);
300                sw.Write(str);
301                sw.Flush();
302                return htmlfilename; 
303            }

304            catch(Exception ex)
305            {                
306                WriteErrFile(ex);
307            }

308            finally
309            {
310                sw.Close();
311            }

312            return "";
313        }

314
315        /// <summary>
316        /// 传入URL返回网页的html代码
317        /// </summary>
318        /// <param name="Url">URL</param>
319        /// <returns></returns>

320        public string getUrltoHtml(string Url)
321        {            
322            try
323            {
324                System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);            
325                System.Net.WebResponse wResp =wReq.GetResponse();                
326                System.IO.Stream respStream  = wResp.GetResponseStream();                
327                System.IO.StreamReader reader = new System.IO.StreamReader(respStream, System.Text.Encoding.GetEncoding("gb2312"));
328                return  savefile(reader.ReadToEnd());
329
330            }

331            catch(System.Exception ex)
332            {
333                WriteErrFile(ex);
334            }

335            return "";
336        }

337        #endregion
338
339
340        #region 构造        
341        
342        public AspxToHtml()
343        {
344            //
345            // TODO: 在此处添加构造函数逻辑
346            //            
347        }

348
349        private void settemplateParamCount(int templateParamCount)
350        {
351            if (templateParamCount>0)
352                this.TemplateParamCount=templateParamCount;
353        }

354        /// <summary>
355        /// 提供欲代替的参数个数
356        /// </summary>
357        /// <param name="templateParamCount"></param>

358        public AspxToHtml(int templateParamCount)
359        {    
360            settemplateParamCount(templateParamCount);
361            
362        }

363        /// <summary>
364        /// 
365        /// </summary>
366        /// <param name="templateParamCount">html模板页中的参数个数</param>
367        /// <param name="htmlFilePath">生成的html文件所存放的文件夹路径</param>
368        /// <param name="templateFilePath">html模板页路径</param>

369        public AspxToHtml(int templateParamCount,string htmlFilePath,string templateFilePath)
370        {
371            settemplateParamCount(templateParamCount);
372            this.HtmlFilePath        =    htmlFilePath;
373            this.TemplateFilePath    =    templateFilePath;
374            
375        }

376        #endregion

377
378        #region
379        
380        /// <summary>
381        /// 把错误写入文件方法#region 把错误写入文件方法
382        /// </summary>
383        /// <param name="ee"></param>

384        private  void WriteErrFile(Exception ee)
385        {
386            
387            FileStream fs1 = new FileStream(HttpContext.Current.Server.MapPath(ErrLogPath), System.IO.FileMode.Append);
388            StreamWriter sw1 = new StreamWriter(fs1);
389            sw1.WriteLine("**************************************************");
390            sw1.WriteLine("错误日期:" + System.DateTime.Now);
391            sw1.WriteLine("错误描述:" + ee.Message);
392            sw1.WriteLine("错误名称:" + ee.Source);
393            sw1.WriteLine("详细:" + ee.ToString());
394            sw1.WriteLine("*************************************************");
395            sw1.Close();
396        }

397        #endregion

398    }
399}
400

第二分参考资料


实现动态创建HTML文件的功能需要应用StreamReader和StreamWriter类。

在ASP.net中,String对象是不可改变的,每次使用该类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为新对象分配新的空间。在需要对字符串执行重复修改的情况下,就会增加系统开销。如果要修改字符串而不创建新的对象,则可以使用Sysmte.text命名空间下的StringBuilder类,该类可以改变字符串,当在一个循环中将许多字符串连接到一起时,使用StringBuildr类可以提高性能。

实现方法:首先使用StreamReader对象读取指定HTML模板文件内容,并把读取到的内容保存到StringBuilder对象中,然后通过for循环语句依次替换关键字段,最后再通过StreamWriter对象根据替换后新内容创建一个HTML文件。

代码如下:

页面文件:

新闻模板文件(template.html):

<html>
    <head>
        <title>$htmlkey[0]</title>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head>
    <body >
        <table $htmlkey[1] height="100%" border="0" width="100%" cellpadding="10" cellspacing="0" bgcolor="#eeeeee" style="border:1px solid #000000">
          <tr>
            <td width="100%" valign="middle" align="left">
    <span style="color: $htmlkey[2];font-size: $htmlkey[3]"><marquee>$htmlkey[4]</marquee></span>
  </td>
          </tr>
        </table>
    </body>
</html>


页面文件:Dhtml.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Dhtml.aspx.cs" Inherits="Dhtml" %>

<!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 runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="Form1" method="post" runat="server">
  <asp:Button id="btnCreate" style="Z-INDEX: 101; LEFT: 576px; POSITION: absolute; TOP: 48px"
  runat="server" Text="创建HTML文件" OnClick="btnCreate_Click"></asp:Button>
  <asp:TextBox id="txtContent" style="Z-INDEX: 102; LEFT: 208px; POSITION: absolute; TOP: 80px"
  runat="server" TextMode="MultiLine" Height="402px" Width="352px"></asp:TextBox>
  <asp:HyperLink id="hyCreateFile" style="Z-INDEX: 103; LEFT: 584px; POSITION: absolute; TOP: 96px"
  runat="server" Target="_blank">创建的HTML文件</asp:HyperLink>
  <asp:TextBox id="txtTitle" style="Z-INDEX: 104; LEFT: 208px; POSITION: absolute; TOP: 48px" runat="server"
  Width="352px"></asp:TextBox>
  <asp:Label id="Label1" style="Z-INDEX: 105; LEFT: 128px; POSITION: absolute; TOP: 48px" runat="server">页面标题</asp:Label>
  <asp:Label id="Label2" style="Z-INDEX: 106; LEFT: 128px; POSITION: absolute; TOP: 80px" runat="server">页面内容</asp:Label>
</form>
</body>
</html>


实现代码:Dhtml.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.IO;

public partial class Dhtml : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void btnCreate_Click(object sender, EventArgs e)
  {
    string[] newContent = new string[5];//定义和html标记数目一致的数组
    StringBuilder strhtml = new StringBuilder();
    try
    {
        //创建StreamReader对象
        using (StreamReader sr = new StreamReader(Server.MapPath("TextBox") + "\\template.html"))
        {
          string oneline;
          //读取指定的HTML文件模板
          while ((oneline = sr.ReadLine()) != null)
          {
            strhtml.Append(oneline);
          }
          sr.Close();
        }
    }
    catch (Exception err)
    {
        //输出异常信息
        Response.Write(err.ToString());
    }
    //为标记数组赋值
    newContent[0] = txtTitle.Text;//标题
    newContent[1] = "BackColor='#cccfff'";//背景色
    newContent[2] = "#ff0000";//字体颜色
    newContent[3] = "100px";//字体大小
    newContent[4] = txtContent.Text;//主要内容

    //根据上面新的内容生成html文件
    try
    {
        //指定要生成的HTML文件
        string fname = Server.MapPath("TextBox") + "\\" + DateTime.Now.ToString("yyyymmddhhmmss") + ".html";
        //替换html模版文件里的标记为新的内容
        for (int i = 0; i < 5; i++)
        {
          strhtml.Replace("$htmlkey[" + i + "]", newContent);
        }
        //创建文件信息对象
        FileInfo finfo = new FileInfo(fname);
        //以打开或者写入的形式创建文件流
        using (FileStream fs = finfo.OpenWrite())
        {
          //根据上面创建的文件流创建写数据流
          StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GB2312"));
          //把新的内容写到创建的HTML页面中
          sw.WriteLine(strhtml);
          sw.Flush();
          sw.Close();
        }
        //设置超级链接的属性
        hyCreateFile.Text = DateTime.Now.ToString("yyyymmddhhmmss") + ".html";
        hyCreateFile.NavigateUrl = "TextBox/" + DateTime.Now.ToString("yyyymmddhhmmss") + ".html";
    }
    catch (Exception err)
    {
        Response.Write(err.ToString());
    }
  }
}



New Document