编写一个可静态化的页面程序
【考点】网页静态化的实例编写。
【出现频率】
★★☆☆☆
【解答】
在VS 2008中添加新的HTML页面到NetWeb3项目,并命名为HtmlTemp.htm。在该页面中创建表格,并在<title>内填入“{Title}”,在其他相应单元格中分别填入“{AddUserName}”,“{AddMsg}”和“{AddTime}”。这个静态页面作为网页静态化的模板页面,可以决定网页静态化后的显示布局,编写HtmlTemp.htm如代码12.14所示。
代码12.14 静态模板页面:HtmlTemp.htm
<!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>{Title}</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<table cellpadding="5" cellspacing="0" width="500" border="2">
<tr>
<td>留言人:</td>
<td>{AddUserName}</td>
</tr>
<tr>
<td>留言信息:</td>
<td>{AddMsg}</td>
</tr>
<tr>
<td align="right" colspan="2">
留言添加时间:{AddTime}
</td>
</tr>
</table>
</body>
</html>
为了统一编码,在模板页面的<head>内部,要声明页面编码方式为“UTF-8”。为了使浏览用户添加新数据到数据库,并同时可以使显示新添加数据的网页静态化,编写AddData.aspx如代码12.15所示。
代码12.15 添加新数据记录页面:AddData.aspx
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>添加留言数据</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>留言人:</td>
<td><asp:TextBox runat="server" ID="UName"></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ID="vd1" ControlToValidate="UName" ErrorMessage="请输入留言人"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>留言信息:</td>
<td><asp:TextBox runat="server" ID="Msg" TextMode="MultiLine" Columns="50"
Rows="4"></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ID="vd2" ControlToValidate="Msg" ErrorMessage="请输入信息"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right" colspan="2">
<asp:Button runat="server" ID="btn" Text="添加" Width="100" onclick="btn_Click" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
以上代码提供了添加新数据记录的界面,当用户单击“添加”按钮时,可在添加数据的同时将页面静态化,编写AddData.aspx.cs如代码12.16所示。
代码12.16 添加新数据记录逻辑代码:AddData.aspx.cs
………………………………
//导入必要的命名空间,使用SQL SERVER数据提供者
using System.Data.SqlClient;
//导入StringBuilder类的命名空间
using System.Text;
//导入File类和StreamWriter类的命名空间
using System.IO;
namespace NetWeb3
{
public partial class AddData : System.Web.UI.Page
{
//从Web.config的AppSettings节点的第1个子节点中获取数据库连接字符串
//将连接字符串对象引用赋值给静态字符串变量CnStr
static string CnStr = ConfigurationManager.AppSettings[0];
//根据CnStr变量创建SqlConnection对象,引用为cn
SqlConnection cn = new SqlConnection(CnStr);
//声明命令对象cmd和参数对象pm
SqlCommand cmd;
SqlParameter pm;
//页面中的“添加”按钮被用户单击的事件处理方法
protected void btn_Click(object sender, EventArgs e)
{
//声明4个变量,UName和Msg用于存储页面中2个用户输入值
string UName = this.UName.Text;
string Msg = this.Msg.Text;
Msg = Msg.Replace("\n","<br />");
//Time用于存储指定格式的当前时间字符串值
string Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//FileName用于存储指定格式的当前时间字符串值,并加上“.htm”,用做文件名
string FileName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".htm";
//调用OutputHtml方法,传递以上4个参数
OutputHtml(UName, Msg, Time, FileName);
}
private void OutputHtml(string t1, string t2, string t3, string FName)
{
//获取将要生成的*.htm文件的虚拟路径,引用为HtmlPath
string HtmlPath = String.Format(@"\Html\{0}",FName);
//根据*.htm模板文件的物理路径,读取模板中所有字符串,引用为HtmlTemp,编码为UTF8
string HtmlTemp = File.ReadAllText(Server.MapPath(".") + @"\HtmlTemp.htm", Encoding.UTF8);
//根据HtmlTemp创建StringBuilder对象,引用为SBuilder
StringBuilder SBuilder = new StringBuilder(HtmlTemp);
//将SBuilder中的指定字符串替换为参数变量值
SBuilder.Replace("{Title}", t1 + "的留言");
SBuilder.Replace("{AddUserName}", t1);
SBuilder.Replace("{AddMsg}", t2);
SBuilder.Replace("{AddTime}", t3);
//根据FName获取将要生成的*.htm文件物理路径,并创建该文件,返回的StreamWriter对象引用为SWriter
StreamWriter SWriter = File.CreateText(Server.MapPath(".") + @"\Html\" + FName);
//调用SWriter的WriteLine方法,将SBuilder的字符串内容写入到文本流中
SWriter.WriteLine(SBuilder.ToString());
//将缓冲区内容写入到新创建的*.htm文件中
SWriter.Flush();
//关闭SWriter对象
SWriter.Close();
//调用AddRow方法,并传递4个参数,用于数据库操作
AddRow(t1, t2, t3, HtmlPath);
}
private void AddRow(string t1,string t2,string t3,string t4)
{
//定义SqlStr变量,用于存储插入新记录到数据库的SQL查询字符串
string SqlStr = "INSERT INTO [LeaveMsg] ([UserName],[Message],[Time],[HtmlPath]) VALUES(@UName,@Msg,@Time,@FPath)";
//根据SqlStr和cn创建新的SqlCommand对象,引用为全局变量cmd
cmd = new SqlCommand(SqlStr, cn);
//创建4个SqlParameter对象,用于匹配SqlStr中的参数占位符
//将4个SqlParameter对象分别加入到cmd的Parameters集合中
pm = new SqlParameter("@UName", SqlDbType.VarChar, 50);
pm.Value = t1;
cmd.Parameters.Add(pm);
pm = new SqlParameter("@Msg", SqlDbType.VarChar);
pm.Value = t2;
cmd.Parameters.Add(pm);
pm = new SqlParameter("@Time", SqlDbType.VarChar,100);
pm.Value = t3;
cmd.Parameters.Add(pm);
pm = new SqlParameter("@FPath", SqlDbType.VarChar, 200);
pm.Value = t4;
cmd.Parameters.Add(pm);
cn.Open();
//调用cmd的ExecuteNonQuery方法,执行SQL查询命令
cmd.ExecuteNonQuery();
cn.Close();
//清空输入控件的“Text”属性值
this.UName.Text = String.Empty;
this.Msg.Text = String.Empty;
//将页面重定向到t4参数所指定的虚拟路径
Response.Redirect(t4);
}
}
}
在项目根目录下添加新目录,目录名为“Html”,当用户添加数据并完成网页静态化的过程后,新生成的HTML页面将添加到Html目录下,并且页面将重定向到新数据的HTML静态页面。
【分析】
本题主要考查面试者在网页静态化方面的经验。解答中使用模板替换标签方法在实际开发中使用比较频繁,即通过定义静态页面模板,然后将数据替换模板中的标签(特殊字符串组合)并输出新的HTML静态页面。其静态页面模板显示如图12.6所示。
静态页面模板中的标签可由编程者自己定义,不过不能和HTML标签混淆。用户在AddData.aspx页面中添加数据,留言信息为其他网站中复制,如图12.7所示。
图12.6 静态页面模板浏览效果 图12.7 用户添加新数据
用户单击“添加”按钮后,服务器端完成了数据添加到数据库,并根据静态页面模板生成HTML静态页面到HTML目录的功能,浏览器端被重定向到这个新的静态页面,如图12.8所示。
图12.8 新生成的HTML静态页面
--------------------编程问答-------------------- --------------------编程问答-------------------- 在非技术区发这个干嘛?
补充:.NET技术 , 非技术区