靜態技術詳解
Refer to: http://www.cnblogs.com/funnyking/archive/2010/05/26/1744834.html
一. 什么是靜態化
在此之前,我們好多的人不知道什么是靜態化,說得簡單點,就是把所有不是.htm或者.html的頁面改為.htm或者.html。
我們在處理方法上,有靜態化和偽靜態方法,希望大家不要把兩者混為一潭。當然更不要把他和純靜態頁面混為一潭。
1、 純靜態頁面
當用戶訪問是,不需要經過服務器解析,直接就可以傳送到客戶端,此類型的頁面,由于不需要解析就能直接訪問,一般情況下,比動態頁面的執行速度快。
2、 靜態化
頁面靜態化就是用動靜結合的方式將動態網站生成靜態網站來保存。這是實實在在的html文件,也就是靜態頁面。
3、 偽靜態方法(Url靜態化)
偽靜態不是真正意義上的靜態化,它只是利用某種方法將訪問的路徑也就是url地址轉換成為.html為后綴的文件,但是實際上,文件本身還是以原來的后綴保存在服務器上。
二. 為什么要使用靜態化技術
隨著web1.0向web2.0時代的跨度,web2.0不但要求網站的交互性提高,而且還對靜態化要求更高,要以靜制動,動靜結合。同時,靜態化也是提高網站訪問速度、減輕服務器壓力常用解決方案之一。
4、 僅為了SEO 我們也要實現靜態化
相信對于SEO(Search Engine Optimization漢譯:搜索引擎優化)這個詞大家都不陌生。很多人都想讓自己的網站在百度,谷歌的位次靠前。而又不愿意花更大的價錢去做他們的競價排名。這個時候,你就可以使用到網頁靜態化這個技術,雖然和花錢的沒法比,可是我們在不花錢的情況下比較而言已經能夠滿足我們的要求了。當然,不是說實現SEO就一定要用靜態化技術,只是說這樣做相比較而言才操作性更簡單,效果更好。
5、 靜態化讓給我們帶來用戶
我們經常會遇到這樣的情況,當我們輸入關鍵字進行搜索時,點擊鏈接進入頁面,卻發現不是我們想要的那些內容。這是因為搜索引擎里面的數據并不是實時更新的??墒侨绻覀凕c進進去顯示的是一張404頁面,那又會怎么樣呢?
第一,我們的大部分潛在用戶被流失。
第二、我們的網站還可能被搜索引擎所K掉,因為搜索引擎會認為我們有無效鏈接,而無效鏈接過多,則會導致搜索引擎搜索質量下降。從這一點考慮,相比而言,靜態頁面一般不會出現這樣的問題。潛在用戶的增加,這一點不用多說。
6、 靜態化讓我們有證可查
通常我們如果要查找一些比較古老的歷史資料,都會發現很難查找。就算是找到了,也不一定是在來源網站找到的。如果我們要想深入追究這些資料的原始作者、發布網站、以及其他資料,我們都無從下手。但現在有相應的互聯網檔案館專門收集網站內容,只要你是HTML靜態頁,那么你的內容是可以根據連接找到原來的內容的??墒侨绻闶莿討B網站,那么,至多能找到標題和列表。
7、 讓我們服務器資源最大化吧
動態網站與數據庫交互頻繁,如果訪問量增大,那么讀寫次數就會相應的增加。這個時候,打開的數據連接自然會隨之增加,那么服務器壓力增大是必然的。要是這個時候數據庫不能承受,直接死掉,想想你的系統會怎樣?可是如果我們換成靜態頁面,即使數據庫死掉,我們依然可以正常訪問。用戶體驗大大的提升,用戶的信任度也會有很大的提高。
三. 靜態化的劣勢
8、 可維護性下降
采用靜態頁面生成,會對磁盤某一區域讀寫平凡,對服務器的損耗較大,需要即時的備份。而且針對大型系統,有必要制定相應的備份規范和更新制度。同時如果后期系統需要修改,針對大量頁面文件的修改也是需要耗費人力的,維護成本增加。
9、 增大服務器空間占有率
由于生成的文件數量太多,就需要考慮文件以及文件夾結構問題,甚至對于服務器空間大小的要求也是比較高的。同時備份的實時性也要求較高,文件數量一旦增大,備份也是一個相當大的問題。
10、 消耗服務器資源
剛剛才說了靜態化會讓服務器資源最大化,怎么又消耗服務器資源了呢?那是因為文件在寫入硬盤時會調用IO流,這個對服務器資源的占用是比較高的。
四. 適當的選擇是有必要的
| 手工靜態化 | 模板靜態化 | url rewrite偽靜態 |
占用硬盤空間 | 少 | 多 | 少 |
占用服務器資源 | 小 | 小 | 大 |
技術難度 | 簡單 | 難 | 難 |
后期維護 | 難 | 中 | 簡單 |
需要學習的內容 | html | 模板技術 在線生成文件 | 正則表達式 |
看了上面的對比圖,我們明顯知道靜態化有很多優勢,也有很多劣勢。通過對比,我給大家提供一些使用的建議:
1、在處理上沒有生成的頁面使用動態數據代替,一定頁面生成則使用更新的頁面訪問。
2、對訪問量大的網址建議使用,但是如果你的寫入比較頻繁,而且實時性要求較高的話,建議放棄?;蛘撸憧梢赃x擇進行周期性更新。
3、對于SEO權重比較高,而且你又剛剛起步,為非搜索引擎合作網址的話,建議使用。
4、對于服務器空間較小而訪問量較大的朋友,建議你們放棄使用,要不你們就擴大你們服務器的空間吧。
5、 如果你的服務器硬盤對頻繁寫入承受能力不夠的話,建議放棄。
在對這項技術有了一個較為全面的了解之后,我們接下來看看如何來實現它吧!
五. 靜態化實例
1、 偽靜態實例
顧名思義, 偽靜態是相對真實靜態來講的.通常我們為了更好的緩解服務器壓力,和增強搜索引擎的友好面.都將文章內容生成靜態頁面.但是有的朋友為了實時的顯示一些信息.或者還想運用動態腳本解決一些問題.不能用靜態的方式來展示網站內容.但是這就損失了對搜索引擎的友好面.怎么樣在兩者之間找個中間方法呢,這就產生了偽靜態技術.就是展示出來的是以.html一類的靜態頁面形式。
相關鏈接:偽靜態百度百科說明
(http://baike.baidu.com/view/1570373.htm?fr=ala0_1_1)
A. ASP.NET偽靜態
1st. 方法一(Global.asax幾乎不用)
IIS從收到Request開始,到返回Response整個過程中的幾個主要步驟:
1.IIS收到請求。
2.選擇器根據URL的特點與IIS中的配置,選擇一個ISAPI用于處理該請求——現在自然會選擇ASP.NET ISAPI。
3.ASP.NET執行引擎接收到請求,于是初始化數據(例如構建各種對象)。
4.開始觸發各種Pipeline事件,自然先從BeginRequest開始。
5.經過了多個Pipeline事件,ASP.NET根據配置為當前請求選擇一個合適的Handler或HandlerFactory進行處理(當然特殊情況例外,例如已經在之前的事件中直接輸出結果并結束請求了)。
6.經過了Handler處理之后又經過幾個Pipeline事件,以EndRequest結束。
7.輸出Response。
一般就是在BeginRequest事件中調用HttpContext的RewritePath方法,將該請求重新“定位”至一個目 標URL。例如我們就可以在Global.asax中重寫Application_BeginRequest方法來實現這一點.
public class Global : System.Web.HttpApplication
{
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
if (context.Request.Path.Equals("/Customers",
StringComparison.InvariantCultureIgnoreCase))
{
context.RewritePath("~/CustomerList.aspx");
}
}
}
2nd. 方法二(ASP.NET級別的URL Rewrite組件)(查看)
b.1_ 引用URLRewriter.dll;
b.2_ 在web.xml中配置
<httpModules>
<add name="ModuleRewriter"
type="URLRewriter.ModuleRewriter, URLRewriter" />
</httpModules>
<configSections>
<section name="RewriterConfig"
type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/test/([\w]+).html/</LookFor>
<SendTo>~/Default.aspx?test=$1</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
相關鏈接:ASP.NET偽靜態實例1
(http://allanpie.blog.163.com/blog/static/2132041020100892132572/)
B. JAVA偽靜態實例
1.需要包urlrewrite.zip;查看
2. 在WEB-INF目錄下建一個urlrewrite.xml文件
內容示例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">
<urlrewrite>
<rule>
<from>^/(\w+)/(\w+)/page_(\d+)\.html$</from>
<to type="forward">/$1.htm?category=$2&page=$3</to>
</rule>
<rule>
<from>^/rss/yahoo\.html$</from>
<to type="redirect">
http://add.my.yahoo.com/rss? url=http://feed.feedsky.com/W3CSSiteFeed
</to>
</rule>
</urlrewrite>
3.修改WEB.XML
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlrewrite.xml</param-value>
</init-param>
原文地址:http://blog.csdn.net/snowwhite1129/archive/2010/04/12/5477079.aspx
2、 生成靜態頁面實例
不管怎么說,雖然有了靜態化技術,但是網頁的內容管理功能也是必須保留的,下面我們來看下如何用代碼來實現靜態化文件的制作。
A. ASP.NET靜態化
當然首先,我們得有一個靜態模板頁,也就是要生成頁面的樣式我們得有。
那么我們看下目錄結構
1、a.html 這個頁面就是模板頁
2、a.aspx 這個頁面當然是內容編輯頁面了
3、a.aspx.cs 這個不用說,就是內容編輯頁面的服務器端代碼。
好了,了解了目錄結構我們來看下代碼的實現。
1、a.html 部分
<!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> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>!title!</title> <link href="../css/User_Reg.css" rel="stylesheet" type="text/css" /> </head>
<body> <br/> <div class="content title30">!title!</div> <br/> <div class="content"> <div class="agreement"> !content! <br/> <input name="bt_1" type="button" value="關閉" onclick="<script></script>"/> <br/> </div> <div class="copyright_line"></div> <div class="copyright"> Copyright © 2008 <a ><strong>Xiexieshu.Com </strong></a>All rights Reserved </div> </div> </body> </html>
|
這里大家注意下紅色部分,紅色部分就是你要替代的內容。比如!title!就是標題。這里的替換字符大家可以隨意改變,因為雙感嘆號的使用在內容里面是比較少見的,所以我用的是這種方法。大家可以把這個改為其他的不常用的特殊符號,越特殊越好,越復雜越好,不過你們可得考慮下可操作性。
那么有了模板也,我們接下來就是要從內容編輯頁面獲取字符串替換掉我們想替換的部分。然后生成頁面就可以了。我們看看編輯頁面代碼
2、a.aspx 部分
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AgreeMent.aspx.cs" Inherits="AgreeMent" %>
<!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> <asp:Literal ID="Literal3" runat="server" Text="頁面名稱:"></asp:Literal><br /> <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox><br /> <asp:Literal ID="Literal1" runat="server" Text="標題:"></asp:Literal><br /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <br /> <br /> <asp:Literal ID="Literal2" runat="server" Text="內容:"></asp:Literal><br /> <asp:TextBox ID="TextBox2" runat="server" Height="331px" TextMode="MultiLine" Width="566px"></asp:TextBox> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="生成頁面:" /></div> </form> </body> </html> |
編輯頁面和普通的編輯頁面沒有什么兩樣。重點在于后面的服務器端頁面
3、a.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.IO;//調用IO包,讀取文本文件 打開和讀取文件進行讀取訪問是輸入/輸出 using System.Text; //對流進行操作時要用到的包
public partial class AgreeMent : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { String path = HttpContext.Current.Server.MapPath("");//獲取當前文件路徑 StreamReader r = new StreamReader(path + @"a.html");//通過路徑獲取模板文件內容 String line = null; StringBuilder str = new StringBuilder();//大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder //開始讀取模板文件內容 while ((line = r.ReadLine()) != null) { str.AppendLine(line);//這里就是一行一行的拼接字符串 } r.Close(); str.Replace("!title!", TextBox1.Text);//好了,開始替換文本 str.Replace("!content!", TextBox2.Text); StreamWriter w = new StreamWriter(path + @"\agreement\" + TextBox3.Text + ".html");//實例化,并制定文件名稱規則和生成文件路徑 w.Write(str);//這里才真正開始創建文件 w.Close();//不要忘了關閉哦 } } |
上面的代碼相信已經寫得很詳細了,如果你還看不懂,那么我只能說是你的人品問題了,好好復習下基礎吧!
B. JAVA靜態化
這里難得去寫了,好吧,我承認我不稱職。不過,我是在教大家方法,你們可以按照上面的方法依瓢畫葫蘆,掌握了思路就知道該怎么辦了。
六. 更為詳細的解決方案
如圖所示:
1、 編輯文章,通過頁面編輯儲存到數據庫,數據操作用來增刪改數據。
2、 發布文章,通過頁面生成器從數據庫讀取數據和模板生成相應的靜態頁面。
3、 讀取整個欄目文件數量,重構索引文件和分頁文件。
注意:這三個步驟看是分開的,但是在執行時是一氣呵成的。也就是說點擊一個按鈕的同時,要依次執行這三個功能。
-----------------------------------------------------
Silence, the way to avoid many problems;
Smile, the way to solve many problems;
posted on 2013-03-25 10:29 Chan Chen 閱讀(309) 評論(0) 編輯 收藏 所屬分類: Architecture