关于真静态页的生成

swde125 2011-05-17 08:36:33
最近在弄一些CMS系统,里面都有一个模块或者模板,然后可以通过更新全站来生成真静态的HTML页面,我想问下这个是基于什么技术实现的

有没什么DEMO可以参考下,或者资料
...全文
348 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
myhope88 2011-05-18
  • 打赏
  • 举报
回复
用模板或者直接访问完动态页面之后直接生成
wulg10 2011-05-18
  • 打赏
  • 举报
回复
4楼写的很详细
wlf535944903 2011-05-18
  • 打赏
  • 举报
回复
多个模版 那就用第二种方式吧 直接输出法生成静态页

昨天忘给你 ShowUser.aspx 了


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

<!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>用户详情查看</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table cellspacing="0" rules="all" border="1" style="width:400px;border-collapse:collapse;">
<tr>
<td>编号</td><td>
<asp:Label ID="lbUserID" runat="server"></asp:Label></td>
</tr>
<tr>
<td>用户名</td><td>
<asp:Label ID="lbUserName" runat="server"></asp:Label></td>
</tr>
<tr>
<td>真实姓名</td><td>
<asp:Label ID="lbRealName" runat="server"></asp:Label></td>
</tr>
<tr>
<td>年龄</td><td>
<asp:Label ID="lbAge" runat="server"></asp:Label></td>
</tr>
<tr>
<td>性别</td><td>
<asp:Label ID="lbSex" runat="server"></asp:Label></td>
</tr>
<tr>
<td>手机</td><td>
<asp:Label ID="lbMobile" runat="server" ></asp:Label></td>
</tr>
<tr>
<td>电子邮件</td><td>
<asp:Label ID="lbEmail" runat="server"></asp:Label><a href='emailto:{@Email}'></a></td>
</tr>
</table>
</div>
</form>
</body>
</html>



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.Data.SqlClient;
using System.IO;
using System.Text;

public partial class day19_ShowUser : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string userId = Request.QueryString["UserId"];
if (!string.IsNullOrEmpty(userId))
{
string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;;
SqlDbHelper helper = new SqlDbHelper(connectionString);
string sql = "select * from UserInfo where UserId=@UserId";
SqlParameter[] parameters = new SqlParameter[1];
parameters[0] = new SqlParameter("@UserId", userId);
SqlDataReader dataReader = helper.ExecuteReader(sql, CommandType.Text, parameters);
if (dataReader.Read())
{
lbAge.Text = dataReader["Age"].ToString();
string realName = dataReader["RealName"].ToString();
string email = dataReader["Email"].ToString();
lbEmail.Text = "<a href='mailto:" + email + "'>" + realName + "</a>";
lbMobile.Text = dataReader["Mobile"].ToString();
lbRealName.Text = realName;
lbSex.Text = bool.Parse(dataReader["Sex"].ToString()) ? "男" : "女";
lbUserID.Text = userId;
lbUserName.Text = dataReader["UserName"].ToString();
dataReader.Close();
}
else
{
lbUserName.Text = "找不到相关数据。";
}
}
else
{
lbUserName.Text = "参数错误。";
}
}
}
}



ChinaXtHuLang 2011-05-17
  • 打赏
  • 举报
回复
4楼的方法可以。
cjh200102 2011-05-17
  • 打赏
  • 举报
回复
楼上分析不错
ZhuZhuYuXiang 2011-05-17
  • 打赏
  • 举报
回复

public static bool CreatHtmlPage(string[] strNewsHtml, string[] strOldHtml, string strModeFilePath, string strPageFilePath)
{
bool Flage = false;
StreamReader ReaderFile = null;
StreamWriter WrirteFile = null;
//修改mode.htm到inc目录下
strModeFilePath = "../inc/" + strModeFilePath;
string FilePath = HttpContext.Current.Server.MapPath(strModeFilePath);
Encoding Code = Encoding.GetEncoding("gb2312");
string strFile = string.Empty;
try
{
ReaderFile = new StreamReader(FilePath, Code);
strFile = ReaderFile.ReadToEnd();

}
catch (Exception ex)
{
throw ex;
}
finally
{
ReaderFile.Close();
}
try
{
int intLengTh = strNewsHtml.Length;
for (int i = 0; i < intLengTh; i++)
{
strFile = strFile.Replace(strOldHtml[i], strNewsHtml[i]);
}
WrirteFile = new StreamWriter(HttpContext.Current.Server.MapPath(strPageFilePath), false, Code);
WrirteFile.Write(strFile);
Flage = true;
}
catch (Exception ex)
{
throw ex;
}
finally
{

WrirteFile.Flush();
WrirteFile.Close();
}
return Flage;
}

