ASP.NET页面静态化 之 (伪静态)

1.页面为何要静态化

有利于搜索引擎优化(SEO)

使页面URL看起来更正规

真静态 的效率更高,并且更安全,HTML页面不会受Asp.Net相关漏洞的影响;

2.伪静态原理

其原理就是,在一个页面请求的执行期间将伪静态的URL重写成真实的URL路径;

3.那种条件下需要静态化

一个页面经常被访问,并且页面内容基本不变的;

所有用户访问的页面内容基本一样的。

例如:(新闻模块)

4.下面开始带领大家写一个伪静态的案例(新闻模块)

(1)先创建新闻模块数据库

T_Channels表,存储新闻类别

T_FilterWords表,存储评论的过滤词

T_new表,存储新闻信息

T_Review表,存储回复信息

(2)建表SQL语句

USE [WordFilter]
GO
/****** Object:  Table [dbo].[T_Review]    Script Date: 07/20/2014 18:27:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_Review](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[body] [nvarchar](max) NULL,
	[nid] [int] NOT NULL,
	[Isvisable] [bit] NULL,
 CONSTRAINT [PK_T_Review] PRIMARY KEY CLUSTERED
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[T_new]    Script Date: 07/20/2014 18:27:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_new](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[title] [nvarchar](50) NULL,
	[body] [nvarchar](max) NULL,
	[chahhelid] [int] NULL,
	[ntime] [datetime] NULL,
 CONSTRAINT [PK_T_new] PRIMARY KEY CLUSTERED
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[T_FilterWords]    Script Date: 07/20/2014 18:27:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_FilterWords](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[WordPattern] [nvarchar](50) NULL,
	[ReplaceWord] [nvarchar](50) NULL,
 CONSTRAINT [PK_T_FilterWords] PRIMARY KEY CLUSTERED
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[T_Channels]    Script Date: 07/20/2014 18:27:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_Channels](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[ParentId] [int] NOT NULL,
	[Name] [nvarchar](50) NULL,
 CONSTRAINT [PK_T_Channels] PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

(3)字段解释

数据库名:WordFilter

表名:T_Channels

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 Id int 4 0      主键,自增
2 ParentId int 4 0           父级类别id
3 Name nvarchar 50 0           类别名称

表名:T_FilterWords

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 id int 4 0       主键,自增
2 WordPattern nvarchar 50 0           过滤词
3 ReplaceWord nvarchar 50 0           替换词

表名:T_new

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 id int 4 0       主键,自增
2 title nvarchar 50 0           新闻标题
3 body nvarchar 0 0           新闻内容
4 chahhelid int 4 0           类别id
5 ntime datetime 8 3           发布时间

表名:T_Review

序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
1 id int 4 0       主键自增
2 body nvarchar 0 0           评论内容
3 nid int 4 0           新闻id
4 Isvisable bit 1 0           是否显示

(4)创建项目

Common:全局公用类库文件;

WordFilter:显示层代码库;

WordFilter.BLL:BLL代码层库

WordFilter.DAL:DAL代码类库

WordFilter.Model:Model代码类库

(5)创建新闻列表:

<asp:Repeater ID="news" runat="server">

<ItemTemplate>

<li><a href=‘Article-<%#DataBinder.Eval(Container.DataItem, "id")%>.aspx‘><%#DataBinder.Eval(Container.DataItem, "title")%></a></li>

</ItemTemplate>

</asp:Repeater>

news.DataSource = new BLL.T_new().GetAllList().Tables[0];

news.DataBind();

(6)创建新闻页

    <script src="/js/xheditor/xheditor-1.1.14-zh-cn.min.js" type="text/javascript"></script>
    <script src="/js/xheditor/xheditor_plugins/ubb.min.js" type="text/javascript"></script>
    <script src="/js/xheditor/ubb2html.js" type="text/javascript"></script>
    <script type="text/javascript">
        var url = window.location.host;
        function submitForm() {
            var nid = $("#nid").val();
            var body = $("#pingnew").val();
            $.post("http://" + url + "/Front1/ashx/postCommon.ashx",
                        { nid: nid, body: body },
                       function (data) {
                           if (data == "ok") {
                               var valueli = body;
                               valueli = "<li>" + ubb2html(valueli) + "</li>";
                               $("#pp > ul").append(valueli);
                               $("#pingnew").val("");
                           }
                           else if (data == "mod") {
                               alert("含有审核词,等待管理员审核");
                           }
                           else if (data == "banned") {
                               alert("含有禁用词,请认真填写评论,文明用语");
                           }
                           else {
                               alert("错误");
                           }
                       });
        }

        $(document).ready(function () {
            var nid = $("#nid").val();
            $("#btnPing").click(submitForm);

            $.getJSON("http://" + url + "/Front1/ashx/getNews.ashx?nid=" + nid,
            function (data) {
                $.each(data, function (i, item) {
                    var valueli =  item.body ;
                    valueli = "<li>" + ubb2html(valueli) + "</li>";
                    $("#pp > ul").append(valueli);
                });
            });

            var plugins = {
                Code: { c: 'btnCode', t: '插入代码', h: 1, e: function () {
                    var _this = this;
                    var htmlCode = '<div><select id="xheCodeType"><option value="html">HTML/XML</option><option value="js">Javascript</option><option value="css">CSS</option><option value="php">PHP</option><option value="java">Java</option><option value="py">Python</option><option value="pl">Perl</option><option value="rb">Ruby</option><option value="cs">C#</option><option value="c">C++/C</option><option value="vb">VB/ASP</option><option value="">其它</option></select></div><div><textarea id="xheCodeValue" wrap="soft" spellcheck="false" style="width:300px;height:100px;" /></div><div style="text-align:right;"><input type="button" id="xheSave" value="确定" /></div>'; var jCode = $(htmlCode), jType = $('#xheCodeType', jCode), jValue = $('#xheCodeValue', jCode), jSave = $('#xheSave', jCode);
                    jSave.click(function () {
                        _this.loadBookmark();
                        _this.pasteText('[code=' + jType.val() + ']\r\n' + jValue.val() + '\r\n[/code]');
                        _this.hidePanel();
                        return false;
                    });
                    _this.saveBookmark();
                    _this.showDialog(jCode);
                }
                },
                Flv: { c: 'btnFlv', t: '插入Flv视频', h: 1, e: function () {
                    var _this = this;
                    var htmlFlv = '<div>Flv文件:  <input type="text" id="xheFlvUrl" value="http://" class="xheText" /></div><div>宽度高度: <input type="text" id="xheFlvWidth" style="width:40px;" value="480" /> x <input type="text" id="xheFlvHeight" style="width:40px;" value="400" /></div><div style="text-align:right;"><input type="button" id="xheSave" value="确定" /></div>';
                    var jFlv = $(htmlFlv), jUrl = $('#xheFlvUrl', jFlv), jWidth = $('#xheFlvWidth', jFlv), jHeight = $('#xheFlvHeight', jFlv), jSave = $('#xheSave', jFlv);
                    jSave.click(function () {
                        _this.loadBookmark();
                        _this.pasteText('[flv=' + jWidth.val() + ',' + jHeight.val() + ']' + jUrl.val() + '[/flv]');
                        _this.hidePanel();
                        return false;
                    });
                    _this.saveBookmark();
                    _this.showDialog(jFlv);
                }
                }
            }, emots = {
                msn: { name: 'MSN', count: 40, width: 22, height: 22, line: 8 },
                pidgin: { name: 'Pidgin', width: 22, height: 25, line: 8, list: { smile: '微笑', cute: '可爱', wink: '眨眼', laugh: '大笑', victory: '胜利', sad: '伤心', cry: '哭泣', angry: '生气', shout: '大骂', curse: '诅咒', devil: '魔鬼', blush: '害羞', tongue: '吐舌头', envy: '羡慕', cool: '耍酷', kiss: '吻', shocked: '惊讶', sweat: '汗', sick: '生病', bye: '再见', tired: '累', sleepy: '睡了', question: '疑问', rose: '玫瑰', gift: '礼物', coffee: '咖啡', music: '音乐', soccer: '足球', good: '赞同', bad: '反对', love: '心', brokenheart: '伤心'} },
                ipb: { name: 'IPB', width: 20, height: 25, line: 8, list: { smile: '微笑', joyful: '开心', laugh: '笑', biglaugh: '大笑', w00t: '欢呼', wub: '欢喜', depres: '沮丧', sad: '悲伤', cry: '哭泣', angry: '生气', devil: '魔鬼', blush: '脸红', kiss: '吻', surprised: '惊讶', wondering: '疑惑', unsure: '不确定', tongue: '吐舌头', cool: '耍酷', blink: '眨眼', whistling: '吹口哨', glare: '轻视', pinch: '捏', sideways: '侧身', sleep: '睡了', sick: '生病', ninja: '忍者', bandit: '强盗', police: '警察', angel: '天使', magician: '魔法师', alien: '外星人', heart: '心动'} }
            };
            $('#pingnew').xheditor({ plugins: plugins, tools: 'full', showBlocktag: false, forcePtag: false, beforeSetSource: ubb2html, beforeGetSource: html2ubb, emots: emots, emotMark: true, shortcuts: { 'ctrl+enter': submitForm} });

        });
    </script>

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <input type="hidden" id="nid" value='<%=nid%>' />
    <h2>
        <%=title%></h2>
    <p>
        <%=body%>
    </p>
    <div style="color: Red;">
        评论区:
    </div>
    <div id="pp">
        <ul>
        </ul>
    </div>
    <div>

            <textarea id="pingnew" name="pingnew"  rows="12" cols="80"></textarea>
        <p>
            <input type="button" id="btnPing" value="提交评论" /></p>

评论通过ajax提交和获取,有助于下一片 的页面真静态教程

public string title;
		protected string body;
		protected int nid;
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				if (Request.QueryString["newid"] != null)
				{
					int newid =int.Parse(Request.QueryString["newid"].ToString());
					nid = newid;
					BindNews(newid);
				}
			}
		}
		protected void BindNews(int newid)
		{
			Model.T_new news = new BLL.T_new().GetModel(newid);
			if (news != null)
			{
				title = news.title;
				body = news.body;
			}
		}

(6)核心

在Global.asax的Application_BeginRequest处理请求的URL

		protected void Application_BeginRequest(object sender, EventArgs e) {
			//获取请求的URL(虚拟路径)
			string url = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath;
			//用正则验证是否符合 @"~/Front1/Article-(\d+)\.aspx"
			Match match = Regex.Match(url, @"~/Front1/Article-(\d+)\.aspx");
			//如果符合此验证
			if (match.Success)
			{
				//获取文章的id
				string id = match.Groups[1].Value;
				//控制服务器执行 下面URL
				HttpContext.Current.RewritePath("~/Front1/Article.aspx?newid="+id);
			}
		}

ASP.NET页面静态化 之 (伪静态),布布扣,bubuko.com

时间: 2024-10-28 02:39:16

ASP.NET页面静态化 之 (伪静态)的相关文章

页面静态化3 --- 伪静态技术之Apache的rewrite机制

  Apache的rewrite机制: 意思就是,你发送的地址,比如:http://localhost/news-id67.html会被Apache改写成http://localhost/news.php?id=67; Apache本身内置了一个模块:(httpd.conf) #LoadModule rewrite_module modules/mod_rewrite.so ---- 去掉注释,开启Apache内置的重写模块开启模块过后,这个模块把news-id67.html重写为news.ph

页面静态化3 --- 伪静态技术

伪静态: 上一节我们讲了真静态技术的几个优点: ①减少服务器对数据响应的负荷: ②加载不用调动数据库 ③方便优化引擎 但同时伴随着缺点: ①生成的真静态文件多,服务器对html文件的响应负担也比较重: ②空间占用比较大. 如果一个系统使用真静态进行页面静态化,需要生成海量的静态页面,我们可以考虑使用伪静态来处理 目前业内最喜欢用的一个技术是(伪静态技术+ob的组合)技术 首先复习以下正则表达式: //PHP中如何使用正则表达式?---案例 $str = 'abcdeft1234 ghirh 56

Asp.net动态页面静态化之初始NVelocity模板引擎

Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含"?"."="."&"等特殊符号. 静态页面不能自主管理公布更新的页面,假设想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件改动(通过fso等技术例外) 常见的静态页面举例:.html扩展名的..htm扩展名的. 注意:静态页面并

Asp.net动态页面静态化之include和parse区别

Asp.net动态页面静态化之include和parse区别    #include就是在模版中在将其他模版包括进来,就好比网站的头部,尾部,广告模版等等,这些内容都是相同的时候,就可以做成一个单独的模版供各处引用. #parse的用法跟#include相类似,如果将上面的代码改成#parse之后,效果是一样的,#parse的特殊功能在于,它可以解析Nvelocity元素,比如,body.html 模版使用Nvelocity变量 $body ,如果使用#parse引用head.html和foot

Asp.net动态页面静态化之输出对象属性(实体关联)

Asp.net动态页面静态化之输出对象属性(实体关联) 模板引擎不单单可以输出单一的数据,还能直接输出对象的属性 using System; using System.Collections.Generic; using System.Linq; using System.Web; using NVelocity.Runtime; using NVelocity; using NVelocity.App; namespace czbk { /// <summary> /// Handler2

利用ResultFilter实现asp.net mvc 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容的文本保存,直接上代码: public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext filterC

[转] 利用 ResultFilter 实现 Asp.net Mvc 3 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于 asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过 mvc 提供的过滤器扩展点实现页面内容的文本保存,直接上代码: 1 public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter 2 { 3 public void OnResultExecuted(ResultExecutedContex

Asp.Net MVC页面静态化功能实现二:用递归算法来实现

上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter 后来想到可以通过WebRequest获取html代码,然后采用递归算法来实现.基本实现思路如下: 通过WebRequest获取超链接地址返回的html代码,并保存:通过正则表达式匹配html代码中所有的超链接hr

Asp.net动态页面静态化之字典哈希表的输出已及遍历判断的实现

Asp.net动态页面静态化之字典哈希表的输出已经遍历判断的实现 using System; using System.Collections.Generic; using System.Linq; using System.Web; using NVelocity.Runtime; using NVelocity; using NVelocity.App; using System.Collections; namespace czbk { /// <summary> /// diction