第一章 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)是跨平台可复用的。基于构件的模型加速了应用开发的进度,因为它可以使开发人员:
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。可以设置缓存大小,下面的例子是关闭缓存 <%@ 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)的主要研发人员。曾任计算机系学生会主席。现在IBM中国有限公司作实习生。可以通过 zhaobopku@yahoo.com.cn与 赵礴 联系