動態(tài)頁面技術(shù)說明—ASP、JSP、CGI、PHP
發(fā)表時間:2024-02-04 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Active Server Pages即ASP是微軟開發(fā)的一種類似HTML(Hypertext Markup Language超文本標識語言)、Script(腳本)與CGI(Common GAteway Interface 通用網(wǎng)關(guān)接口)的結(jié)合體,它沒有提供自己專門的編程語言,而是允許用戶使用包括...
Active Server Pages即ASP是微軟開發(fā)的一種類似HTML(Hypertext Markup Language超文本標識語言)、Script(腳本)與CGI(Common GAteway Interface 通用網(wǎng)關(guān)接口)的結(jié)合體,它沒有提供自己專門的編程語言,而是允許用戶使用包括VBSCRIPT,javascript等在內(nèi)的許多已有的腳本語言編寫ASP的應用程序。ASP的程序編制比HTML更方便且更有靈活性。它是在WEB服務器端運行,運行后再將運行結(jié)果以HTML格式傳送至客戶端的瀏覽器。因此ASP與一般的腳本語言相比,要安全的多。
對于廣大網(wǎng)頁技術(shù)愛好者來說,ASP比CGI具有的最大好處是可以包含HTML標簽,也可以直接存取數(shù)據(jù)庫及使用無限擴充的ActiveX控件,因此在程序編制上要比HTML方便而且更富有靈活性。
ASP吸收了當今許多流行的技術(shù),如IIS,ACTIVEX,VBSCRIPT,ODBC等,是一種發(fā)展較為成熟的網(wǎng)絡應用程序開發(fā)技術(shù);其核心技術(shù)是對組件和對象技術(shù)的充分支持。通過使用ASP的組件和對象技術(shù),用戶可以直接使用ActiveX控件,調(diào)用對象方法和屬性,以簡單的方式實現(xiàn)強大的功能。可以在此找到更詳細的信息:http://www.activeserverpages.com。
ASP中最為常用的內(nèi)置對象和組件如下:
Request對象:用來連接客戶端的Web頁(.htm文件)和服務器的Web頁(.asp文件),可以獲取客戶端數(shù)據(jù),也可以交換兩者之間的數(shù)據(jù)。
Response對象:用于將服務端數(shù)據(jù)發(fā)送到客戶端,可通過在客戶端瀏覽器顯示,用戶瀏覽頁面的重定向以及在客戶端創(chuàng)建cookies等方式進行。該功能與Request對象的功能恰恰相反。
Server對象:許多高級功能都靠它來完成;它可以創(chuàng)建各種Server對象的實例以簡化用戶的操作。
Application對象:它是個應用程序級的對象,用來在所有用戶間共享信息,并可以Web應用程序運行期間持久地保持數(shù)據(jù)。同時如果不加以限制,所有客戶都可以訪問這個對象。
Session對象:它為每個訪問者提供一個標識;Session可以用來存儲訪問者的一些喜好,可以跟蹤訪問者的的習慣。在購物網(wǎng)站中,Session常用于創(chuàng)建購物車(Shopping Cart)。
Browser Capabilities(瀏覽器性能組件):可以確切的描述用戶使用的瀏覽器類型、版本以及瀏覽器支持的插件功能。使用此組件能正確地裁剪出自己的ASP文件輸出,使得ASP文件適合于用戶的瀏覽器,并可以根據(jù)檢測出的瀏覽器的類型來顯示不同的主頁。
FileSystem Objects(文件訪問組件):允許你訪問文件系統(tǒng),處理文件。
ADO(數(shù)據(jù)庫訪問組件):它是最有用的組件;可以通過ODBC實現(xiàn)對數(shù)據(jù)庫的訪問。
Ad Rotator(廣告輪顯組件):專門為出租廣告空間的站點設計的,可以動態(tài)的隨機顯示多個預先設定的BANNER廣告條。
以下是ASP通過ADO組件調(diào)用數(shù)據(jù)庫并輸出的例子:
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" content="text/html; charset=gb2312">
<TITLE>使用ADO的例子</TITLE>
</HEAD>
<BODY>
<P align="center">所查詢的書名為:<br>
<%
Dim dataconn
Dim datardset
Set dataconn=Sever.CreateObject("ADODB.Connection")
Set datardset=Sever.CreateObject("ADODB.Recordset")
dataconn.Open "library","sa","" "數(shù)據(jù)庫為library
datardset.Open "SELECT name FROM book",dataconn "查詢表book
%>
<%
Do While Not datardset.EOF
%>
<%=datardset("name") %><br>
<%
datardset.MoveNext
Loop
%>
</P>
</BODY>
</HTML>
ASP技術(shù)有一個缺陷:它基本上是局限于微軟的操作系統(tǒng)平臺之上。ASP主要工作環(huán)境是微軟的IIS應用程序結(jié)構(gòu),又因Activex對象具有平臺特性,所以ASP技術(shù)不能很容易地實現(xiàn)在跨平臺的WEB服務器的工作。
------------------------------------------------------------------------------
JSP(Java Server Pages)是由Sun Microsystem公司于1999/6推出的新技術(shù),是基于Java Servlet以及整個java體系的Web開發(fā)技術(shù)。利用這一技術(shù)可以建立先進、安全和跨平臺的動態(tài)網(wǎng)站。
總的來講,Java Sever Pages(JSP)和 微軟的Active Sever Pages(ASP)在技術(shù)方面有許多相似之處。兩者都是為基于WEB應用實現(xiàn)動態(tài)交互網(wǎng)頁制作提供的技術(shù)環(huán)境支持。同等程度上來講,兩者都能夠為程序開發(fā)人員提供實現(xiàn)應用程序的編制與自帶組件設計網(wǎng)頁從邏輯上分離的技術(shù)。而且兩者都能夠替代CGI使網(wǎng)站建設與發(fā)展變的較為簡單與快捷。不過兩者是來源于不同的技術(shù)規(guī)范組織,其實現(xiàn)的基礎:WEB服務器平臺要求不相同。 ASP一般只應用于Windows NT/2000平臺,而JSP則可以不加修改地在85%以上的Web Server上運行,其中包括了NT的系統(tǒng),符合"write once,run anywhere"("一次編寫,多平臺運行")的java標準,實現(xiàn)平臺和服務器的獨立性,而且基于JSP技術(shù)的應用程序比基于ASP的應用程序易于維護和管理。
將內(nèi)容的生成和顯示進行分離
使用JSP技術(shù),Web頁面開發(fā)人員可以使用HTML或者XML標識來設計和格式化最終頁面。使用JSP標識或者小腳本來生成頁面上的動態(tài)內(nèi)容(內(nèi)容是根據(jù)請求來變化的,例如請求帳戶信息或者特定的一瓶酒的價格)。生成內(nèi)容的邏輯被封裝在標識和JavaBeans組件中,并且捆綁在小腳本中,所有的腳本在服務器端運行。如果核心邏輯被封裝在標識和Beans中,那么其他人,如Web管理人員和頁面設計者,能夠編輯和使用JSP頁面,而不影響內(nèi)容的生成。
在服務器端,JSP引擎解釋JSP標識和小腳本,生成所請求的內(nèi)容(例如,通過訪問JavaBeans組件,使用JDBCTM技術(shù)訪問數(shù)據(jù)庫,或者包含文件),并且將結(jié)果以HTML(或者XML)頁面的形式發(fā)送回瀏覽器。這有助于作者保護自己的代碼,而又保證任何基于HTML的Web瀏覽器的完全可用性。
強調(diào)可重用的組件
絕大多數(shù)JSP頁面依賴于可重用的,跨平臺的組件(JavaBeans或者Enterprise JavaBeansTM)組件)來執(zhí)行應用程序所要求的更為復雜的處理。開發(fā)人員能夠共享和交換執(zhí)行普通操作的組件,或者使得這些組件為更多的使用者或者客戶團體所使用。基于組件的方法加速了總體開發(fā)過程,并且使得各種組織在他們現(xiàn)有的技能和優(yōu)化結(jié)果的開發(fā)努力中得到平衡。
采用標識簡化頁面開發(fā)
Web頁面開發(fā)人員不會都是熟悉腳本語言的編程人員。JavaServer Page技術(shù)封裝了許多功能,這些功能是在易用的、與JSP相關(guān)的XML標識中進行動態(tài)內(nèi)容生成所需要的。標準的JSP標識能夠訪問和實例化JavaBeans組件,設置或者檢索組件屬性,下載Applet,以及執(zhí)行用其他方法更難于編碼和耗時的功能。
JSP的適應平臺更廣
這是JSP比ASP的優(yōu)越之處。幾乎所有平臺都支持Java,JSP+JavaBean可以在所有平臺下通行無阻。NT下IIS通過一個插件,例如JRUN(http: //www3.allaire.com/products/jrun/)或者ServletExec(http://www.newatlanta.com/),就能支持JSP。著名的Web服務器Apache已經(jīng)能夠支持JSP。由于Apache廣泛應用在NT、Unix和Linux上,因此JSP有更廣泛的運行平臺。雖然現(xiàn)在NT操作系統(tǒng)占了很大的市場份額,但是在服務器方面Unix的優(yōu)勢仍然很大,而新崛起的Linux更是來勢不小。從一個平臺移植到另外一個平臺,JSP和JavaBean甚至不用重新編譯,因為Java字節(jié)碼都是標準的、與平臺無關(guān)的。
Java中連接數(shù)據(jù)庫的技術(shù)是JDBC(Java Database Connectivity)。很多數(shù)據(jù)庫系統(tǒng)帶有JDBC驅(qū)動程序,Java程序就通過JDBC驅(qū)動程序與數(shù)據(jù)庫相連,執(zhí)行查詢、提取數(shù)據(jù)等等操作。Sun公司還開發(fā)了JDBC-ODBC bridge,用此技術(shù)Java程序就可以訪問帶有ODBC驅(qū)動程序的數(shù)據(jù)庫,目前大多數(shù)數(shù)據(jù)庫系統(tǒng)都帶有ODBC驅(qū)動程序,所以Java程序能訪問諸如Oracle、Sybase、MS SQL Server和MS Access等數(shù)據(jù)庫。
---------------------------------------------------------------------------
CGI--Common Gateway Interface,公用網(wǎng)關(guān)接口。它可以稱之為一種機制。因此您可以使用不同的程序編寫適合的CGI程序,如Visual Basic、Delphi或C/C++等,您將已經(jīng)寫好的程序放在WEB服務器的計算機上運行,再將其運行結(jié)果通過WEB服務器傳輸?shù)娇蛻舳说臑g覽器上。我們通過CGI建立WEB頁面與腳本程序之間的聯(lián)系,并且可以利用腳本程序來處理訪問者輸入的信息并據(jù)此作出響應。事實上,這樣的編制方式比較困難而且效率低下,因為你每一次修改程序都必須重新將CGI程序編譯成可執(zhí)行文件。
最常用于編寫CGI技術(shù)的語言是Perl(Practical Extraction and Report Language,文字分析報告語言),它具有強大的字符串處理能力,特別適合用于分割處理客戶端form提交的數(shù)據(jù)串;用它來編寫的程序后綴為.pl。
我們來看個簡單的例子hello.pl:
#!/usr/bin/perl
$Hello="Hello,CGI"; #字符串變量;
$Time=2;
print $Hello," for the",$Time,"nd time!","\n"; #輸出一句話;
# End hello.pl
輸出結(jié)果:
Hello,CGI for the 2nd time!
[page_break]程序中第一個注釋行具有特殊的含義,它是UNIX系統(tǒng)中shell的一條指令,表示在命令行上運行其后的命令。第一行是必需的,/usr/bin/perl提供了Perl解釋器的完整路徑名。例中的井號(#)為Perl語言中的注釋字符。P erl技術(shù)參考站點:http://www.perl.com。
CGI調(diào)用數(shù)據(jù)庫需要安裝DBI----DataBase Interface,即數(shù)據(jù)庫接口技術(shù)。DBI提供了基于Perl的標準界面連接到各種不同的SQL引擎上。各種數(shù)據(jù)庫的DBI模塊可在此找到:http://www.perl.com/CPAN-local/modules/by-module/DBI/。以下是連接ORACLE數(shù)據(jù)庫的一個例子:
use DBI; #調(diào)用DBI;
#以下三項是數(shù)據(jù)庫名,調(diào)用數(shù)據(jù)庫的用戶名,密碼;
$dbname="dbi:Oracle:DBName";
$user="user";
$pass="pass";
#聯(lián)系數(shù)據(jù)庫;
$dbh=DBI->connect($dbname,$user,$pss) die "Error Connecting to database \n"; #數(shù)據(jù)庫查詢;
$tag=$dbh->prepare("SELECT * FROM 表名");
$tag->execute; #執(zhí)行查詢;
die "Error:$DBI::err\n" if DBI::err; #出錯判斷;
my($col1,$col2); #定義只在本程序中(用my來表示)有效的兩個變量;
while(($col1,$col2)=$tag->fetchrow) {
print "Column 1:$col1\n";
print "Column 2:$col2\n";
}
$dbh->disconnect or warn "Disconnection failed \n"; #斷開與數(shù)據(jù)庫的連接; CGI技術(shù)已經(jīng)發(fā)展的很成熟了,功能強大,例如SINA,NETEASE,SOHU等網(wǎng)站的搜索引擎,用的就是CGI技術(shù)。
---------------------------------------------------------------------------
PHP--Hypertext Preprocessor(超文本預處理器),是一種易于學習和使用的服務器端腳本語言,是生成動態(tài)網(wǎng)頁的工具之一。它是嵌入HTML文件的一種腳本語言。其語法大部分是從C,JAVA,PERL語言中借來,并形成了自己的獨有風格;目標是讓WEB程序員快速的開發(fā)出動態(tài)的網(wǎng)頁。它是當今INTERNET上最為火熱的腳本語言,只需要很少的編程知識你就能使用PHP建立一個真正交互的WEB站點。
PHP是完全免費的,可以不受限制的獲得源碼,甚至可以從中加進你自己需要的特色。PHP在大多數(shù)Unix平臺,GUN/Linux和微軟Windows平臺上均可以運行。PHP的官方網(wǎng)站是:http://www.php.net。
與ASP、JSP一樣,PHP也可以結(jié)合HTML語言共同使用;它與HTML語言具有非常好的兼容性,使用者可以直接在腳本代碼中加入HTML標簽,或者在HTML標簽中加入腳本代碼從而更好的實現(xiàn)頁面控制,提供更加豐富的功能。
PHP的優(yōu)點有:安裝方便學習過程簡單;數(shù)據(jù)庫連接方便,兼容性強;擴展性強;可以進行面向?qū)ο缶幊獭R肗issan的Xterra的話來說就是PHP可以做到你想讓它做到的一切而且無所不能!
PHP提供了標準的數(shù)據(jù)庫接口,幾乎可以連接所有的數(shù)據(jù)庫;尤其和MYSQL數(shù)據(jù)庫的配合更是“天衣無縫”。下面引用一個調(diào)用MYSQL數(shù)據(jù)庫并分頁顯示的例子來加深對PHP的了解。
<?
$pagesize = 5; //每頁顯示5條記錄
$host="localhost";
$user="user";
$password="psw";
$dbname="book"; //所查詢的庫表名;
//連接MySQL數(shù)據(jù)庫
mysql_connect("$host","$user","$password") or die("無法連接MySQL數(shù)據(jù)庫服務器!"); $db = mysql_select_db("$dbname") or die("無法連接數(shù)據(jù)庫!");$sql = "select count(*) as total from pagetest";//生成查詢記錄數(shù)的SQL語句
$rst = mysql_query($sql) or die("無法執(zhí)行SQL語句:$sql !"); //查詢記錄數(shù)
$row = mysql_fetch_array($rst) or die("沒有更多的記錄!"); /取出一條記錄
$rowcount = $row["total"];//取出記錄數(shù)
mysql_free_result($rst) or die("無法釋放result資源!"); //釋放result資源$pagecount = bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出總共有幾頁if(!isset($pageno)) {
$pageno = 1; //在沒有設置pageno時,缺省為顯示第1頁
}
if($pageno<1) {
$pageno = 1; //若pageno比1小,則把它設置為1
}
if($pageno>$pagecount) {
$pageno = $pagecount; //若pageno比總共的頁數(shù)大,則把它設置為最后一頁
}
if($pageno>0) {
$href = eregi_replace("%2f","/",urlencode($PHP_SELF));//把$PHP_SELF轉(zhuǎn)換為可以在URL上使用的字符串,這樣的話就可以處理中文目錄或中文文件名
if($pageno>1){//顯示上一頁的褳接
echo "<a href="" . $href . "?pageno=" . ($pageno-1) . "">上一頁</a> ";
}
else{
echo "上一頁 ";
}
for($i=1;$i<$pageno;$i++){
echo "<a href="" . $href . "?pageno=" . $i . "">" . $i . "</a> ";
}
echo $pageno . " ";
for($i++;$i<=$pagecount;$i++){
echo "<a href="" . $href . "?pageno=" . $i . "">" . $i . "</a> ";
}
if($pageno<$pagecount){//顯示下一頁的褳接
echo "<a href="" . $href . "?pageno=" . ($pageno+1) . "">下一頁</a> ";
}
else{
echo "下一頁 ";
}$offset = ($pageno-1) * $pagesize;//算出本頁第一條記錄在整個表中的位置(第一條記錄為0)
$sql = "select * from pagetest LIMIT $offset,$pagesize";//生成查詢本頁數(shù)據(jù)的SQL語句
$rst = mysql_query($sql);//查詢本頁數(shù)據(jù)
$num_fields = mysql_num_fields($rst);//取得字段總數(shù)
$i = 0;
while($i<$num_fields){//取得所有字段的名字
$fields[$i] = mysql_field_name($rst,$i);//取得第i+1個字段的名字
$i++;
}
echo "<table border="1" cellspacing="0" cellpadding="0">";//開始輸出表格
echo "<tr>";
reset($fields);
while(list(,$field_name)=each($fields)){//顯示字段名稱
echo "<th>$field_name</th>";
}
echo "</tr>";
while($row=mysql_fetch_array($rst)){//顯示本頁數(shù)據(jù)
echo "<tr>";
reset($fields);
while(list(,$field_name)=each($fields)){//顯示每個字段的值
$field_value = $row[$field_name];
if($field_value==""){
echo "<td> </td>";
}
else{
echo "<td>$field_value</td>";
}
}
echo "</tr>";
}
echo "</table>";//表格輸出結(jié)束
mysql_free_result($rst) or die("無法釋放result資源!");//釋放result資源
}
else{
echo "目前該表中沒有任何數(shù)據(jù)!";
}mysql_close($server) or die("無法與服務器斷開連接!");//斷開連接并釋放資源
?>
從這個例子可以看出,PHP的語法結(jié)構(gòu)很象C語言,并易于掌握。而且PHP的跨平臺特性讓程序無論在WINDOWS平臺還是LINUX、UNIX系統(tǒng)都能運行自如。筆者編寫PHP程序是在WINNT4中,然后上傳到UNIX系統(tǒng)運行,從未發(fā)現(xiàn)兼容性的問題。到目前為止,無論在個人網(wǎng)站還是在企業(yè)網(wǎng)站上,以上4種技術(shù)中以PHP的應用最為廣泛。
以上4種技術(shù),皆在制作動態(tài)網(wǎng)頁上各顯神通。至于選擇哪種技術(shù),取決于制作者的愛好和技術(shù)儲備。對于廣大個人主頁的愛好者、制作者來說,筆者建議盡量少用難度較大、上手較慢的CGI技術(shù)。如果您是"微軟"的擁躉,采用ASP技術(shù)會讓您得心應手;如果是LINUX的追求者,運用PHP技術(shù)在目前是最恰當、最明智的選擇。此外,不要忽略了JSP技術(shù),據(jù)說它是未來最有發(fā)展前途的動態(tài)網(wǎng)站技術(shù),但是在學JSP之前,必須掌握JAVA技術(shù)。