wlf535944903 2011-05-17
  • 打赏
  • 举报
回复
USERINFO 模版


<!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>
<title>{@RealName}的详细资料</title>
</head>
<body>
<table cellspacing="0" rules="all" border="1" style="width:400px;border-collapse:collapse;">
<tr>
<td>编号</td><td>{@UserID}</td>
</tr>
<tr>
<td>用户名</td><td>{@UserName}</td>
</tr>
<tr>
<td>真实姓名</td><td>{@RealName}</td>
</tr>
<tr>
<td>年龄</td><td>{@Age}</td>
</tr>
<tr>
<td>性别</td><td>{@Sex}</td>
</tr>
<tr>
<td>手机</td><td>{@Mobile}</td>
</tr>
<tr>
<td>电子邮件</td><td>
<a href='emailto:{@Email}'>发邮件给{@RealName}</a>
</td>
</tr>
</table>
</body>
</html>



wlf535944903 2011-05-17
  • 打赏
  • 举报
回复


//模版替换法生成静态页
protected void btnTemplate_Click(object sender, EventArgs e)
{
//获取模版页的路径
string templatePath = Server.MapPath("~/day19/UserInfo.html");
//如果存在模版页
if (File.Exists(templatePath))
{

StreamReader reader = new StreamReader(templatePath, Encoding.UTF8);
//读取模版页的内容
string templateValue = reader.ReadToEnd();
reader.Close();

//读取web.config中的数据库链接信息
string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
SqlDbHelper helper = new SqlDbHelper(connectionString);
string sql = "select * from UserInfo";
DataTable data = helper.ExecuteDataTable(sql);
//将数据库中所有的所有记录都生成静态页
foreach (DataRow row in data.Rows)
{

StringBuilder result = new StringBuilder(templateValue);
//替换{@UserID}标签
result = result.Replace("{@UserID}", row["UserId"].ToString());
//替换{@UserName}标签
result = result.Replace("{@UserName}", row["UserName"].ToString());
result = result.Replace("{@RealName}", row["RealName"].ToString());
result = result.Replace("{@Age}", row["Age"].ToString());
result = result.Replace("{@Sex}", bool.Parse(row["Sex"].ToString()) ? "男" : "女");
result = result.Replace("{@Mobile}", row["Mobile"].ToString());
result = result.Replace("{@Email}", row["Email"].ToString());

string userId=row["UserId"].ToString();
//设置替换所有标签后的静态页面的保存路径
string savePath=Server.MapPath("~/day19/ShowUser"+userId+".html");
StreamWriter writer = new StreamWriter(savePath, false, Encoding.UTF8);
//将内容写入到页面并关闭文件流
writer.Write(result.ToString());
writer.Close();
}
lbStatus.Text = "生成所有静态页面成功。";
}
}
//直接输出法生成静态页
protected void btnHttp_Click(object sender, EventArgs e)
{
string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
SqlDbHelper helper = new SqlDbHelper(connectionString);
//通过SQL语句查询数据库中所有用户的ID
string sql = "select UserId from UserInfo";
SqlDataReader dataReader = helper.ExecuteReader(sql);
//定义将来要访问的动态页的路径,开发文件系统类型的网站时会带有端口号
string url = "http://localhost:1856/Web/day19/ShowUser.aspx?UserId=";
string userId = string.Empty;
//HttpWebRequest用来与服务器交互
HttpWebRequest request = null;
//服务器响应的相关信息
HttpWebResponse response = null;
Stream stream = null;
StreamReader reader = null;
while (dataReader.Read())
{
userId = dataReader[0].ToString();
//生成HttpWebRequest类的实例
request = (HttpWebRequest)WebRequest.Create(url + userId);
//获取来自服务器的响应
response = (HttpWebResponse)request.GetResponse();
//获取服务器响应流
stream=response.GetResponseStream();
reader = new StreamReader(stream);
//一次性读取整个响应的内容
string result = reader.ReadToEnd();
reader.Close();//关闭字符流对象
response.Close();//关闭HttpWebResponse对象

//生成的静态文件保存路径
string savePath = Server.MapPath("~/day19/ShowUser" + userId + ".html");
StreamWriter writer = new StreamWriter(savePath, false, Encoding.UTF8);
writer.Write(result);
writer.Close();
}
dataReader.Close();//关闭SqlDataReader对象
lbStatus.Text = "生成所有静态页面成功。";
}

