您的位置:寻梦网首页编程乐园Java天地JSP 专辑JSP001 HTML 离线版
Java 天地
JSP001 HTML 离线版
精选文章 >> 与其他语言的比较 >> Java Server Pages for the ASP Developer

由 webmaster 发布于: 2001-01-20 16:07

Wink

(编者按:以下文章由Blueski翻译整理自www.asptoday.com/articles/19991022.htm

其实小龙亭里对jsp-asp进行比较的已经有2篇文章,翻译完后过去一看,哇,和第2篇完全一样。只是我这里比较忠于原文,并附带了实例,而清风的那篇比较简洁一些。我之所以翻译这篇文章,是觉得这里还是比较特殊一些,我很难说究竟特别在哪里,也许它是专门为asp开发者写的,让他们关注一下jsp? 或者是因为有些高瞻远曙,认识较深?或者表达比较简洁明了?或者是我的错觉?等等)

JSP (Java Server Pages)类似于ASP,区别在于在 <% 和 %> 标记之间的分别是Java和VB脚本。
根据Sun Microsystems说法,JSP在85%以上web服务器包括Apache WebServer, NetscapeTM,
和Microsoft IIS 4.0 (用IBM's WebSphere, LiveSoftware's JRun或New Atlanta's ServletExec的插件)。
由于很多ASP开发者正转向JSP,激烈竞争已经开始。


结构

和ASP一样, JSP将内容和服务器端代码分离开了。当服务器处理JSP时,该jsp被转化为servlets,从而成为服务器端的java程序,并能支持HTTP协议,包括requests和responses. 当JSP转为servlet,整个文件被转为纯Java - <% 和%> 消失了,HTML和JavaScript以out stream方式发送到客户浏览器:

JSP: %><INPUT TYPE="button" NAME="Go" value="Today"><%
Servlet: out.println("<INPUT TYPE=\"button\" NAME=\"Go\" value=\"Today\">");

JSP诞生前,servlet开发人员不得不忍受将HTML和JavaScript用out.print编写的痛苦。 当用户并发请求jsp时,
application的线程被实例化并对request进行处理。这些线程由Web Server管理和处理,并可与ASP.dll为ASP系统中创建的现成比美。这比CGI有高得多的效率。cgi要为每个用户创建一个完整的进程。


性能 vs. 多平台独立性


Java同C++ 和VB相比时十分缓慢,但可以跨越平台,而不需要重新编译。java的“编译”代码还要在运行时经过操作系统的Java虚拟机
(JVM)解释执行。但节省了开发人员的精力。当面对GUI程序时(servlets还不支持Java GUI)相当缓慢。

Servlets比普通Java程序快速(applets, stand-alone apps),因为它们在服务器上运行,并且不必负载GUI interface
(HTML GUI则比较轻一些)。而且,servlet代码只当客户有请求时才运作,第一次可能较慢,但以后它可以缓存在服务器内存中。
虽然JSP似乎比ASP优越,因为在处理时对每一个请求asp需要重新解释执行,但实际上由于JVM的关系,两者在主要处理速度上仍比较
相近。

Session管理


ASP使用Session对象来管理用户状态信息,它允许服务器保存对用户的跟踪来实现这一点。
JSP则通过HttpSession对象来维护session。Session信息在服务器上保存, session ID号则保存在用户机器上的cookie中。
如果cookies被禁用,那么session ID只能放在URL字串中了。

Sessions通常由server取胜设置为30分钟过期。
从session对象存储和取回Items最初不能是(int, double)类型而且此后还要改回到它们的 (Integer, Double)类型。

HttpSession session=request.getSession(); //get session object or create one
session.getId() //get the session ID number
Integer item = (Integer) session.getValue("item") // retrieve Integer object
session.putValue("ItemValue", itemName); // ItemValue must not be primitive

Application管理


有时server在客户使用相同的Application对象时需要维护site-wide application变量。 JSP使用的是ServletContext对象,
如:
getServletContext().setAttribute("Item", ItemValue); //to set an application variable
Integer i=(Integer)getServletContext().getAttribute("ItemName"); //get item

Server Side Includes
Server Side Includes (SSI)是另一个相似处。
ASP: <!-- #include file = "myfile.asp"-->
JSP: <%@ include file = "myfile.jsp" -->

JSP-Specific Language
JSP在转化为servlet时指示server做一些事情,指令( @)标志放在JSP文件顶部。
如:
include -
<%@ include file="hello.jsp" %>
import - 导入一个包
<%@ import = "java.util.*" %>
extends - servlet从某个class得到扩展 (它的超类)
<%@ extends = "java.util.Dictionary" %>
implements - servlet使用一个interface
<%@ implements = "java.util.Enumeration" %>
content_type -
<%@ content_type = "text/plain" %>
或者
<%@ content_type = "text/html" %>

Java环境


ASP使用脚本语言(VBScript, Jscript)来处理服务器端程序。 JSP使用纯Java,并从其面向对象特性中得益。
Java最好在纯Java 环境的,并带有一个可视化工具和调试器的IDE中得到开发。
介入HTML和其它指令会使问题复杂化。这也是JSP产生的原因。

Java组件: JavaBeans


JavaBeans是Java组件,JavaBeans+JSP可以和COM+ASP比美。 COM对象常用于商务逻辑和后台计算等,这比脚本语言更快更合理。
JavaBeans只在Java程序中使用,COM对象可在任何支持标准对象模型语言中使用。 (包括Visual J++).
另一方面,JavaBeans比COM容易开发,只要你懂得Java,并参照JavaBeans的结构来写即可。如果要使用com,还需在服务器上注册。如有修改还需重新注册并重新启动服务器。Beans可以管理database connections,这样可以避免在文件中带入用户名和密码。

JavaBeans有一个结构对象模型:有一个 public constructor,可设置它的属性properties,要使用setProperty标记来修改属性。而Bean需要一个 setXXXX 内部方法, XXXX 是属性的名字。


这里是一个使用了bean的JSP:

<HTML><HEAD<TITLE>Coffee</TITLE></HEAD>
<BODY>
<jsp:useBean id="Cindy" class="Coffee" />
<jsp:setProperty name="Cindy" property="Flavor" Value="RaspberryMocha"/>

I like <%= Cindy.getFlavor() %> coffee.
</BODY>
</HTML>

//The Coffee Bean:
Public class Coffee
{ private String m_flavor;

public Coffee()
{ m_flavor = "Regular"; }

public void setFlavor(String flavor)
{ m_flavor = flavor; }

public String getFlavor()
{ return m_flavor; }
}

JSP和数据库


ASP使用ODBC和ADO, Java使用JDBC (Java Database Connectivity)来连接数据库。
目标数据库需要一个JDBC driver - 一个database-Java接口。 JDBC并不需要服务器来创建数据源,
有一个独立的JDBC driver就已经足够。

如果某个数据库只有ODBC drivers,还可以使用JDBC和ODBC桥。此时要求ODBC数据源已在服务器上建好。
Sun提供了JDBC-ODBC桥,但同时要有其免费的Java编译器。理论上说它可以和大多数有ODBC drivers的数据库一起工作。
但实际上只对Oracle, Sybase, Microsoft SQL Server, 和Microsoft Access等通常的数据库进行过测试。
这个FAQ例子使用了Microsoft Access 2000,文章最后有完整的代码:

public class FAQ
{
// Member Variables
private String m_DBLoc = "jdbc:odbc:FAQ";// the System DSN is called
// "FAQ" and points to "FAQ.mdb"
private String m_DBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
private ResultSet m_RS = null; // RecordSet Variable
private Connection m_conn = null;

//-------------------------------------------------------
// Method executeQuery -- for executing queries. Returns
// a ResultSet (RecordSet) kind of like in ADO
//-------------------------------------------------------
public ResultSet executeQuery(String stmt)
{
if(m_conn == null) // if Connection has not been set
m_RS = null;
else
{ try {
Statement s = m_conn.createStatement();
m_RS = s.executeQuery(stmt);
}
catch (SQLException e) {} // if a SQL error occurs
}
return(m_RS);
}

//-----------------------------------------------------
// Method DBConnect -- must connect to the DB before a
// query can be executed. Returns an error message
// to be printed by the caller if there is an error.
//-----------------------------------------------------
public String DBConnect()
{
String retVal = ""; // there are no errors yet
Connection conn = null;
try // try to connect to the database
{ Class.forName(m_DBDriver);
m_conn = DriverManager.getConnection(m_DBLoc);
}
// if the driver class isn't found
catch (ClassNotFoundException e) {retVal = e.toString();}
catch (SQLException e) {retVal = e.toString();} // if a SQL error occurs

return(retVal); // returns error messages or an empty string
// that the caller must print.
}
这一JavaBean例子连接了FAQ.mdb。JSP可以将此FAQ Bean,实例化,浏览和打印结果等等-- FAQ.jsp
<html>
<body>
<H3>Frequently Asked Questions About Cats</H3>
<b>Category: <%= m_Category%><b><p>
<% out.println(b_FAQ.DBConnect());
RS = FAQBean.executeQuery("SELECT Question, Answer FROM QA WHERE Category = '" + m_Category + "'");

if(RS == null)
out.println("<P>There are no FAQ entries for "+ m_Category +</P>");
else
{ count=1;
while (RS.next())
{ out.println("<TABLE BORDER=0><TR BGCOLOR=#D9D9F3><TD><B><OL>");
out.println("<LI><A NAME=\"#"+count+"\"></A>");
out.println(RS.getString("Question"));
out.println("</TD></TR></TABLE></OL></B>");
out.println(RS.getString("Answer") + "<p>");
count++;
}
}
%>
</BODY>
</HTML>

结论

就象当年Java语言面世一样,年轻的JSP的出现也给Web开发世界带来了新的光芒。JSP借鉴了ASP的模型,将内容的编码分离,如sessions, application变量和server-side-includes.JSP使用了强大的Java语言,比ASP有更多的选择机会。 JSP可以跨平台,虽然在象ChiliSoft之类的插件帮助下ASP也可以在其它平台上运行,但要求COM对象要么用Java编写,要么在本机重新编译。JavaBean比COM更容易开发与在多服务器上发布并且不需重新编译。

ASP开发者使用了基于Windows的环境,目前可能仍想停留于IIS/ASP结构,因为ASP成熟而稳定,但你很需要关注一下JSP因为它潜在的无穷的发展。在Unix上的Web开发者已经可以使用jsp并达到ASP一样的高效率。


所有时间均为: 北京时间   



资料来源: JSP001.com