新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
PHP调用三种数据库的方法
成都创新互联公司主营西安网站建设的网络公司,主营网站建设方案,重庆APP软件开发,西安h5微信小程序开发搭建,西安网站营销推广欢迎西安等地区企业咨询
本文比较详细的介绍PHP调用MySQL、ODBC以及ORACLE数据库。
MySQL是一个小巧灵珑的数据库服务器软件,对于中、小型应用系统是非常理想的。除了支持标准的ANSI SQL语句外,最重要的是,它还支持多种平台,而在Unix/Linux系统上,MySQL支持多线程运行方式,从而能获得相当好的性能。它和PHP、 Apache一样,是属于开放源代码软件。其官方网站是:,上面提供Windows,Linux,Unix版本的源代码的下载。
注意,MySQL访问函数都需要有相应的权限才能运行。常用的相关函数介绍如下:
(1)integer mysql_connect(主机,用户名,口令);
此函数开始一个对指定主机上的MySQL数据库的连接。若该数据库位于一个不同地端口,则在主机名后加上冒号和端口号。所有参数均为可选的,缺省情况下分别对应为本地主机、用户正在执行的脚本名和空。主机可以是IP地址或域名。
在脚本执行结束时,连接被自动关闭,也可以用mysql_close提前关闭。
(2)boolean mysql_create_db(数据库名);
创建一个数据库。注意必须用一个带有创建数据库许可权的帐号打开连接。
(3)boolean mysql_select_db(数据库名,连接号);
选择缺省数据库。
(4)integer mysql_query(SQL语句,连接号);
对指定数据库进行查询。如果SQL语句是select,则返回一个结果号,否则返回的值可以不理会。如果失败,返回false.。
(5)array mysql_fetch_array(结果号);
取出下一行,返回一个数组.可以用数字下标访问(第一个字段是下标 0),也可以用字符串下标访问(即使用各字段名)。如已取了最后一行,返回 false.。
(6)mysql_fetch_row(结果号);
返回一个矩阵代表结果集中一行的所有域。每次调用都会产生下一行,直到没有行剩下时返回false。每个域值都由一个从零开始的偏移量索引。这是从查询中获取结果的最快方法。
(7)integer mysql_num_rows(结果号);
返回结果集中行的数目
(8)integer mysql_num_fields(结果号);
返回结果集中域的数目。
(9)integer mysql_list_dbs();
向服务器查询数据库列表。它返回一个结果指针,该指针可用于mysql_fetch_row函数及类似函数。
(10)mysql_list_tables(数据库名);
获取一个指向指定数据库的表单列表的结果指针。该结果指针可用于任何从结果集中获取行的函数。
(11)mysql_close(连接号);
关闭对数据库的连接。连接必须是由mysql_connect打开的。该函数的使用不是严格必需的,因为在脚本结束时,所有非永久链路都会被自动关闭。
(12)mysql_pconnect(主机,用户名,口令);
与mysql_connect完全相似,但建立一个"永久连接",该连接一经建立永不关闭,即使使用mysql_close函数或程序执行完毕也不关闭.下一次试图建立永久连接时,系统如发现已存在一个永久连接,则直接返回该连接号而不重新创建。
下面是一个调用MYSQL数据库并分页显示的例子。
?
$pagesize = 5; //每页显示5条记录
$host="localhost";
$user="user";
$password="psw";
$dbname="book"; //所查询的库表名;
//连接MySQL数据库
mysql_connect("$host","$user","$password") or die("无法连接MySQL数据库服务器!");
$db = mysql_select_db("$dbname") or die("无法连接数据库!");
$sql = "select count(*) as total from pagetest";//生成查询记录数的SQL语句
$rst = mysql_query($sql) or die("无法执行SQL语句:$sql !"); //查询记录数
$row = mysql_fetch_array($rst) or die("没有更多的记录!"); /取出一条记录
$rowcount = $row["total"];//取出记录数
mysql_free_result($rst) or die("无法释放result资源!"); //释放result资源
$pagecount = bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出总共有几页
if(!isset($pageno)) {
$pageno = 1; //在没有设置pageno时,缺省为显示第1页
}
if($pageno1) {
$pageno = 1; //若pageno比1小,则把它设置为1
}
if($pageno$pagecount) {
$pageno = $pagecount; //若pageno比总共的页数大,则把它设置为最后一页
}
if($pageno0) {
$href = eregi_replace("%2f","/",urlencode($PHP_SELF));//把$PHP_SELF转换为可以在URL上使用的字符串,这样的话就可以处理中文目录或中文文件名
if($pageno1){//显示上一页的裢接
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";//生成查询本页数据的SQL语句
$rst = mysql_query($sql);//查询本页数据
$num_fields = mysql_num_fields($rst);//取得字段总数
$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)){//显示本页数据
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";//表格输出结束
mysql_free_result($rst) or die("无法释放result资源!");//释放result资源
}
else{
echo "目前该表中没有任何数据!";
}
mysql_close($server) or die("无法与服务器断开连接!");//断开连接并释放资源
?
开放数据库连接(ODBC)已成为一种与数据库进行通信的工业标准。PHP也提供了标准的接口,使得PHP能调用Access,SQL SERVER等数据库。其相关函数是:
(1)integer odbc_connect(string dsn, string user, string password)
连接到一个ODBC数据库源名字上。
(2)integer odbc_exec(integer connection, string query)或 odbc_do(integer connection, string query)
在一个连接上执行查询。
(3)boolean odbc_fetch_row(integer result, integer row)
从一个结果集中获取一行数据。Row参数是可选的,若为空缺,则返回下一个有效行。在结果集中不再剩余行时返回false。
(4)boolean odbc_close(integer connection)
关闭一个数据库的连接。若在该连接上有打开的事务,则返回一个错误,而且连接不会被关闭。
最后,还是看个分页的例子:
?
//设定每页显示条数
$show_num = 10;
$spages = $pages;//避免$pages后期被改变
//定义连接
$dsn = "localhost";
$user = "sa";
$password = "";
//计算总记录数
$rs_num = "select count(*) as id from bbs where zu='0' and lei='".$lei."'";
$conn_id = odbc_connect($dsn,$user,$password);
$rnum = odbc_exec($conn_id,$rs_num);
while(odbc_fetch_row($rnum)){
$total_rs = odbc_result($rnum,"id");//将总记录数放入$total_rs变量
}
//计算与页有关的条数
$nnn = $total_rs / $show_num;//计算总页数
$hnnn = intval($nnn);//将总页数取整
$cnnnn = $nnn - $hnnn;
//计算所需总页数
switch ($cnnn){
case "0":
$hnnn++;
$nnn = $hnnn;//总页数
break;
default :
$nnn = $hnnn;//总页数
break;
};
if ($nnn == 0)$nnn++;
//计算页面改变所需的条件
$fore = $pages;
$next = $pages;
$fore -= 1;
$next += 1;
if ($fore 0) {
echo "a首页/a";
echo "a前页/a";
};
if ($pages $nnn) {
echo "a后页/a";
echo "a尾页/a";
};
echo "共".$nnn."页";
$query_string = "SELECT * FROM table where condition order by you wanted order";
$cur = odbc_exec($conn_id,$query_string);
//取到循环的顶部
$cnum = ($pages-1) * $show_num;//计算当前的记录游标的位置
//空循环到显示记录游标处
if ($cnum != 0){
for ($i=0;$i=$cnum;odbc_fetch_row($cur)){$i++;};
};
$i=1;
//显示记录
while(odbc_fetch_row($cur)){
echo ;
if ($i == $show_num){//在不满页数时跳出程序
break;
};
$i++;
};
//关闭连接
odbc_close($conn_id);
?
Oracle(甲骨文)是世界上最为流行的关系数据库。它是大公司推崇的工业化的强有力的引擎。我们先看看其相关的函数:
(1)integer ora_logon(string user , string password)
开始对一个Oracle数据库服务器的连接。
(2)integer ora_open(integer connection)
打开给出的连接的游标。
(3)integer ora_do(integer connection, string query)
在给出的连接上执行查询。PHP生成一个指示器,解析查询,并执行之。
(4)integer ora_parse(integer cursor, string query)
解析一个查询并准备好执行。
(5)boolean ora_exec(integer cursor)
执行一个先前由ora_parse函数解析过的查询。
(6)boolean ora_fetch(integer cursor)
此函数会使得一个执行过的查询中的行被取到指示器中。这使得您可以调用ora_getcolumn函数。
(7)string ora_getcolumn(integer cursor, integer column)
返回当前的值。列由零开始的数字索引。
(8)boolean ora_logoff(integer connection)
断开对数据库服务器的链接。
以下是向ORACLE数据库插入数据的示例程序:
html
headtitle向ORACLE数据库中插入数据/title/head
body
form action="?echo $PHP_SELF;?" method="post"
table border="1" cellspacing="0" cellpadding="0"
tr
thID/th
thname/th
thDescription/th
/tr
tr
tdinput type="text" name="name" maxlength="50" size="10"/td
tdinput type="text" name="email" maxlength="255" size="30"/td
tdinput type="text" name="Description" maxlength="255" size="50"/td
/tr
tr align="center"
td colspan="3"input type="submit" value="提交" input type="reset" value="重写"/td
/tr
/table
/form
?
//先设置两个环境变量ORACLE_HOME,ORACLE_SID
putenv("ORACLE_HOME=/oracle/app/oracle/product/8.0.4");
putenv("ORACLE_SID=ora8");
//设置网页显示中文
putenv("NLS_LANG=Simplified_Chinese.zhs16cgb231280");
if($connection=ora_logon("scott","tiger")) {
//库表test有ID,name,Description三项
$sql = 'insert into test(ID,name,Description) values ';
$sql .= '('' . $ID . '','' . $name . '',''. $Description . '')';
if($cursor=ora_do($connect,$sql)) {
print("insert finished!");
}
$query = 'select * from test';
if($cursor=ora_do($connect,$query)) {
ora_fetch($cursor);
$content0=ora_getcolumn($cursor,0);
$content1=ora_getcolumn($cursor,1);
$content2=ora_getcolumn($cursor,2);
print("$content0");
print("$content1");
print("$content2");
ora_close($cursor);
}
ora_logoff($connection);
}
?
/body
/html
通过PHP你可以轻松的连接到数据库,请求数据并将其显示在你的web站点中,甚至修改数据库中的数据。 MySQL是一种很流行的数据库,并且在互联网中有许多有关PHP与MySQL的教程。MySQL是免费的,这一点也许就吸引了不少人。由于其广泛应用, 我就不想在这里赘述MySQL的使用方法了。Oracle被大量在企业应用中采用,因此我们就利用Oracle来介绍PHP与数据库的连接。我们当然不会 提及Oracle数据库的设计原理,原因是这已经超出了我们的讨论范围。
PHP提供了两套函数与Oracle连接,分别是ORA_和OCI函数。其中ORA_函数略显陈旧。OCI函数更新据说更好一些。两者的使用语法几乎相差无几。如前所述,你的PHP安装选项应该可以支持两者的使用。
想获得更多有关在Microsoft Windows平台上安装支持PHP3的Apache服务器的知识以及更多有关Oracle数据库的知识,请查阅以下URL:。
4.1 连接
if ($conn=Ora_Logon("user@TNSNAME","password"))
{
echo "SUCCESS ! Connected to database\n";
}
else
{
echo "Failed :-( Could not connect to database\n";
}
Ora_Logoff($conn);
phpinfo();
?
以上代码使用TNSNAME(在你的tnsnames.ora文件中指明)定义的Oracle数据库名称、用户名称和密码连接数据库。在成功连接的基础上,ora_logon函数返回一个非零的连接ID并储存在变量$conn中。
4.2 查询
假设与数据库已经连接就绪,下面我们就来实际的应用对数据库的查询。下面的代码演示了一个连接并查询的典型例子:
/*
* 连接数据库并执行查询
*/
function printoraerr($in_cur)
{
// 检查Oracle是否出错
// 如果存在错误则显示
// 当指针被激活时每次请求Oracle后调用该函数
if(ora_errorcode($in_cur))
echo "Oracle code - ".ora_error($in_cur)."\n";
return;
}
/** 主程序 */
if (!($conn=ora_logon("user@TNSNAME","password")))
{
echo "Connection to database failed\n";
exit;
}
echo "Connected as connection - $conn
\n";
echo "Opening cursor ...
\n";
$cursor=ora_open($conn); printoraerr($cursor);
echo "Opened cursor - $cursor
\n";
$qry="select user,sysdate from dual";
echo "Parsing the query $qry ...
\n";
ora_parse($cursor,$qry,0); printoraerr($cursor);
echo "Query parsed
\n";
echo "Executing cursor ...
\n";
ora_exec($cursor); printoraerr($cursor);
echo "Executed cursor
\n";
echo "Fetching cursor ...
\n";
while(ora_fetch($cursor))
{
$user=ora_getcolumn($cursor,0); printoraerr($cursor);
$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);
echo " row = $user, $sysdate
\n";
}
echo "Fetched all records
\n";
echo "Closing cursor ...
\n";
ora_close($cursor);
echo "Closed cursor
\n";
echo "Logging off from oracle...
\n";
ora_logoff($conn);
echo "Logged off from oracle
\n";
?
(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)
4.3 显示结果
以下代码演示了怎样查询数据库并将结果输出:
function printoraerr($in_cur, $conn)
{
// 检查Oracle是否出错
// 如果存在错误则显示
// 当指针被激活时每次请求Oracle后调用该函数
// If it encountered an error, we exit immediately
if(ora_errorcode($in_cur))
{
echo "Oracle code - ".ora_error($in_cur)."
n";
ora_logoff($conn);
exit;
}
return;
}
function exequery($w_qry,$conn)
{
$cursor=ora_open($conn); printoraerr($cursor,$conn);
ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);
ora_exec($cursor); printoraerr($cursor,$conn);
$numrows=0;
$w_numcols=ora_numcols($cursor);
// 显示头部
echo "
\n";
for ($i=0;$i$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
echo "\t ".ora_columnname($cursor,$i)." \n";
}
echo "
\n";
while(ora_fetch($cursor))
{
echo " \n";
for ($i=0;$i$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
if(ora_columntype($cursor,$i)=="LONG")
echo " ".
ora_getcolumn($cursor,$i)."
\n";
else
echo " ".ora_getcolumn($cursor,$i)." \n";
printoraerr($cursor,$conn);
}
$numrows++;
echo "
\n";
}
if ($numrows==0)
echo " Query returned no records
\n";
else
{
echo " \n";
echo " Count \n";
echo " $numrows \n";
echo "
\n";
}
echo " \n";
ora_close($cursor);
return;
}
// 主程序
if(!($conn=ora_logon("user@SID","password")))
{
echo "Error: Cannot connect to database\n";
exit;
}
$qry="SELECT
deptno \"Dept\"
,empno \"Emp\"
,empnm \"Name\"
,salary \"Salary\"
FROM
employee
ORDER BY 1,2";
exequery($qry);
ora_logoff($conn);
?
(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)
4.4 基于HTTP的Oracle登录
将以下代码加在PHP页面代码之前以确认Oracle登录。注意你必须正确设定$ SID。
if(!isset($PHP_AUTH_USER))
{
Header("WWW-authenticate: basic realm=\"$SID\"");
Header("HTTP/1.0 401 Unauthorized");
$title="Login Instructions";
echo "
You are not authorized to enter the site
\n";
exit;
}
else
{
if (!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))
{
Header("WWW-authenticate: basic realm=\"$SID\"");
Header("HTTP/1.0 401 Unauthorized");
$title="Login Instructions";
echo "
You are not authorised to enter the site
\n";
exit;
}
}
?
每登录一次返回给接口一个token,这个token会存储在单独的表里,每次APP关系到用户的操作都必须要携带token,根据token来解码出是哪个用户。这种方法也可以做其他设备登录踢出。一般都是这么个做法。token的生成类似cookie的密码加密,我是这么做的,当然有很多种方法,只要你能加密能解密就行。下面是phpcms里面的一个经典的方法,我一般拿来做cookie加密,制作token来使用。
?php
/**
* 字符串加密、解密函数
*
* @param string $txt 字符串
* @param string $operation ENCODE为加密,DECODE为解密,可选参数,默认为ENCODE,
* @param string $key 密钥:数字、字母、下划线
* @param string $expiry 过期时间
* @return string
*/
function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key != '' ? $key : C('COOKIE_AUTH_KEY'));
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(strtr(substr($string, $ckey_length), '-_', '+/')) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i = 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() 0) substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
}else{
return '';
}
}else{
return $keyc.rtrim(strtr(base64_encode($result), '+/', '-_'), '=');
}
}
?
两种都是脚本语言。
ASP 是服务器端脚本,在服务器上执行后,将执行生成HTML代码,下载到客户端浏览器显示。
ASP源代码在客户端浏览器上是看不到的,具有一定保密性。
JACASCRIPT 是浏览器端脚本,下载到浏览器上再执行的.在浏览器上可以查看到源代码.
目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(Java Server Pages),
PHP (Hypertext Preprocessor)。
简 介
ASP全名Active Server Pages,是一个WEB服务器端的开发环境, 利用它可以产生和运
行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script
)作为自己的开发语言。
PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法
, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数
据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点()自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。
JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病--
脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Jav
a 上的不凡造诣,将Java 从Java 应用程序 和 Java Applet 之外,又有新的硕果,就是Js
p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点
程序。
三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。
但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的
第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式
,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PH
P、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到
HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术
,客户端浏览器不需要任何附加的软件支持。
技术特点
ASP:
1. 使用 VBScript 、 JScript 等简单易懂的脚本语言,结合 HTML 代码,即可快速地完成
网站的应用程序。
2. 无须 compile 编译,容易编写,可在服务器端直接执行。
3. 使用普通的文本编辑器,如 Windows 的记事本,即可进行编辑设计。
4. 与浏览器无关 (Browser Independence), 用户端只要使用可执行 HTML 码的浏览器,即
可浏览 Active Server Pages 所设计的网页内容。 Active Server Pages 所使用的脚本语
言 (VBScript 、 Jscript) 均在 WEB 服务器端执行,用户端的浏览器不需要能够执行这些
脚本语言。
5.Active Server Pages 能与任何 ActiveX scripting 语言相容。除了可使用 VBScript
或 JScript 语言来设计外,还通过 plug-in 的方式,使用由第三方所提供的其他脚本语言
,譬如 REXX 、 Perl 、 Tcl 等。脚本引擎是处理脚本程序的 COM(Component Object Mod
el) 物件。
6. 可使用服务器端的脚本来产生客户端的脚本。
7.ActiveX Server Components(ActiveX 服务器元件 ) 具有无限可扩充性。可以使用 Vi
sual Basic 、 Java 、 Visual C++ 、 COBOL 等编程语言来编写你所需要的ActiveX Se
rver Component 。
PHP:
1.数据库连接
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是现在绝佳的组合。你还可
以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以
轻松地更改编码以适应这样的变。PHPLIB就是最常用的可以提供一般事务需要的一系列基库
。但PHP提供的数据库接口支持彼此不统一,比如对Oracle, MySQL, Sybase的接口,彼此
都不一样。这也是PHP的一个弱点。
2.面向对象编程
PHP提供了类和对象。基于web的编程工作非常需要面向对象编程能力。PHP支持构造器、
提取类等。
JSP:
1.将内容的生成和显示进行分离
使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使
用JSP标识或者小脚本来生成页面上的动态内容。生成内容的逻辑被封装在标识和JavaBeans
组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。如果核心逻辑被封装在标识和
Beans中,那么其他人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内
容的生成。
在服务器端,JSP引擎解释JSP标识和小脚本,生成所请求的内容(例如,通过访问Java
Beans组件,使用JDBCTM技术访问数据库,或者包含文件),并且将结果以HTML(或者XML)
页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览
器的完全可用性。
2.强调可重用的组件
绝大多数JSP页面依赖于可重用的,跨平台的组件(JavaBeans或者Enterprise JavaBea
nsTM组件)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操
作的组件,或者使得这些组件为更多的使用者或者客户团体所使用。基于组件的方法加速了
总体开发过程,并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。
3.采用标识简化页面开发
Web页面开发人员不会都是熟悉脚本语言的编程人员。JavaServer Page技术封装了许多
功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。标准的JS
P标识能够访问和实例化JavaBeans组件,设置或者检索组件属性,下载Applet,以及执行用
其他方法更难于编码和耗时的功能。
通过开发定制化标识库,JSP技术是可以扩展的。今后,第三方开发人员和其他人员可以
为常用功能创建自己的标识库。这使得Web页面开发人员能够使用熟悉的工具和如同标识一样
的执行特定功能的构件来工作。
JSP技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够
支持企业级的分布式应用。作为采用Java技术家族的一部分,以及Java 2(企业版体系结构
)的一个组成部分,JSP技术能够支持高度复杂的基于Web的应用。
由于JSP页面的内置脚本语言是基于Java编程语言的,而且所有的JSP页面都被编译成为
Java Servlet,JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。
作为Java平台的一部分,JSP拥有Java编程语言“一次编写,各处运行”的特点。随着越
来越多的供应商将JSP支持添加到他们的产品中,您可以使用自己所选择的服务器和工具,更
改工具或服务器并不影响当前的应用。
应用范围
ASP是Microsoft开发的动态网页语言,也继承了微软产品的一贯传统——只能运行于微软
的服务器产品,IIS (Internet Information Server) (windows NT)和PWS(Personal Web Se
rver)(windows 98)上。Unix下也有ChiliSoft的插件来支持ASP,但是ASP本身的功能有限,
必须通过ASP+COM的组合来扩充,Unix下的COM实现起来非常困难。
PHP3可在Windows,Unix,Linux的Web服务器上正常运行,还支持IIS,Apache等通用Web服务器
,用户更换平台时,无需变换PHP3代码,可即拿即用.
JSP同PHP3类似,几乎可以运行于所有平台。如Win NT,Linux,Unix. NT下IIS通过一个插
件,例如JRUN或者ServletExec,就能支持JSP。著名的Web服务器Apache已经能够支持JSP。
由于Apache广泛应用在NT、Unix和Linux上,因此JSP有更广泛的运行平台。虽然现在NT操作
系统占了很大的市场份额,但是在服务器方面Unix的优势仍然很大,而新崛起的Linux更是来
势不小。从一个平台移植到另外一个平台,JSP和JavaBean甚至不用重新编译,因为Java字节
码都是标准的与平台无关的。
性能比较
有人做过试验,对这三种语言分别做循环性能测试及存取Oracle数据库测试。
在循环性能测试中,JSP只用了令人吃惊的四秒钟就结束了20000*20000的循环。而ASP
、PHP测试的是2000*2000循环(少一个数量级),却分别用了63秒和84秒。(参考PHPLIB)
。
数据库测试中,三者分别对 Oracle 8 进行 1000 次 Insert,Update,Select,和Delete
: Jsp 需要 13 秒,Php 需要 69 秒,ASP则 需要 73 秒。
前景分析
目前在国内PHP与ASP应用最为广泛。而JSP由于是一种较新的技术,国内采用的较少。但在
国外,JSP已经是比较流行的一种技术,尤其是电子商务类的网站,多采用JSP。
采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺
点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。
首先,PHP缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,解决方法只有一
个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开
,组成二维阵列。而PHP则缺乏这种支持。还有上面提到过的一点,PHP提供的数据库接口支
持不统一,这就使得它不适合运用在电子商务中。
ASP和JSP则没有以上缺陷,ASP可以通过Microsoft Windowsd的COM/DCOM获得ActiveX规
模支持,通过DCOM和Transcation Server获得结构支持;JSP可以通过SUN Java的Java Clas
s和EJB获得规模支持,通过EJB/CORBA以及众多厂商的Application Server获得结构支持。
三者中,JSP应该是未来发展的趋势。世界上一些大的电子商务解决方案提供商都采用J
SP/Servlet。比较出名的如IBM的E-business,它的核心是采用JSP/Servlet的WebSphere;
西方另外一个非常著名的电子商务软件提供商,Intershop。它原来的产品Intershop1 2, 3
, 4占据了主要的电子商务软件份额。它们都是通过CGI来提供支持 的。但去年10月后它推出
了Enfinity,一个采用JSP/Servlet的电子商务Application Server,而且声言不再开发传统
软件。
总之
ASP,PHP,JSP三者都有相当数量的支持者,由此也可以看出三者各有所长。正在学习或
使用动态页面的朋友可根据三者的特点选择一种适合自己的语言。
希望对你有帮助,,,