沈勇 2011-05-17
  • 打赏
  • 举报
回复
直接读取动态页面生成静态
挨踢蜗牛 2011-05-17
  • 打赏
  • 举报
回复
我也想知道。。。
xujun5031 2011-05-17
  • 打赏
  • 举报
回复
通过模板替换关键字,生成静态页面
swde125 2011-05-17
  • 打赏
  • 举报
回复
4楼,这个是单页面的生产 如果有多个模板呢,批量应该怎么做
简介: 1、多级目录,每个目录下面可以有更深一级目录,并列出属于该目录的网站 管理:选择分类管理,添加需要的分类,或者选择下一级目录,同时可以选择删除(删)修改(修)制作(制)某一个目录 2、静态页面,所有目录页面均使用程序生成了html页,不用读取数据库,大大节省了服务器资源 管理:选择制作下属页面,系统会列出搜索的类别,请选择需要生成的类别 3、目录模版,在数据库中存放了大量的页面模版,每一个目录都可以订制自己的网面 管理:选择模板管理,系统会列出目前已经存在的模板,你可以修改,添加,删除,添加时请按照示例进行制作,建议先将数据库备份再修改 4、即时登陆网站,站长可以随时登陆自己的网站,但是登陆以后只能在他选定的目录所显示的页面中的“更多”网站页面中显示出来,只有在管理员审查并生成页面以后才能直接在目录页面看到 5、模糊查找, 6、布尔查找,支持and(*) or(|) not(-)等布尔表达式 例如:烟台*一百-新闻 或者:烟台 and 一百 not 新闻 如果只需要and连接,可以只输入 烟台 一百,这与 烟台*一百、烟台 and 一百 效果等同 搜索结果将会把相关关键词以特殊的颜色显示出来 7、常用关键词页面自动生成,用户输入查找的关键词都保存在数据库中,如果有相同的关键词则这些关键词数量累加,管理员管理的时候可以生成排名在头几位的关键词页面,也就是提前替用户把这些关键词提前搜索出来了,并且生成静态的html页面,用户在搜索这些关键词时,就可以直接显示这些已经生成的页面,避免了大量的查询数据库,节省了服务器资源 管理:选择关键词管理,系统会列出数据库中已经存在的可以生成的关键词,以及网友在使用这个搜索引擎时用的关键字(只选取排名头100个),管理员可以随意生成需要的关键词页面 8、网站顺序,在某个目录下的网站数目很多的时候,排在上面的网站被访问的几率比排在下面的网站几率要大得多,因此我又增加排名功能,管理员可以设定某个网站在该目录下的排名 9、单目录搜索,当用户在某个目录浏览的时候,可以选择在该目录下搜索和搜索全部目录,选择在该目录下搜索可以只搜索属于该目录以及该目录的子目录下的网站 10、静态页面在线生成,在管理界面可以在线生成所有目录下的页面以及关键词页面 11、二次搜索功能,当用户在搜索某个关键词以后,系统列出了〉20个结果以后,就会出现二次搜索界面,用户可以选择在这些结果中再次搜索,比如要求结果必须不包含某个关键词或者必须再包含某个关键词 12、模版的在线修改,不同的页面模版有不同的规则 14、所有目录在线动态修改,自动更新以前的页面 15、动态生成网站首页(需要模版支持) 16、分类参照:指一个分类类目名分在一个上级类目下,而在另一个类目下作参照。以@作后缀的类目名。

62,075

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