第一章 JavaServer Pages與Microsoft Active Server Pages的技術比較
一、介紹
首先,JSP和ASP在技術上有許多共同之處,它們都是用來開發基于Web應用的動態頁面,并且兩者都可以使開發人員通過使用構件技術將程序邏輯從頁面設計中分離出來。雖然,JavaServer Pages和Microsoft Active Server Pages有許多類似的地方,但依然存在很多不同之處。它們的不同之處與它們的相同點同樣顯著,對于使用它們的開發人員以及采用它們作為自己網絡體系結構的一部分的那些組織來說,這些不同點有著更加深遠的意義。
二、JSP技術:一種開放的方式
在許多方面,對于JSP和ASP來說,它們兩者最大的區別取決于軟件開發方法的不同。JSP技術具有服務器無關性和平臺無關性,而ASP是Microsoft產品,故只能依賴于Microsoft技術。
1.平臺無關性和服務器無關性
JSP技術堅持了Java體系結構的思想,即:一次編寫,隨處運行。JSP技術可以運行任何Web服務器,并且被各種類型的工具支持,而不是與一種平臺或者開發商綁定在一起。因為ASP技術使用了ActiveX控制技術,所以被嚴格的限制在微軟的Windows平臺下。因為ActiveX對象是平臺相關的,所以作為微軟IIS一個重要特征的ASP技術,很難在廣泛的Web服務器上運行。
2.開放開發過程和資源
Sun公司使用Java Community Process開發JSP技術,已經將JSP和Java Servlet源碼的最新版本授權給了Apache公司,他們與其他一些公司和個人將開放性的開發一個健壯的Reference implementation(RI),而這個RI是可以被任何公司和個人免費使用的。JSP的應用程序接口(API)已經得到了勿庸置疑的益處,并且將繼續從中受益。而ASP技術由于是微軟產品,所以完全在一個非開放的環境下開放。
|
ASP技術 |
JSP技術 |
Web服務器 |
Microsoft IIS or Personal Web Server |
任何Web服務器,包括Apache, Netscape, 和 IIS |
平臺 |
Microsoft Windows |
大多數的流行平臺,包括Solaris 操作環境, Microsoft Windows, Mac OS, Linux, and 其他 UNIX 平臺實現 |
三、從開發人員角度來看
ASP和JSP技術都可以使開發人員通過使用構件技術將程序邏輯從頁面設計中分離出來。ASP支持COM模型,而JSP支持基于JavaBean技術的構件。
1、跨平臺的復用性
開發人員都將注意力集中在復用性上,而JSP構件(Enterprise JavaBeans,JavaBeans,以及JSP tags)是跨平臺可復用的?;跇嫾哪P图铀倭藨瞄_發的進度,因為它可以使開發人員:
A.使用輕量級的子構件可以快速建立應用原型,然后再整合一些其他的功能;
B.在不同的地方完成部分任務,然后一起封裝在Java Bean或者Enterprise JavaBeans組件。
2.Java的優點
JSP使用Java語言作為腳本語言,而ASP使用微軟的VBScript或者JScript。Java語言是一種成熟的、強大的、可擴展的編程語言,能夠提供比基于Basic的腳本語言更多的好處。Java語言提供了比解釋型的VBScript和JScript語言更加出眾的性能。因為JSP頁面使用了Java技術,并且首先被編譯成為Java Servlet,所以它可以為已知的HTTP應用提供全套的服務器端的JAVA類庫。
Java語言使開發人員的工作在其他方面也變得更加方便。例如:ASP應用在Windows NT 系統上易于崩潰,而JSP卻可以防止這點。Java語言通過提供防止內存泄漏和指針錯誤的保護措施來幫助管理內存。而且,JSP提供強壯的例外處理,這對于現實的應用是必要的。
3.更易于維護
使用JSP技術的應用比基于ASP的應用更易于長時間的維護。
a.腳本語言對于小的應用來說是很好的,但它很難管理巨大的、復雜應用。因為Java語言是結構化的,所以用它可以很簡單的建造和維護大型的模塊應用。
b.JSP技術更加強調構件而不是腳本,這樣便于修改內容而不必改變邏輯,或者修改邏輯而不必擔心對于內容有所影響。
c.Enterprise JavaBeans結構封裝了企業級的邏輯,比如訪問數據庫,安全,以及事務,它將企業級的邏輯和應用本身分離開。
d.由于JSP技術是一種開放的、跨平臺的體系結構,所以Web服務器、平臺以及其他的構件可以很容易的升級或者轉換,而不會影響基于JSP的應用。這使得JSP更加適合現實中日新月異的Web應用。
|
ASP技術 |
JSP技術 |
復用的跨平臺構件 |
無 |
Java Beans,Enterprise JavaBeans,custom JSP tags |
針對系統崩潰的安全性 |
無 |
有 |
內存泄漏保護 |
無 |
有 |
腳本語言 |
VBScript,Jscript |
Java |
四、在企業級的可用性
Java 2 Platform,Enterprise Edition(J2EE)是一種用來實現復雜的企業級應用的Java體系結構。作為J2EE的一部分,JSP頁面可以連接到所有的J2EE構件,包括JavaBeans和Enterprise JavaBeans以及Java Servlets。事實上,JSP頁面首先被編譯成Java Servlets,所以它們有Java應用的所有好處。J2EE平臺容器管理復雜的企業級應用,包括事務處理和資源池。
JSP頁面可以連接所有標準的J2EE服務,包括:
1.Java Naming and Directory InterfaceTM API
2.JDBCTM API
3.JavaMailTM
4.JavaTM Message Service (JMS)
最后,因為JSP技術是通過Java Community Process開發的,所以它獲得了從工具、web服務器以及應用服務商方面的廣泛支持。所以,用戶和合作伙伴可以采取最佳方法,選擇對于他們的特定應用最為適合的工具,來保證他們在編碼和人員培訓上的投資。
|
ASP技術 |
JSP技術 |
與數據庫匹配 |
有(COM) |
有(JDBC API) |
與數據源的整合 |
ODBC |
JDBC |
構件 |
COM構件 |
Java Beans,Enterprise JavaBeans,extensible JSP tags |
可擴展的工具支持 |
有 |
有 |
第二章 如何將ASP轉換成為JSP
下面我們將通過ASP和JSP語法和對象之間的比較來說明,從ASP到JSP之間的轉換是可以實現的。
隱含對象
Application Object: 在所有用戶間分享當前應用信息。
<% Dim ls_write
For Each Key in Application.Contents
ls_write = Key + ":"+Application(Key)
Next
%>
|
Config Object: 存儲servlet的配置信息,但是很少使用。
功能 |
ASP |
JSP |
對象名稱 |
ASP沒有類似對象 |
config |
對象類型 |
N/A |
javax.servlet.ServletConfig |
Servlet名稱 |
N/A |
getServletName |
返回servlet初始化參數的名稱 |
N/A |
getInitParameterNames() |
得到初始參數的值 |
N/A |
getInitParameter(String name) |
Error Object: 包含在腳本中發生的任何錯誤信息
功能 |
ASP |
JSP |
對象名稱 |
ASPError |
Exception |
對象類型 |
N/A |
java.lang.Throwable |
特別注意 |
在最新的ASP3.0/IIS5.0對象,可以使用Server.GetLastError方法來獲得ASPError對象 |
只有把頁面定義為error頁面的時候才能夠得到它??梢允褂萌缦侣暶鳎? <%@ page isErrorPage="true" %> |
錯誤消息 |
Description () |
getMessage() |
得到全部錯誤 |
ASPDescription() |
toString() |
錯誤跟蹤 |
N/A |
printStackTrace(out) |
錯誤位置 |
LineColumn |
N/A |
Out: 用來寫和控制從服務器到瀏覽器的輸出緩存
功能 |
ASP |
JSP |
對象名稱 |
Response |
out |
對象類型 |
N/A |
javax.servlet.jsp.JspWriter |
將數據寫入output 緩存中 |
Write variant |
print(object or primitive data type) |
寫二進制數據 |
BinaryWrite data |
必須通過java OutputStream類來使用這個方法。 ServletOutputStream Output = response.getOutputStream();Output.write(Btye[] buffer); |
清空out緩存 |
Clear |
clearBuffer() |
發送當前的緩存到客戶端 |
Flush |
flush() |
停止處理當前頁面 |
End |
close() 這與end不同,它關閉了當前的輸出流,而JSP頁面仍然將完成它的處理 |
Request Object: 從客戶端(瀏覽器)接受信息。
功能 |
ASP |
JSP |
對象名稱 |
Request |
request |
對象類型 |
N/A |
是javax.servlet.ServletRequest的子類 通常是javax.servlet.HttpServletRequest |
Cookie細節 |
Cookies(cookie)[(key).attribute] |
cookie[]=getCookies() |
獲取表格數據 |
string = Form(element)[(index)]For example:mydata= Request.Form("date") |
string = getParameter(Name)Enum = getParameterNames()string[]= getParameterValues(name)For example:ls_form = request.getParameter("date"); |
獲取查詢數據 |
QueryString(element)[(index)|.Count] |
getParameter(Name)getQueryString() (entire query string) |
由客戶端發送的HTTP頭 |
ServerVariables (server environment var)For example: ServerVariables (ALL_RAW) returns to you all the headers in raw format |
getHeaderNames()getHeader(name)getHeaders(name)getIntHeader(name)getDateHeader(name) |
Response Object:發送信息到瀏覽器。ASP和JSP對待response對象有一些不同。ASP只使用Response對象來控制到瀏覽器的輸出。JSP將這個功能分離到兩個對象中。在JSP中Response是被發送到客戶端的實際對象。JSP也使用out對象來實現向輸出緩存寫功能。
功能 |
ASP |
JSP |
對象名稱 |
Response |
response |
對象類型 |
N/A |
是javax.servlet.ServletResponse的子類,通常用:javax.servlet.HttpServletResponse |
緩存頁面輸出 |
Buffer = True/False |
JSP的頁面緩存通常為8K??梢栽O置緩存大小,下面的例子是關閉緩存 <%@ page buffer= "none" %> |
啟用/不啟用代理服務器緩存 |
CacheControl =Private/Public |
setHeader("Pragma","no-cache")setHeader("Cache-Control","no-cache") |
添加Cookie |
Cookies(cookie)[(key).attribute] = value |
addCookie(cookie) |
添加Http頭 |
AddHeader Name,Value |
setHeader(Name,Value) |
使客戶端連接到另外一個頁面 |
Redirect URL |
sendRedirect(Absolute URL) |
發送錯誤信息到客戶端 |
N/A |
sendError(int code,String msg) |
設置輸出MIME類型 |
ContentType = "MIME TYPE" |
setContentType("MIME TYPE") |
Server Object: 提供到服務器端的方法和屬性的連接。
功能 |
ASP |
JSP |
對象名稱 |
Server |
JSP沒有服務器對象,在ASP Server對象中的功能已經被分配到了別的頁面中 |
對象類型 |
N/A |
N/A |
在服務器端創建一個對象 |
CreateObject(Object id) |
N/A |
對一個String進行HTML編碼 |
HTMLEncode(String) |
N/A |
通過絕對路徑尋找文件 |
MapPath( Path ) |
N/A |
對URL進行編碼 |
URLEncode(String) |
N/A |
設置超時 |
ScriptTimeout = Seconds |
N/A |
Session Object:為一個用戶在多頁面間共享信息。
功能 |
ASP |
JSP |
對象名稱 |
Session |
session |
對象類型 |
N/A |
javax.servlet.http.HttpSession |
注意 |
ASP通過使用cookie使用session |
JSP有兩種session管理方法: 1.使用cookie 2.使用URL重寫 |
關閉session并釋放其資源 |
Abandon |
invalidate() |
存儲一個session變量 |
Session (String name) ="Your Data" |
setAttribute(String name,Object object)* |
存儲一個session對象 |
Set Session (String name) = Server.CreateObject(String name) |
同上 |
獲取一個session變量 |
My_Variable = Session(String name) |
getAttribute (String name)* |
|
| |
獲取一個session對象 |
Set My_Object = Session(String name) |
同上 |
刪除一個session的對象或變量 |
Contents.Remove(String name) |
removeAttribute(String name) |
收集內容 |
Contents |
getAttributeNames() |
Session ID |
SessionID |
string =getId() |
設置超時 |
Timeout(Minutes) |
setMaxInactiveInterval(int interval in seconds) |
得到超時設置 |
N/A |
int =getMaxInactiveInterval() |
禁用session |
<%@ EnableSessionState = False%> |
<%@ page session="false"%> |
腳本
腳本聲明:怎么將服務器端的腳本從客戶端的腳本中分離開。
ASP |
JSP |
<% Your Server Side Script %> |
<% Your Server Side Script %> |
表達式:將數據直接送到輸出緩存中。
ASP |
JSP |
<%= Your_Variable %> |
<%= Your_Variable %> |
申明:申明變量和方法,使他們可以在本頁面內使用。
ASP |
JSP |
<% Your Function %> |
<%!Your Function %> |
標識:告訴容器怎樣處理這個頁面,
ASP |
JSP |
<%@ Your Directive %> |
<%@ Your Directive %> |
例如設置腳本語言: <%@ LANGUAGE="VBSCRIPT" %> 再如: <%response.buffer=true%> |
標識發送信息給容器 標識不向輸出緩存發送信息 當JSP頁面初始化時,標識被處理 例如設置腳本語言: <%@ page language= "java"%> 再如: <%@ pagebuffer="64k"autoFlush= "true"%> |
腳本注釋:
注釋類型 |
ASP |
JSP |
一般注釋 |
<% 'Your Comment %> |
Java的注釋: <%//my comment %> 或<% /* my comment */ %> |
特定注釋 |
N/A |
JSP的注釋: <%-- your comment --%> 這類注釋不在容器中處理,也不放入servlet中 |
引入文件
引入:在頁面沒有處理前,引入文件
ASP |
JSP |
<!--#include file="Your File.asp" --> <!--#include virtual ="/Your File.asp"--> |
<%@ include file="Your File" %> <jsp:directive.include file="Your File" %> |
轉文件
ASP |
JSP |
response.redirect("to_File.asp") |
response.sendRedirect("to_File.asp") |
第三章 JSP以及ASP對于相同動態頁面處理的實例分析文檔
一、目的:
通過Asp以及JSP對于相同功能處理的比較,研究和實現從ASP到JSP的轉換。從實際應用考慮,我們選取了與數據庫相關的一些有代表性的功能,包括三個具體功能:查詢、添加以及刪除。
二、頁面功能介紹:
1. 數據庫名稱以及表名稱(共用)
database name:pdtdb
table name:pdtinfotable
|
所用表結構(共用)
create table pdtinfotable
(
ID char(20) not null,
ProductName char(20) ,
primary key(ID)
)
|
2.各頁面功能說明
第一個index,addaction用2個頁面:
index: select * from table
submit insert value(ID, ProductName) go to "addaction"
addaction: get parameter: "ID" and "ProductName";
Do the "insert function " go back "index"
|
第二個search用1個頁面 :
select * from table where ID= parameter "ID" or ProductName= paramenter "ProductName"
submit "ID" and "ProductName"
|
第三個delete,deleteaction用2個頁面:
delete: select * from table
|
每個行后面又一個超鏈接(鏈到deleteaction).
deleteaction: delete from pdtinfo where ID= parameter "ID" ,go back "delete"
|
3.JavaBean
使用 tax.mydb.class
三、代碼詳細比較:
index:
strConnection = "DSN=pdtdb;Database=pdtdb;"
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.Open strConnection
Set objRS=Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection=objConn
|
addaction
strConnection = "DSN=pdtdb;Database=pdtdb;"
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.Open strConnection
Set objRS=Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection=objConn
|
search:
strConnection = "DSN=pdtdb;Database=pdtdb;"
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.Open strConnection
Set objRS=Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection=objConn |
delete
strConnection = "DSN=pdtdb;Database=pdtdb;"
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.Open strConnection
Set objRS=Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection=objConn
|
deleteaction
strConnection = "DSN=pdtdb;Database=pdtdb;"
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.Open strConnection
Set objRS=Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection=objConn
|
(注釋:JavaBean請參加tax.mdb.java文檔)
作者簡介
張陽,清華大學電機工程與應用電子技術系98級學生,2001年參加Ogilvy公司在亞太地區的Pond's網站建設,2003年初加入IBM作為實習生至今,主要負責WASE的技術支持工作??梢酝ㄟ^ sunning_chang@hotmail.com與張陽聯系。
趙礴是北京大學計算機科學與技術系99級學生,于2002年作為實習生加入北大與貝爾聯合實驗室,參與了“PKU-AS”(863項目) 項目,它是一個J2EE的應用服務器,實現了微內核體系結構 ,支持平臺的動態體系機構和在線演化功能。他是部署工具和CMP(container managed persistence)的主要研發人員。曾任計算機系學生會主席?,F在IBM中國有限公司作實習生??梢酝ㄟ^ zhaobopku@yahoo.com.cn與 趙礴 聯系