郝兴伟
山东大学计算机科学与技术学院
hxw@sdu.edu.cn
第六章 服务端开发
目 录
6.3 Servlet与三层体系结构
6.4 JavaBeans组件
6.5 JSP技术
6.6 ASP,JSP,PHP技术比较
6.7 Java开发工具简介
6.3 Servlet与三层体系结构
Servlet是专门为在 Web服务器机器上运行而设计的 Java 程序,
它可以动态地扩展服务器的能力,并采用请求-响应模式提
供 Web服务。 Servlet可以在支持 Java的任何 Web服务器上运行。
对于本身并不支持 Java可执行程序的 Web服务器,可以添加
servlet的运行时环境软件(通常称为 servlet引擎)。
6.3.1 Servlet与 CGI
CGI是 Common Gateway Interface的缩写,是公用网关接口。是
运行在 Web服务器上的可执行程序,用于扩展 html的功能。
因为,HTML语言的功能是比较贫乏的,难以完成诸如访问
数据库等一类的操作,而实际的情况则是经常需要先对数据
库进行操作(比如文件检索系统),然后把访问的结果动态
地显示在主页上。这就是使用 CGI程序的目的。
Java Servlet与 CGI程序一样,最适合充当连接前端 Web请求与
后端数据资源的中间层组件。使用 Java Servlet可以以更高的
效率和可移植性来实现 CGI的目的
6.3.2 三层体系结构
1,C/S两层结构
2,B/S三层结构
1,C/S两层结构
客户机 /服务器( C/S) 计算模式是一种典型的两层模型,两层模型当时曾
经具有创新意义,因为它将一些计算任务从主处理器上卸载到灵巧的客
户机。常规的基于 LAN 的数据库应用程序就是一个例子,其中数据库管
理器服务器软件驻留在一个专用的服务器机器上,而用户则通过他们的
工作站上的客户机代码(用户程序)来访问数据库。
缺点,
胖客户、维护麻烦
2,B/S三层结构
一个三层结构模型通常包括,
( 1)一个 Web 浏览器作为客
户层。 Web 浏览器由于有可能
成为一种真正的通用客户机,
使它从观念上取代了两层结构
的, 胖客户机, 。
( 2)如果浏览器作为 Web 应
用程序体系结构的标准瘦客户
机获得认可,那么以前驻留在
两层模型的胖客户机中的功能
会怎么样呢?现在,应用程序
专用的功能并不移植回服务器
(例如数据库服务器),而是
有意将它驻留在一个新的中间
层上。
6.3.3 Servlet编程
中间层的出现,使得 Web编程向服务器端发展。由传统的 CGI编
程向 Servlet 技术的转移说明三层模型正在增强。
Java Servlet的出现,为应用程序员使用 Java来创建 Web应用
程序开辟了新的途径。但是,Servlet只是工作在 Web服务器上
的一个连接客户请求和数据库系统的中间层,仅有 Servlet还
不能为真正的企业计算提供完整的模型。
1,编写 Servlet所需要的开发环境
进行 Servlet开发所需要的基本环境是,
( 1) JSDK( Java Servlet Development Kit)
JSDK包含了编译 Servlet应用程序所需要的 Java类库以及相关
的文档。
--利用 Java 1.1进行开发的用户,必须安装 JSDK。
-- Java 1.2或以上版本,已经集成了 JSDK,不需要单独安装
( 2)一个支持 Servlet的 Web服务器,如 Tomcat。
Tomcat是 Servlet 2.2和 JSP 1.1规范的官方参考实现
2,Servlet的开发过程
Servlet不是一个真正意义上的完整的独立的 Java程序,因为
他没有 main() 函数。他只是运行在 Web服务器上的一个负责
用户和数据层之间转换的接口,它是用 Java编写的类。并且所
有的 Servlet都必须继承基本的 Servlet类,定义请求处理的方
法。
Servlet编程要求必须要掌握 Java程序设计语言,还要对面向
对象有所了解。 Java语言程序设计主要是对 Java类库的使用,
同样,掌握 Servlet编程需要熟练使用 Sun公司的 JSDK。
( 1)编写 Servlet代码
Java Servlet API是一个标准的 Java扩展程序包,包含两个
Package∶javax.servlet 和 javax.servlet.http。 对于想开发
基于客户自定义协议的开发者,应该使用 javax.servlet包中
的类与界面;对于仅利用 HTTP协议与客户端进行交互的开发者,
则只需要使用 javax.servlet.http包中的类与界面进行开发即
可。
Servlet的基本结构
import java.io.*;
import javax.servlet.*; overriding父类的 doGet方法
import javax.servlet.http.*;
public class SomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException
{
// 使用, request”读取和请求有关的信息(比如
Cookies) 和表单数据
// 使用, response”指定 HTTP应答状态代码和应答

// (比如指定内容类型,设置 Cookie)
// 使用 "out"把应答内容发送到浏览器
PrintWriter out = response.getWriter();
}
[例 6-10]
一个简单的 servlet代码示例( HelloServlet.java)
package test;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet
{
public void doGet(HttpServletRequest
request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
代码续
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<center><h1>Hello,Servlet!</h1></cente
r>");
out.println("</body></html>");
}
}
该 servlet实现如下功能 ∶ 当用户通过浏览器访问该
servlet时,该 servlet向客户端浏览器返回一个 HTML页面,
显示 Hello Servlet!。
( 2)编译 Servlet代码
利用 JDK 1.4.2 对 Servlet代码进行编译,其命令行为,
d:\MyJSP> javac HelloServlet.java
执行上述编译命令,提示 javax.servlet包不存在。
表明在 classpath路径中缺少一个解析 servlet类的包。
在 tomcat5.0中,需要将 tomcat5.0\common\lib目录下的
servlet-api.jar添加到 classpath中。
具体方法是,
复制 servlet-api.jar文件,拷贝到
C:\j2sdk1.4.2_03\jre\lib\ext中,再次编译,在
D:\MyJSP下生成 MyServlet.class文件,编译成功。
( 3)运行 Servlet
--配置运行环境
--在浏览器中运行
http://127.0.0.1:8080/myservlet/servlet/test.HelloS
ervlet,打开浏览器
-- 在 html的 form中调用
<html>
<head>
<title>Java Servlets Sample</title>
</head>
<body>
<form method="get" action="test.HelloServlet">
<input name="test" type="submit" value="Test
HelloServlet">
</body>
</html>
运行结果
6.4 JavaBeans组件
JavaBean组件是一种开发软件组件的技术,软件组件技术可以
把软件功能作为一个组件来组装成一个应用程序。在 Java中,
Bean是一些 Java 类,可在一个可视的构建器( builder) 工具
中操作它们,并且可以将它们一起编写到应用程序中。任何
具有某种特性和事件接口约定的 Java类都可以是一个 Bean。 通
过将一个满足某些准则的 Java类变成为 Java bean,可以有效的
实施软件重用。
由于 Servlet的复杂性,目前 JavaBean和 JSP技术已经成为 Web
应用服务器(三层结构中的中间层业务逻辑)开发的主要工
具。
6.4.1 JavaBean的属性、方法和事件
一个 JavaBean和一个 Java Applet类似,是一个遵循某些规则的
Java类,每个 JavaBean的功能可能不同,一般都遵循以下特征,
( 1)支持自检,这样构造器( buileder) 可以分析 bean是如何
动作的。
( 2)支持定制,用户可以通过应用程序构造器工具定制 bean
的外观和行为
( 3)支持事件,保证 bean和外部的通信
( 4)支持属性,使得 bean真正的具有内部状态,从而根据应
用需要定制。
( 5)支持持久性,这样 bean才能在应用程序构造器中工具中
定制,并将定制的状态存储器来以便以后使用。
1,方法
1,方法
JavaBean归根到底是一个 Java类,所有的 public方法都可以通
过对象外部直接调用。
2,属性
JavaBean属性描述了 bean的内部状态,是 JavaBean中的数据部
分,属性的值可以通过适当的 bean方法进行读写。
JavaBean有四种类型的属性,分别是,
单值属性,
索引属性,
关联属性
限制属性。
( 1)单值属性
单值属性是 JavaBean中最简单的属性,只需要定义一个包含一
个值得数据成员,并为其定义一对设置( set) /获取( get) 属
性的方法,以便于外部与其发生联系。如果没有为单值属性
提供设置器方法,则该属性为只读型属性;如果没有为单值
属性提供获取器方法,则该属性为只写型属性。
单值属性设置器 /获取器定义的一般形式是,
public void set<PropertyName>(<PropertyType> propertyValue)
// 设置器
public <PropertyType> get<PropertyName>() // 拾取器
( 2)索引属性
索引属性类似于 Java中的数组,包括若干个数据类型相同的元
素,可以通过整数索引值访问其中的属性,因此称索引属性。
( 3)关联属性
JavaBean API除了支持单值属性和索引属性外,还提供了一些属
性用于增强 JavaBean的属性管理功能。如关联属性,当修改这类
属性时,将发送一个通知给其他元素(如,Applet,application或
其他 JavaBean),如果与该 JavaBean中的某个属性相关联,就会
注册该属性。因此,只要这个关联属性发生变化,就会有一个通
知发送给这些相关部件。这些属性称为关联属性,他们的值发生
改变与外部部件有关,外部部件称为监听器。
一个有关联属性的 JavaBean需要支持如下一对事件监听器的注册
方法,
public void addPropertyChangeListner(PropertyChangeListner1)
public void removePropertyChangeListner(PropertyChangeListner1)
( 4)限制属性
JavaBean API中的另一种高级属性类型是限制( constrained) 属性,
它可以使外部部件在接受属性的修改值之前先确认修改值。也就
是说,当需要修改一个限制属性值时,接受属性的外部部件首先
要件检查这个属性的合理性再决定是否接受修改。
3,事件
JavaBean和其他软件组件交流信息的主要手段是发送和接受事件。
事件的监听原理是:首先事件源必须对需要发送的事件进行注册,
然后注册事件监听器,并说明该事件源所发生的事件向什么组件
发送,也就是说,在事件源组件中实现方法并在监听组件中注册
该事件源。
[例 6-11]
首先在 D盘上创建一个目录 d:\MyJavaBean。 然后到
%Tomcat5%\conf\Catalina\localhost下,新建一个文件
myjavabeans.xml。 输入如下内容,
<Context path="/myjavabeans" docBase="d:\MyJavaBean\"
debug="0" reloadable="true" privileged="true"/>
这样,就可以在浏览器的地址栏中输入:
http://127.0.0.1:8080/myjavabeans/文件,jsp访问一个 jsp文档了。
一个 NameCard的 JavaBean代码如下(文件名 NameCard.java),
代码 1
package cards;
public class NameCard
{ String Name,Address;
public NameCard()
{
this.Name="John";
this.Address="No,Road,City,Country";
}
public void setName(String myName)
{
this.Name = myName;
}
public String getName()
{
return (this.Name);
}
代码 2
public void setAddress (String myAddress)
{
this.Address = myAddress;
}
public String getAddress ()
{
return (this.Address);
}
}
使用 JavaBean
将文件保存在 d:\MyJavaBean中,用 javac NameCard.java编译生成
NameCard.class。
可以在 bean类中临时增加 main方法是为了测试程序用的,写
JavaBean可以先不必加入到 Jsp程序中调用,而直接用 main()方法
来调试 bean,调试好以后就可以在 Jsp程序中调用了。
6.4.2 在 JSP中使用 JavaBeans
如果在 JSP网页中使用 JavaBean,可以通过 <jsp:useBean>标记完成,
一般形式是,
<jsp:useBean
id="Id " class="yourClass "
scope="page | request | session | application"
/>
其中,Id对应于一个类的实例,如果这个实例已经存在,将直接
引用这个实例。如果这个实例尚未存在,将通过在 class中的定义
从这个 class创建实例。可以通过 yourId实例来处理并调用
JavaBeans中的属性和方法。 Scope用于定义 id这个实例存在的范
围,事实上这定义了这个实例所绑定的区域及其有效范围。
[例 6-11] 在 jsp文档中调用 Javabean
[例 6-11] 在 jsp文档中调用 Javabean
下面编写一个调用上述 bean的 jsp文档,文件名为 myCard.jsp,内
容如下,
代码
myCard.jsp文件
<html>
<body>
<%@ page language="java" %>
<jsp:useBean id="mycard" scope="application"
class="cards.NameCard"/>
<%
mycard.setName("Hao YY");
mycard.setAddress("Shanda nan lu 27,Jinan,China");
%>
姓名, <%=mycard.getName()%><br>
地址, <%=mycard.getAddress()%><br>
</body>
</html>
6.4.3 Enterprise JavaBeans
1997年 4月 12日,Sun宣布了一项为企业环境开发 Java平台的创新
成果 -- Java 2 Platform,Enterprise Edition (J2EE)。
使用开放式的 Java Community Process,Sun促进了一组标准的
Java扩展的开发,称为 Enterprise Java API。 这些应用程序编程接
口 (API) 为各种各样的中间件的实现提供了不依赖供应商的编程
接口。 Enterprise Java API的要点是 Enterprise JavaBeans API,后者
为 Java应用程序服务器定义了一个服务器端组件模型,以及一个
不依赖供应商的编程接口。
J2EE 中包括技术
J2EE 中包括以下技术,
· Enterprise JavaBeans (EJB) 技术
· Java Interface Definition Language (IDL)
· Java Message Service (JMS) API
· Java Naming and Directory Interface (JNDI)
· Java Remote Method Invocation (RMI) 和 Object Serialization
· Java Servlet API
· Java Transaction API (JTA)
· Java Transaction Service (JTS)
· JavaServer Pages (JSP) 技术
· JDBC 数据库访问 API
6.5 JSP技术
-- 使用 Servlet开发服务端中间层逻辑,太复杂。
为此,Sun公司于 1999年推出 JSP技术。 JSP( Java Server Pages)
是一种 Java 平台技术,主要用于建立带有动态 Web 内容(如
HTML,DHTML 和 XML) 的应用程序。 JSP文档( *.jsp) 就
是在传统的 HTML文档( *.htm,*.html) 中加入 Java脚本程序
( Scriptlet) 和 JSP标记来构成的,相对于 Servlet,他很好的实
现了业务逻辑和 html内容的分离编写。
JSP是一种服务器脚本语言,它包装了 Java Servlet系统界面,
简化了 Java和 Servlet的使用难度。不仅 JSP页面上可以直接书写
Java代码,而且是编译成 Servlet后才能实际运行。当用户浏
览,jsp网页时,首先在服务器端执行,jsp文档中服务端代码,然
后把执行结果传送到客户端浏览器。
6.5.1 JSP的运行和开发环境
JSP的运行和开发环境比较复杂,在服务器端,不仅需要启动
Tomcat,还需要安装 Java环境。
1,运行与开发环境
JSP的开发运行环境很多,可以采用 Unix,Linux,Windows
NT/2000 Server等操作系统,如果希望在服务器上开发
Servlet/EJB/JSP应用程序,应该还要安装以下软件,
( 1)安装 Java环境
( 2)安装 Java VM( JRE),因为 Tomcat5需要 Java VM的支持。
( 3)安装 Tomcat。
( 4) Apache服务器 (根据需要安装)
2,建立一个 JSP程序的测试站点
( 1)建立测试站点的主目录
假设测试站点的主目录是 D:\MyJSP,然后所有的 JSP程序就可
以存储到该目录下,或者建立虚拟目录。
在主目录下,创建一个 index.jsp文件。
( 1)修改 Tomcat的默认设置 -1
在默认情况下,通过 http://127.0.0.1:8080/可以访问 Tomcat默认
的 Web应用。要想通过 http://127.0.0.1来访问这个新的 Web应用,
需要修改 Tomcat的一些设置。要使得 Tomcat指向 D:\MyJSP,需
要修改 C:\Program Files\Apache Software Foundation\Tomcat
5.0\conf下的文件 server.xml。 具体修改包括,
① 将 Tomcat默认的 Web服务将端口号为 8080改为 80。
② 增加新 Web应用的上下文
<Context path="" docBase=" D:\MyJSP " debug="0">
上述使用根目录
修改 Tomcat的默认设置 -2
除此之外, 还可以按照 6.4节的介绍, 和 d:\MyServlet项目及
d:\MyJavaBean项目一样,
在 %Tomcat5%\conf\Catalina\localhost下, 新建一个文件
myjsp.xml。 输入如下内容,
< Context path="/myjsp" docBase="d:\MyJSP\" debug="0"
reloadable="true" privileged="true"/>
这样,就可以在浏览器的地址栏中输入:
http://127.0.0.1:8080/myjsp/文件,jsp访问一个 jsp文档了。
上述使用虚拟目录
修改 Tomcat的默认设置 -3
由于 Tomacat的版本升级很快, 在最新的 Tomcat
修改 Tomcat的默认设置 -3
由于 Tomacat的版本升级很快, 在最新的 Tomcat
( 2)启动 Tomcat
然后在, 开始, 菜单中重新启动 Tomcat,尝试运行用户 Web应
用 。
注意:如果安装了 Apache( 或着 IIS), 在计算机启动时他将
来被启动, 此时需要首先将 Apache Http Server关闭, 然后在
运行 Tomcat。
此时, 启动浏览器, 在地址栏中输入,http://127.0.0.1,就
可以看到 D:\MyJSP中的 index.jsp文件了 。
( 3)运行 jsp程序
如果要运行 D:\MyJSP下面的 jsp文档 1.jsp,在地址栏中输入:
http://127.0.0.1/1.jsp。 注意,必须要输入扩展名,同时要注意
文件名和目录的大小写。
如果建立了虚拟目录,要运行虚拟目录下的文件,输入
http://127.0.0.1/虚拟目录 /文件名,jsp。
6.5.2 JSP的语法结构
-- JSP文档 = html文档中加入 Java脚本程序构成的。
-- Java脚本程序代码用, <%”和,%>” 标记括起来,称为
JSP元素。
-- JSP元素可以分为三种类型,
( 1)脚本元素:脚本元素规范 JSP中所使用的 Java代码
( 2)指令元素:指令元素针对 JSP引擎控制转译后的
Servlet的整个结构;
( 3)动作元素:动作元素主要连接到用到的组件(如
Javabean和 Plugin),另外它还可以控制 JSP引擎的行为。
1,JSP指令
JSP指令是 JSP的引擎。他们不直接产生任何可视的输出,只
是指示引擎如何处理 JSP页面中的内容。
JSP指令由 <%@ …%> 标记,
一般形式是,
<%@ 指令名 属性 1="属性值 " 属性 2="属性值 ",.,属性 n="属性
值 " %>
( 1) page指令
page指令用来定义整个页面的相关属性。该指令的语法和它
所包含的属性如下,
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*},..." ]
[ session="true | false" ]
[ buffer="none | 8kb ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" |
"text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ] %>
page指令参数
· language属性,所使用的脚本语言。
例如,<%@ page language="Java" %>。
· import属性,脚本元素中使用的类,与 Java中的 import声明作用
相同。应是类的全名,或者类所在的包。
例如,
<%@ page import="java.util.Date" %>
<%@ page import="java.io.*" %> ( java.io包中的所在类在本页中
都可以使用)
· session属性,是否使用 session对象。
· buffer属性,对象 out的输出模式。 none为没有缓冲区; 8kb为缓
冲区大小。
· autoFlush属性,缓冲区已满时是否自动清空。当 buffer为 none时
该属性不能为 false。
page指令参数(续)
· isThreadSafe属性,处理对象间的存取是否引入 Thread Safe机制。
如果为 true,则在程序中必须有多线程的程序代码,否则直接实
现 SingleThreadModel机制。
· errorPage属性,设置异常处理网页。
· IsErrorPage属性,当前网页是否是一另一个 JSP网页的异常处理
网页。
· contentType属性,输出到客户端的 MIME类型和字符集。默认的
字符集是 ISO-8859-1。 例如,使用中文字符集,<%@ page
contentType="gb2312" %>
( 2) include指令
这是一个在 JSP网页中包含其他文件的指令。它是在 JSP引擎将它
转译成 Servlet时产生作用的指令。其一般形式如下,
<%@ include file="插入文件的 url" %>
这里要求,被包含进的文件符合 JSP的语法,应是静态文本、指
令元素、脚本元素和动作元素。
2,声明
JSP的声明用于定义页面级的变量,如果代码太多的话,最好
写入一个单独的 Java类中。声明由 <%! … %> 定义。必须通过
分号来结束变量声明,同时任何内容必须是有效的 Java语句,
例如,<%! int i=0; %>。 注意,声明后面的分号不能省略。
3,表达式
在 JSP文档中,可以将表达式的结果直接输出到页面中。一般
形式是,<% =表达式 %>。例如,
<%= i %> ( 输出变量 i的值)
<%= "Hello" %>( 输出字符串常量)
4,代码段 /脚本片段
JSP代码段或脚本片段是嵌在,<% … %>,标记内。当 Web服
务器响应请求时,这种 Java代码就会运行。在脚本片段周围可
能是纯粹的 HTML或 XML代码,在这些地方,代码片段可以使
你创建条件执行代码,或只是调用另外一段代码。
例如,以下的代码组合使用表达式和脚本片段,分别按照 H1、
H2,H3,H4和 H5标题样式,显示字符串“你好”,脚本片段
并不局限于一行源代码中,
<% for (inti=1; i<=4; i++) { %>
<H<%=i%>>你好 </H<%=i%>>
<% } %>
5,注释
在文档中加入 HTML注释,用户可以通过查看页面源代码来看
到这些注释的内容。如果不想让用户看到注释内容,应将其嵌
入到 <%-- … --%>标记对中,
一般形式是,
<%--注释内容 --%>
[ 例 6-12]
编写一个 jsp文档,显示网页的访问次数。
代码 1
首先定义一个统计访问次数的文档,文档名为 mycount.htm,内
容如下,
<%! private int accessCount=0; %>
<table border="0" width="100%" height="60"
bgcolor="#FFFF00">
<tr>
<td width="20%" height="53">主机名:
<%=request.getRemoteHost()%></td>
<td width="20%" height="53">访问次数,<%=++accessCount
%></td>
<td width="60%" height="53">当前时间,<%=new Date()
%></td>
</tr>
</table>
代码 2
定义一个 jsp页面,包含上述文件,输出一个随机数,mypage.jsp
文档内容如下,
<html>
<head>
<title>JSP中的文件包含 </title>
</head>
<body>
<%@ page import="java.util.*"%>
<%! Random RdmNumber=new Random();%>
<%@ include file="mycount.htm"%>
<%
out.println(RdmNumber.nextInt(100)); //输出 100以内的随机整数
%>
</body>
运行
将上述文件保存在 D:/MyJSP文件夹中,打开浏览器,输入
http://127.0.0.1/mypage.jsp可以看到网页的输出结果。
6.5.3 JSP内置对象
内置对象是由开发环境所定义的具有特定功能的对象,用户可
以直接使用。在 JSP脚本段中,你可以访问这些隐含对象来与
JSP网页中的可执行 servlet环境交互。
JSP中主要包含的内置对象有,
( 1) request对象
( 2) response
( 3) out
( 4) session
( 5) application
( 6) config
( 7) pageContext ( 8) page ( 9) exception
( 1) request对象
作用范围为整个页面。通过该对象可以获取客户端的输入信息。
可以得到请求的参数、请求类型( GET,POST,HEAD等)以
及 HTTP headers( cookies,referer等)等信息。这是一个
javax.servlet.HttpServletRequest对象。
常用的方法有,
getCookie(),getHeaders(),getAttribute(),getMethod()、
getParameter()和 getParameterName()等。
例如,要获取一个网页的 userName参数的值,代码如下,
<%
String name=request.getParameter("userName");
out.println(name);
%>
( 2) response对象
,作用范围为整个页面。它的作用是向客户端返回请求。返回
请求信息时,输出流要进行缓存。它是一个
javax.servlet.HttpServletResponse对象。
常用的方法有 addCookie(),addHeader(),sendError()和
sendRedirect()等。
( 3) out对象
,发送响应的输出流,作用是将结果输出到客户端。它最常用
的方法有两个,print()和 println()。 输出换行符使用 newLine()方
法。
例如:不用表达式,可以直接访隐含对象 out来输出信息。
<% out.println("Hello"); %>
( 4) session对象
,作用范围为会话期间。 Session对象是 JSP为每一个会话而建立
的个人对象,可以存储及提供个别用户独享的永久或半永久信
息。它是一个与 request相关的 javax.servlet.http.HttpServletSession
对象
所谓会话( session),是指一个用户和 Web服务器之间的一次链
接。当用户使用浏览器登录到 Web服务器、并初次浏览一个 JSP
应用的某个网页开始、直到用户超时未继续浏览该 JSP网页为止,
之间的浏览操作算作一次会话( Session)。
( 5) application对象
该对象可存储并提供给一组 JSP应用所有用户的共享信息,有效
范围为构成该 JSP应用的所有 JSP页面。一般情况下,可以将
Application对象作为一个存储许多共用对象的容器,这是一个
javax.servlet.ServletContext对象。可通过 getServletConfig()、
getContext()方法获得。
( 6)其他对象
( 6) config,用于传递在 Servlet程序初始化时所需的信息。
( 7) pageContext,该对象提供了对页面上的所有对象以及命名
空间的访问,用于管理网页属性。
( 8) page,当前页面,相当于 Java中的 this。
( 9) exception,错误处理对象,用于处理捕捉到的异常。
[ 例 6-13]
编写一个 jsp文档,完成一个登录界面,输入用户名和密码,如
果输入 guest则转移到一个默认的首页,如果不输入用户名,则
重新回到该页,直到输入正确的用户名和密码,此时重定向到
合法的网页。
代码 1
文档(文档名 login.jsp),具体内容如下,
<!-- login.jsp -->
<html>
<head>
<title>login</title>
</head>
<body>
<%
String userName = request.getParameter("userName");
if (userName!=null) {
if (userName.equals("guest"))
response.sendRedirect("http://www.sdu.edu.cn/");
else
response.sendRedirect("http://gsl.sdu.edu.cn/");
}
%>
代码 2
<div align="center">
<center>
<table border="0" cellpadding="0" width="100%" height="100%">
<tr>
<td width="100%">
<table border=2 width=300 align=center>
<form action="login.jsp" method="GET">
<tr height=50>
<td align=center style="font-size:20">用户登录 </td>
</tr>
<tr><td >用户名 <input type=text
name=userName></td></tr>
<tr><td style="font-size:16">密 码 <input type=text
name=userPassword></td></tr>
<tr><td ><input type="submit" value=登录 ></td></tr>
</form>
代码 3
</table>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
运行
将文件保存到 D:\MyJSP文件夹中,在浏览器地址栏中输入:
http://127.0.0.1/login.jsp,执行结果如图 6-8所示。
解释
执行该程序时,如果是第一次执行,服务器首先对它进行转换、
编译形成字节码文件,接着运行该文件。第一次执行该文档时,
用户名空,不执行开始处的 Java代码段,此时输入用户名和密
码,单击“登录”按钮,提交。由于表单的 action属性为
login.jsp,此时再次执行该文档。这样,直到输入一个合法的
用户名和密码,然后将网页重定向到其他网页,否则,总是显
示该网页。
[例 6- 14]
编写一个 jsp代码,显示在线人数
代码 1
首先编写一个统计会话人数的 java类,代码内容如下(文档名
SessionCounter.java),
package SessionCount;
import javax.servlet.*;
import javax.servlet.http.*;
public class SessionCounter implements HttpSessionListener
{
private static int activeSessions = 0;
public void sessionCreated(HttpSessionEvent se)
{
activeSessions++;
}
代码 2
public void sessionDestroyed(HttpSessionEvent se)
{
if (activeSessions > 0)
activeSessions--;
}
public static int getActiveSessions()
{
return activeSessions;
}
}
将文档存储在 d:\MyJSP文件夹下,编译成 SessionCounter.class,
并存储到 d:\MyJSP\WEB-INF\classes\SessionCount中
代码 3
然后编写调用该 SessionCounter.java的 jsp文档,文档名
myonline.jsp,内容如下,
<html>
<head>
</head>
<body>
<%@ page import="SessionCount.SessionCounter" %>
在线人数,<%= SessionCounter.getActiveSessions() %>
</body>
</html>
代码 4
最后,修改 d:\MyJSP\WEB-INF\web.xml,在 <web-
app>…</web -app>内,添加如下内容,
<!-- Listeners -->
<listener>
<listener-class>
SessionCount.SessionCounter
</listener-class>
</listener>
6.5.4 JDBC与数据库
在 Windows和 Macintosh 平台上各种数据库的通信中,ODBC
( Open Database Connectivity,开放数据库互连)已经成为一
种事实上的标准。 ODBC已经被广大的开发商和编程人员公认
为较好的数据库之间的通信手段。这些数据库包括 Oracle,
Sybase SQL Server,Miscrosoft SQL Server,Miscrosoft Access
以及 My SQL等。
ODBC是图形用户界面和数据库后台之间的通信层,只要使用
标准的 SQL语句便可以访问数据库而不需要使用特定的数据库
命令。 ODBC使用户程序可移植性,不需要或者只需要较少的
改动就可以应用程序中的数据库从一种移植到另一种,例如从
Miscrosoft Access移植到 Miscrosoft SQL Server。
1,JDBC简介
Java中连接数据库的技术是 JDBC( Java Database
Connectivity),他和 ODBC完全类似,通过 java.sql包中的类、
接口和异常事件,可以对数据库进行操作。很多数据库系统带
有 JDBC驱动程序,Java程序通过 JDBC驱动程序实现与数据库
的相连,执行查询、提取数据等操作。另外,Sun公司还开发
了 JDBC- ODBC bridge,用此技术 Java程序就可以访问带有
ODBC驱动程序的数据库,目前大多数数据库系统都带有
ODBC驱动程序,所以 Java程序能访问诸如 Oracle,Sybase、
MS SQL Server和 MS Access等数据库。
JDBC类
JDBC是由 java.sql包实
现的,这个包中包含了
所有的 JDBC类和方法
2,JSP访问数据库
JSP工作在三层结构的中间层,主要的功能是接受客户的请求,
然后从数据库服务器获得信息,然后以 Html的形式返给客户
浏览器。下面举例说明 JSP访问数据库的过程。
[例 6-15]
下面通过 Accesss数据库,建立一个客户信息查询系统。通过
JavaBean+jsp+JDBC实现数据库的查询以及在客户浏览器短的
显示。
1.建立数据库
( 1)首先建立一个 Access数据库 Customers.mdb,建立一个数
据表 Customers,包含字段 id( 自动增量型,并设为主关键
字),name( 文本型,长度 10),address( 文本型,长度
30),info(备注型 )。
( 2)在 Windows 2000的“控制面板”中,打开“管理工具”,
双击,ODBC数据源”图标,打开,ODBC数据源管理器”窗
口,添加“系统 DSN”,取名 Customers,并指向
Customers.mdb。
( 3) 创建一个 JavaBean,名为 DBconn.java,DBconn.java主
要是封装与数据库的连接操作,内容如下,
2.DBconn.java类 -1
DBconn.java主要是封装与数据库的连接操作,内容如下,
package myBeans;
import java.sql.*;
public class DBconn
{
String DBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String ConnStr = "jdbc:odbc:Customers";
Connection conn = null;
ResultSet rs = null;
public DBconn()
{
try {
Class.forName(DBDriver);
//加载数据库驱动程序
}
DBconn.java类 -2
catch(java.lang.ClassNotFoundException e)
{
System.err.println("DBconn ():" + e.getMessage());
}
}
public ResultSet executeQuery(String sql)
{
rs = null;
try
{
conn = DriverManager.getConnection(ConnStr);
//与 DBMS建立链接
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}
DBconn.java类 -3
catch(SQLException ex)
{
System.err.println("aq.executeQuery:"+ex.getMessage());
}
return rs;
}
}
将 Dbconn.java保存在 d:\MyJSP文件夹下,编译 Dbconn.java生
成 Dbconn.class文件。
3.WEB-INF文件夹
( 3) 建立相应的文件目录结构 。 即:在 d:\MyJSP中, 建立
WEB-INF文件夹, 在 WEB-INF文件夹中建立 classes文件夹,
在 classes中建立 myBeans文件夹, 保存 Dbconn.class文件 。
然后,在 d:\MyJSP\WEB-INF下创建 web.xml文档,从
webapps\ROOT下复制即可。如果该 web.xml不存在或者内容
错误,则显示 HTTP404错误。修改 web.xml后,需要重新启动
Tomcat,使修改生效。
4,mycustomers.jsp
建立 mycustomers.jsp文件,在 JSP中调用以上编译好的
JavaBeans,其内容如下,
<html>
<head>
<meta http- equiv="Content- Type" content= "text/html;
charset=gb2312">
<title>客户信息调查 </title>
</head>
<body>
<%@ page language="java" import="java.sql.*" %>
<jsp:useBean id="myDBconn" class="myBeans.DBconn"
scope="page"/>
mycustomers.jsp续 1
<%
ResultSet RS = myDBconn.executeQuery ("SELECT *
FROM Customers");
%>
<%! private int num=1; %>
<p align=center><b><font color="#0000FF">客户信息调查
</font></b></p>
<div align="center">
<center>
<table border="1" cellpadding="0" width="500">
mycustomers.jsp续 2
<tr align="center">
<td>序号 </td> <td>客户 ID</td> <td>姓名 </td> <td>地址 </td>
<td>基本信息 </td>
</tr>
<%
while (RS.next())
{
out.print("<tr>");
out.print("<td align=center>" + num +"</td>");
out.print("<td>" + "id" +"</td>");
out.print("<td>" + RS.getString("name")+"</td>");
out.print("<td>" + RS.getString("address")+"</td>");
out.print("<td>" + RS.getString("info")+"</td>");
out.print("</tr>");
num++;
}
mycustomers.jsp续 3
RS.close();
%>
</table>
</center>
</div>
</body>
</html>
运行
6.5.5 使用 JSP访问 XML文档数据
XML文档作为重要的数据存储形式,正在受到越来越多的
关注。 JSP支持 XML技术,JSP的动作元素本身就采用了
XML语法格式。在 JSP中,对 XML的访问是通过 Java语言实
现的。其访问途径有多种,本节我们重点介绍通过文档对
象模型 DOM访问 XML的方法。
1,DOM文档模型
( 1) Microsoft的 XML DOM对象模型 ( Microsoft.XMLDOM)
它比较适合于在 HTML中直接使用 VBScript或 JavaScript脚本
程序来解析 XML文档。 XML DOM包含在 Internet Explorer
5.x中,它是一个用来存取 XML数据的 ActiveX组件,其中共
有五个组件对象。
在 Java中,除了可以使用 Microsoft.XMLDOM模型外,还可
以用其他的 DOM模型对 XML进行解析。下面简要地介绍
SAX的 DOM模型。
其他的 DOM模型
SAX( Simple API for XML) 的 DOM解析器是以一组简单的应
用程序接口( API) 来处理 XML文档。在 Apache的 Xerces子计
划支持一个 DOM解析器,它位于 org.apache.xerces,
parsers.DOMparser。 DOMParser提供了一个生成 W3C DOM结
构树的解析器以及响应方法。 Sun的 Java XML parser主要包
含以下的包,java.xml.parsers( XML解析器及相关对象)、
org.xml.sax( SAX模型及相关对象)以及 org.w3c.dom( DOM
模型及相关对象)。这些包被包含在 JAXP( Java API for
XML Processing,即:用于 XML文档处理的使用 Java语言编写
的编程接口)中,可到 Sun的网站免费下载。只要在 JSP程序
中引入这些类包,就可以使用解析器来解析 XML文档。
2.主要的 DOM对象 -1
(1)DOMParser类对象:通过该对象可以创建 DOMParser的实例。
通过该对象的 parse()方法将被解析的 XML文档引入到解析器中,
建立起 DOM结构树。
(2)Document接口对象:这是 DOM结构树的最顶层对象。它提供了
一系列的方法,如通过 getDOcType() 方法可以得到文档的类型,
通过 createElement()方法来建立新元素等。一个 Document对象
也可以作为最高层的节点处理,如通过对象的 getChildNodes()
方法可以得到它的下一层节点对象。
(3)NodeList对象,处于结构树同一层的节点对象列表。元素就
是该层的所有节点。有两个方法,getLength()和 item()。 前者
可得到列表中的元素个数,后者是元素索引(从 0开始)。
主要的 DOM对象 -2
Node对象:这是 DOM中最重要的接口对象。为 DOM结构树中的一个
节点。节点对象的类型如表 6- 所示。
3.应用举例【例 6-16】
【例 6-16】对于
例 3.6中的 XML文
档, book.xml”
请在 JSP中通过
DOM将其中的数
据以表格的形式
显示出来。
代码 -1
JSP文档(文档名 myxml.jsp) 内容如下,
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="org.apache.xerces.parsers.*" %>
<%@ page import="org.w3c.dom.*" %>
<% int i;int j;
String textNodeValue;
String textNodeName;
String xmlFile="d:/MyJSP/book.xml";//被解析的 XML文件名
DOMParser MyParser = new DOMParser();//创建一个解析器
实例
MyParser.parse(xmlFile); //对 XML文件解析,创建 DOM结构树
Document XMLDoc = MyParser.getDocument();//创建文档节
点实例
NodeList myNodeList = XMLDoc.getChildNodes(); //建
立文档的节点列表,其中只有一个根点
代码 -2
Node rootNode=myNodeList.item(0); //获得根节点
NodeList myNodeList1=rootNode.getChildNodes();//获
得根节点下的第一层节点列表
Node thisNode1=myNodeList1.item(1); //获
得根节点的第一层节点的第 1号节点
NodeList myNodeList2=thisNode1.getChildNodes();//获
得第二层节点列表
Node thisNode2=myNodeList1.item(0); //获
得第二层下的第 0号节点
%>
代码 -3
<html>
<head>
<title>使用 JSP访问 XML文档数据 </title>
</head>
<body background="1.jpg">
<h1 align="center"><font size="3" color="#ff0000">新
书预告 </font></h1>
<table border="1" width="100%" background="2.gif"
height="67">
<tr>
代码 -4
<%
j=1; //以下为输出表头。在这里以文档文本节点的节
点名作为列标题
while(thisNode2!=null) //对于第二层的所有节点对象循
环处理
{
if (thisNode2.getNodeType()==Node.ELEMENT_NODE)
{//当节点对象的类型为节点类型时
textNodeName=thisNode2.getNodeName();//获得节
点名
%> <!-- 节点名输出到单元格中 -->
<td height="29"
align="center"><%=textNodeName%></td>
<% }
代码 -5
thisNode2=myNodeList2.item(j);j++; //从节点列表中取
下一个节点
}
%>
</tr>
<%
thisNode1=myNodeList1.item(0); i=1; //获得根节点的
第一层节点的第 0号节点
while(thisNode1!=null) //对于第二层的
所有节点对象循环处理
{
if
(thisNode1.getNodeType()==Node.ELEMENT_NODE)//当节点
对象的类型为节点类型时
代码 -6
{
myNodeList2=thisNode1.getChildNodes();
//取下层子节点
%>
<tr><font size="3">
<%
thisNode2=myNodeList2.item(0);j=1; //从第二层节
点的第 0号节点对象开始
while(thisNode2!=null) //对该层的所有节点循环
{
if (thisNode2.getNodeType()==Node.ELEMENT_NODE)
{//只对节点类型的节点对象处理
NodeList
myNodeList3=thisNode2.getChildNodes(); //取下一层的
子节点
代码 -7
Node thisNode3=myNodeList3.item(0);
//该层只有一个文字节点
textNodeValue=thisNode3.getNodeValue();
//取出文字节点的值输出到单元格中
%>
<td width="20%" height="29"
align="center"><%=textNodeValue%></td>
<% }
thisNode2=myNodeList2.item(j);j++; //第二层取下一个
节点,继续循环
}
%>
</font></tr>
<% }
代码 -8
thisNode1=myNodeList1.item(i);i++;//第一层取下一个节
点,继续循环
}
%>
</table>
</body>
</html>
结果
6.5.6 JSP与图形
经常看到网页上绘制各种各样的图形,如股市行情等。他们
根据数据的变化,来不断的更新图形,如何实现图形的绘制
呢?
1,java.awt包和 javax.swing包
java.awt包是抽象窗口工具集,其中实现了可以跨平台的图
形用户界面组件,包括窗口、菜单、滚动条和对话框等,是
Java图形用户界面编程的主要工具。
( 1) java.awt包 -1
· java.awt,提供创建用户窗口的接口集以及绘制图形、图
象所必需的类集。
· java.awt.color,提供颜色空间的类集合。
· java.awt.datatransfer,提供在应用程序内部和应用程
序之间进行数据传输的接口和类的集合。
· java.awt.dnd,拖放, Drag and Drop”是很多图形用户接
口系统都提供的机制,这种机制可以用于在 GUI中的两个具
有图形表现元素的应用程序之间进行通信。比如 Macintosh
中的拖放执行操作等。
· java.awt.event,提供处理由 AWT组件触发的不同类型事
件的接口和类的集合。
· java.awt.font,提供与字体相联系的类和接口集合。
java.awt包 -2
· java.awt.geom,提供能够在与二维几何相联系的对象上
定义和执行操作的 Java 2D类集合。
· java.awt.im,为输入方法框架提供的接口和类的集合。
· java.awt.im.spi,提供能够为任何 Java运行时环境所采
用的输入方法的开发接口集合。
· java.awt.image,为创建与修改图形操作提供的基本类集
合。
· java.awt.image.renderable,提供产生可以着色的图象
的类和接口集合。
· java.awt.print,为通用打印 API提供的类与接口集合。
( 2) javax.swing包 -1
· javax.swing提供保证在任何平台上都有相同行为和表现
的一套轻量级组件。
· javax.swing.border,提供在 Swing 组件周围绘制特殊边
界的类集合和接口。
· javax.swing.colorchooser,包含能够被 JcolorChooser
组件所使用的类和接口集合。
· javax.swing.event,提供能够被 Swing组件所触发的事件
集。
· javax.swing.filechooser,包含能够被 JFileChooser组
件所使用的类和接口集合。
· javax.swing.plaf,提供一个接口和很多抽象类,用于为
Swing提供可插入的 look-and-feel能力。
javax.swing包 -2
· javax.swing.table,提供处理 javax.swing.Jtable的类和接
口集合。
· javax.swing.text,提供处理可编辑的和不可编辑的文本组件
的类和接口集合。
· javax.swing.text.html,提供 HTMLEditorKit类和支持创建
HTML文本编辑器的支持类集合。
· javax.swing.text.html.parser,提供缺省的 HTML解析器和相
应的支持类。
· javax.swing.text.rtf,提供一个用于创建 Rich-Text-Format
文本编辑器的 RTFEditorKit类。
· javax.swing.tree,提供处理 javax.swing.Jtree的类和接口
集合。
javax.swing包 -3
· javax.swing.undo,为诸如文本编辑器一类的应用提供重复和
撤消操作能力。
· javax.transaction,包含解分组时可能被 ORB机制抛出的三个
异常。
[例 6-17]
利用 JSP+JavaBean在网页上绘制图形。
利用 JSP+JavaBean在网页上绘制图形的一般步骤是,
( 1)创建一个用来生成 jpg文件的 Java Bean
( 2)编写一个读取数据的 JavaBean
( 3)建立运行所需要的文件目录结构
( 4)编写一个 jsp文档,调用上面的 Java Bean,显示图形。
( 5)运行
( 1)创建一个用来生成 jpg文件的 Java Bean -1
package Charts;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import java.awt.image.*;
import java.awt.*;
public class ChartGraphics
{
BufferedImage image;
public void createImage(String fileLocation)
{
try {
FileOutputStream fos = new
FileOutputStream(fileLocation);
Java Bean -2
BufferedOutputStream bos = new
BufferedOutputStream(fos);
JPEGImageEncoder encoder =
JPEGCodec.createJPEGEncoder(bos);
encoder.encode(image);
bos.close();
}
catch(Exception e) {
System.out.println(e);
}
}
Java Bean -3
public void graphicsGeneration(int height[])
{
int x=10;
int imageWidth = 300; //图片的宽度
int imageHeight = 310; //图片的高度
int columnWidth = 30; //柱的宽度
int columnHeight= 300; //柱的最大高度
ChartGraphics g = new ChartGraphics();
g.image = new
BufferedImage(imageWidth,imageHeight,BufferedImage.TYPE_
INT_RGB);
Graphics graphics = g.image.getGraphics();
graphics.setColor(Color.white);
graphics.fillRect(0,0,imageWidth,imageHeight);
graphics.setColor(Color.blue);
Java Bean -4
graphics.drawRect(0,0,imageWidth-1,imageHeight-1);
graphics.setColor(Color.red);
for (int i=0;i<5;i++)
{
x += columnWidth;
graphics.drawRect(x,columnHeight-height[i],
columnWidth,height[i]);
}
g.createImage("c:\\mytemp\\mychart.jpg");
}
}
假设创建的图片文件名为 mychart.jpg,并保存在 c:\mytemp文件
夹中。
将文件存储到 d:\MyJSP文件夹下,编译生成
ChartGraphics.class。
( 2)编写一个读取数据的 JavaBean
编写一个读取数据的 JavaBean,文档名 GetData.java,内容,
package Charts;
import java.io.*;
public class GetData
{
int mydatas[] = new int[5];
public int[] getDatas()
{
try {
RandomAccessFile randomAccessFile = new
RandomAccessFile("c:\\mytemp\\mydata.txt","r");
for (int i=0;i<5;i++)
{ mydatas[i] =
Integer.parseInt(randomAccessFile.readLine());
}
}
( 3)建立运行所需要的文件目录结构
在 d:\MyJSP\WEB-INF\classes中创建一个 Charts文件夹(对应两
个 bean的包),将 ChartGraphics.class和 GetData.class复制到
d:\MyJSP\WEB-INF\classes\Charts中。
确保 d:\MyJSP\WEB-INF\下 web.xml正确。
( 4)编写一个 jsp文档
编写一个 jsp文档,调用上面的 Java Bean,显示图形。
Mychar.jsp内容如下,
<%@ page import="Charts.ChartGraphics"%>
<%@ page import="Charts.GetData"%>
<jsp:useBean id="myChart" class="ChartGraphics"/>
<jsp:useBean id="myData" class="GetData"/>
<%! int mydataary[]=new int[5]; %>
<%
mydataary=myData.getDatas();
myChart.graphicsGeneration(mydataary);
%>
jsp文档 -2
<html>
<body>
<div align="center">
<center>
<table border="0" cellpadding="0" width="100%">
<tr align="center">
<td width="100%"><img
src="c:\mytemp\mychart.jpg"></img></td>
</tr>
</table>
</center>
</div>
</body>
</html>
( 5)运行
运行上述 mychart.jsp,显示如图 6-10所示。
6.6 ASP,JSP,PHP技术比较
当前,在网络开发中,除了 Servlet/EJB/JSP外,最常用的 Web服
务器编程语言还有 ASP( Active Server Pages) 和 PHP (
Hypertext Preprocessor)。 下面我们对这些相关的技术进行对
比分析,以便我们对这些技术的特点有一个简单的认识。
6.6.1 IIS与 ASP
ASP全名 Active Server Pages,它是 IIS信息服务的附加组件
,含有若干内建对象,用于 Web服务器端的开发。利用它可以
产生和执行动态的、互动的、高性能的 WEB服务应用程序。 ASP
采用脚本语言 VBScript( Java script) 作为自己的开发语言

1,ASP的技术特点
( 1)使用 VBScript, JavaScript等简单易懂的脚本语言,
结合 HTML代码,即可快速地完成网站的应用程序。
( 2)使用普通的文本编辑器,如 Windows的记事本,即可进行
编辑设计。无须 compile编译,可在服务器端直接执行。
( 3)与浏览器无关,客户端只要使用可执行 html码的浏览器
,即可浏览 ASP所设计的网页内容。
( 4) ASP能与任何 ActiveX scripting语言兼容。除了可使用
VB Script或 JavaScript语言外,还通过插件( plug-in) 的方
式,安装第三方的脚本引擎(脚本引擎是处理脚本程序的 COM
对象),来使用第三方所提供的其它脚本语言,如 REXX,
Perl等。
( 5) ActiveX Server Components(ActiveX 服务器组件 )具
有无限可扩充性。可以使用 Visual Basic,Java,Visual C++
等程序设计语言来编写所需要的 ActiveX Server Component。
2,ASP文档
ASP文件(扩展名,asp) 的主体仍然是传统的 HTML文件,主要
由 HTML标记、文本和脚本程序组成
传统的 HTML文档已经包含了脚本程序和外插对象,只不过它们
主要是在客户端浏览器运行,依赖于客户浏览器对相关技术的
支持。然而,ASP属于服务端应用,强调服务器端的脚本程序
,脚本程序是在服务器端运行的,在性能上类似于传统的 CGI
程序。
3,客户端、服务端脚本
在传统的 HTML页中,客户浏览端运行的脚本程序被写在
<script></script>标记对内。 ASP为了插入在服务端运行的脚
本程序,引入了 ASP脚本程序定界符号( <% 和 %>),另外在
<script>标记原始定义的基础上扩展了一个 runat属性,表示
其中的脚本在服务端运行。使用 runat属性时,必须使用
language属性指定脚本语言程序的种类,例如,<script
language=VBScript runat=server>,表示在服务端运行且脚
本语言为 VBScript。
4,ASP的工作机制
和普通的,htm文档不同,当客户通过浏览器访问某,asp文档时
,.asp文档将不能直接被下载到客户的浏览器中。在 Web服务
器端,Web服务器中的 ASP解释器按照从上到下的顺序扫描 ASP
文件内容,如果遇到任何没有包含在 ASP 定界符或 <script>
标记中的文本或图形都将直接传递到浏览器,如果遇到服务器
端脚本程序,将执行脚本程序。并将其可能产生的 html输出依
序传送到客户端,直到文件扫描结束。
[例 6-20]
<html> <head>
<title>ASP Sample</title>
</head>
<body >
<p align="center">ASP服务器端和客户端脚本程序实例 -1</p>
<hr>
<% For I=1 to 6 %>
<script language="VBScript">
document.writeln "<h<%=I%>>标题 <%=I%></h<%=I%>>"
</script>
<% Next %>
ASP网页下载浏览时间,<%=Now %>
</body>
</html>

生成的 HTML代码 -1
在图 6-1所示的浏览器窗口中,单击“查看”菜单,执行“源
文件”命令,可以看到文件 AspSample1.asp执行后生成的
HTML代码为,
<html>
<head>
<title>ASP Sample</title>
</head>
<body>
<p align="center">ASP服务器端和客户端脚本程序实例 -1</p>
<hr>
<script language="VBScript">
document.writeln "<h1>标题 1</h1>"
</script>
<script language="VBScript">
document.writeln "<h2>标题 2</h2>"
</script>
生成的 HTML代码 -2
<script language="VBScript"> document.writeln "<h3>标题 3</h3>"
</script>
<script language="VBScript">
document.writeln "<h4>标题 4</h4>"
</script>
<script language="VBScript">
document.writeln "<h5>标题 5</h5>"
</script>
<script language="VBScript">
document.writeln "<h6>标题 6</h6>"
</script>
ASP网页下载浏览时间,2002-3-3 15:05:39
</body>
</html>
6.6.2 JSP技术
JSP( Java Service Page) 是由 Sun 公司在 java语言上开发出来
的一种服务器脚本语言,它包装了 Java Servlet系统界面,简
化了 Java和 Servlet的使用难度。在 JSP页面上可以直接书写
Java代码,代码需要编译成 Servlet后由 Java虚拟机解释执行,
这种编译操作仅在对 JSP页面的第一次请求时发生。
JSP技术的特点
作为 Java平台的一部分, JSP拥有 Java程序设计语言, 一次编
写, 到处运行, 的特点, 既同平台无关, 也同操作系统和
Web服务器无关 。 JSP可以在 Web服务器 Apache上运行, 由于
Apache广泛应用在 NT,Unix和 Linux上, 因此 JSP有更广泛的
执行平台 。 在 NT/2000 Server下 IIS通过一个外加服务器, 例
如 JRUN或者 ServletExec,就能支持 JSP。
另外,由于 JSP页面的内置脚本语言是基于 Java程序设计语言
的,而且所有的 JSP页面都被编译成为 Java Servlet,JSP页面
就具有 Java技术的所有好处,包括健壮的存储管理和安全性。
6.6.3 PHP技术
PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借
用 C,Java和 Perl语言的语法,并耦合 PHP自己的特性,使 WEB
开发者能够快速地写出动态产生页面。
PHP可以编译成具有与许多数据库相连接的函数。 PHP与
MySQL是现在最佳的群组合。用户可以自己编写外围的函数
去间接存取数据库,通过这样的途径当更换使用的数据库时,
可以轻松地修改编码以适应这样的变化。但是,PHP的弱点是,
提供的数据库接口支持彼此不统一。如:对 Oracle,MySQL,
Sybase的接口,彼此都不一样。
PHP是完全免费的,不用花钱,你可以从 PHP官方站点 (http,
//www.php.net)自由下载。而且你可以不受限制地获得源码,
甚至可以从中加进你自己需要的特色。
6.6.4 ASP,JSP和 PHP的对比
ASP,JSP和 PHP都作为 Web服务器的开发环境,除了要求的
Web服务器环境不同外,彼此之间有什么样的关系,在性能上
有什么不同呢?
1,JSP与 ASP的关系
JSP和 ASP两者都很多相似之处,甚至在 JSP中也使用了 ASP中
常用的标记符号,但两者的差异也是明显的,主要表现在以
下四个方面,
( 1) JSP的与平台无关,采用不同的组件模型标准。 JSP采用
的是 JavaBean标准和 Enterprise JavaBean标准,而 ASP采用的是
COM标准。
( 2) JSP组件对象更多。
( 3)对数据库的访问不同,ASP采用 ODBC连接和 ADO,而
JSP采用 JDBC连接。另外,由于 JSP提供了对 XML的更多的支
持,随着 XML技术的推广,JSP必将有更好的发展前景。
2,性能比较
下面是三种语言的性能测试结果,
( 1)回圈性能测试。在循环性能测试中,JSP只用了令人吃
惊的四秒钟就结束了 20000* 20000的回圈。而 ASP,PHP只测
试 2000* 2000循环,却分别用了 63秒和 84秒。
( 2)存取数据库测试。数据库测试中,三者分别对 Oracle 8
进行 1000 次 Insert,Update,Select和 Delete操作。 JSP 需要
13 秒,PHP 需要 69 秒,ASP则 需要 73 秒。
3,应用比较
目前,PHP与 ASP技术应用的非常广泛,而 JSP由于是一种较
新的技术,国内采用的较少。但在国外,JSP已经是比较流行
的一种技术,尤其是电子商务类的网站,多采用 JSP技术,
EJB+Servlet+JSP几乎成为电子商务的开发标准。
由于 PHP本身存在的一些缺点,使得它不适合应用于大型电子
商务站点,而更适合一些小型的商业站点。第一,PHP缺乏规
模支持。第二,缺乏多层结构支持。对于大负荷站点,解决
方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑
层彼此分开,而且同层也可以根据流量分开,群组成二维数
组。而 PHP则缺乏这种支持。另外,PHP提供的数据库接口支
持不统一,这就使得它不适合运用在电子商务中。
ASP和 JSP则没有以上缺陷
6.7 Java开发工具简介
JDK( Java Development Kit)
JBuilder
6.7.1 JDK( Java Development Kit)
SUN的 Java不仅提了一个丰富的语言和运行环境,而且还提了一
个免费的 Java开发工具集( JDK)。 开发人员和最终用户可以利
用这个工具来开发 java程序。
JDK简单易学,可以通过任何文本编辑器(如,Windows 记事本、
UltrEdit,Editplus,FrontPage以及 dreamweaver等)编写 Java源文
件,然后在 DOS状态下通过 javac命令将 Java源程序编译成字节码
(,class文件),通过 Java命令来执行编译后的 Java文件,这能带
给 DOS时代程序员美好的回忆。 Java 初学者一般都采用这种开发
工具。
从初学者角度来看,采用 JDK开发 Java程序能够很快理解程序中
各部分代码之间的关系,有利于理解 Java面向对象的设计思想。
JDK的另一个显著特点是随着 Java( J2EE,J2SE以及 J2ME) 版本
的升级而升级。但它的缺点也是非常明显的就是从事大规模企业
级 Java应用开发非常困难,不能进行复杂的 Java软件开发,也不
利于团体协同开发。
6.7.2 JBuilder
Borland的开发工具
Jbuilder进入了 Java集成开发环境的王国,它满足很多方面的应用,
尤其是对于服务器方以及 EJB开发者们来说。下面简单介绍一下
Jbuilder的特点,
( 1) Jbuilder支持最新的 Java技术,包括 Applets,JSP/Servlets、
JavaBean以及 EJB( Enterprise JavaBeans) 的应用。
( 2)用户可以自动地生成基于后端数据库表的 EJB Java类,
Jbuilder同时还简化了 EJB的自动部署功能。此外它还支持 CORBA,
相应的向导程序有助于用户全面地管理 IDL(分布应用程序所必需
的接口定义语言 Interface Definition Language)和控制远程对象。
( 3) Jbuilder支持各种应用服务器。 Jbuilder与 Inprise Application
Server紧密集成,同时支持 WebLogic Server,支持 EJB 1.1和 EJB
2.0,可以快速开发 J2EE的电子商务应用。
JBuilder( 续)
( 4) Jbuilder能用 Servlet和 JSP开发和调试动态 Web 应用。
( 5)利用 Jbuilder可创建 (没有专有代码和标记 )纯 Java2应用。由
于 Jbuilder是用纯 Java语言编写的,其代码不含任何专属代码和标
记,它支持最新的 Java标准。
( 6) Jbuilder拥有专业化的图形调试界面,支持远程调试和多线
程调试,调试器支持各种 JDK版本,包括 J2ME/J2SE/J2EE。
JBuilder环境开发程序方便,它是纯的 Java 开发环境,适合企业
的 J2EE开发;缺点是往往一开始难于把握整个程序各部分之间的
关系,对机器硬件要求较高,运行速度较慢。
6.7.3 NetBeans IDE 4.0
补充,关于 Tomcat的配置问题 123
( 1) Server.xml文件
在 Tomcat\conf\server.xml文件是一个重要的文件。
配置默认的端口号,8080还是 80。
如果已经启动了 Apache或 IIS,先停止。
( 2)使用虚拟目录
在 Tomcat\conf\Catlina\localhost文件夹下,丁一每一个 Web应
用的虚拟目录,如果某个 Web应用要定义成根,需要 ROOT。
mml文件。例如,

( 3) WEB-INF文件夹
J2EE 规范描述三种类型的模块,Web 模块,EJB 模块和应用
程序客户机模块。
Web 模块
Web 模块包含 HTML,图像,JSps?,Java?类和 servlet,以
及创建 Web 应用程序所需的所有其它资源。
象其它模块一样,Web 模块包含一个部署描述符。在 Web 模
块中,部署描述符 web.xml 具有 servlet 初始化和映射信息以
及用于在应用程序服务器中运行 Web 模块的其它设置。

Web 模块
Web 模块有两个特殊的 Java 代码文件夹,
WEB-INF/classes 和 WEB-INF/lib 。
classes 文件夹可以包含“松散( loose),Java 类(不在 JAR
文件中的类),并且可以将它用于 Web 应用程序范围内的
servlet 或实用程序类。通常对于这个文件夹使用特殊的类装
入器,因此如果对类进行更改,则应用程序服务器会自动将
它们重新装入。
lib 文件夹可以包含也是由 Web 应用程序使用的 JAR 文件
(而不是 ZIp 文件!)。应该将第三方 JAR 文件和其它实用
程序 JAR 文件放入这个文件夹。如果 JAR 文件被其它 Web
或 EJB 模块使用,则需要将它们移动到“企业应用程序”项
目中。
web.xml部署文件
象其它模块一样,Web 模块包含一个部署描述符。在 Web 模
块中,部署描述符 web.xml 具有 servlet 初始化和映射信息以
及用于在应用程序服务器中运行 Web 模块的其它设置。

The End
谢 谢 大 家