JSP
开发入门
(
一
)--
安装好你的机器来使用
JSP
你将会需要
Java 2
软件开发工具
(JSDK)
,它原来的名称是
Java
发展工具
(JDK)
以及
JavaServer
网站发展工具
(JSWDK)
,
Tomcat
,或是其它支持
JSP
的网络服务器。
Sun
免费提供
JSDK
与
JSWDK
来供
Windows
,
Solaris
,以及
Linux
平台使用。
如果你想要在你目前的网络服务器上使用 JSP ,但服务器本身并不支持 JSP 与 Java servlets ,你可以试试看 Allaire 的 Jrun ,它的作用就像是针对 Netscape 企业版与 FastTrack 服务器、微软的网际网络信息服务器 (IIS) 与个人网络服务器 (PWS) 、 Apache 、以及其它服务器的网络服务器附加设备。你也可以使用 Apache 网络服务器的 Java 版本,最新的 JSWDK 里有提供。
下载与安装你需要的组件
目前发布的 1.2.2-001 , JSDK 可下载的版本是以可安装的压缩形式。下载的文件大约是 20MB ,可提供完整的 Java 发展环境,让你能建立利用标准 API 为核心的 Java 解决之道。然而,你的网络服务器需要应用到 JSP 的唯一一件事是 Java 编译器。要让网络服务器知道编译器的位置,将环境变量 JAVA.HOME 设到 JSDK 的安装目录。如果你是在 Windows 上安装并且接受预设目录,将这行程序代码 set JAVA.HOME=C:/1.2.2 加到你的 autoexec.bat 档案并且重新开机。
在安装好 JSDK 之后,下载并且安装 JSWDK 或 beta 版的 Tomcat ,以 Java 为主的 Apache 网络服务器。安装在哪里并不重要,重要的是你可以找到它。一般而言,它会放在上层目录,这种方式可以让你取代 JSWDK 或 JSDK 的网络服务器,不需要移动其它的网络服务器。在你安装好这个档案之后,你就可以准备发展 JSP 了。
在你正确的安装 JSWDK 之后,执行 startserver 指令文件来激活网络服务器,预设通讯端口 为 8080 。要看你在激活服务器之后是均 C 有正确的安装工具,你可以加载范例 JSP 档案中的任何一个 (http://localhost:8080/examples/jsp/) 。如果你能够成功的执行一个范例档案,你可以知道你已经正确的设定好软件了。如果你在激活服务器的控制台窗口看到错误讯息,那么你需要解决这个问题。最常发生的问题是没有设定 ( 或者不正确设定 ) 环境变量 JAVA.HOME 。要检视目前的环境设定,在 DOS 模式下键入 set 。
开始
解释 JSP 语法之前,先建立一个显示目前日期与时间的快速网页并且将它储存成 sample.jsp:
<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is:
<%= new java.util.Date() %>
</H3>
</body>
</html>.
将这个档案与你所有的 HTML 与 JSP 网页放在你 JSWDK 安装目录下的网页目录里 . 你可以在 http://localhost:8080/sample.jsp 下载此页 . 当你第一次参观这个网页时,网站服务器会将 JSP 翻译成 Java servlet 程序代码,那你就会看到目前的日期与时间 .
现在你已经下载,安装,并且架构好发展环境,你已经准备好要了解 JSP 语法与建立你自己的 JSP 为主的解决之道 .
如果你想要在你目前的网络服务器上使用 JSP ,但服务器本身并不支持 JSP 与 Java servlets ,你可以试试看 Allaire 的 Jrun ,它的作用就像是针对 Netscape 企业版与 FastTrack 服务器、微软的网际网络信息服务器 (IIS) 与个人网络服务器 (PWS) 、 Apache 、以及其它服务器的网络服务器附加设备。你也可以使用 Apache 网络服务器的 Java 版本,最新的 JSWDK 里有提供。
下载与安装你需要的组件
目前发布的 1.2.2-001 , JSDK 可下载的版本是以可安装的压缩形式。下载的文件大约是 20MB ,可提供完整的 Java 发展环境,让你能建立利用标准 API 为核心的 Java 解决之道。然而,你的网络服务器需要应用到 JSP 的唯一一件事是 Java 编译器。要让网络服务器知道编译器的位置,将环境变量 JAVA.HOME 设到 JSDK 的安装目录。如果你是在 Windows 上安装并且接受预设目录,将这行程序代码 set JAVA.HOME=C:/1.2.2 加到你的 autoexec.bat 档案并且重新开机。
在安装好 JSDK 之后,下载并且安装 JSWDK 或 beta 版的 Tomcat ,以 Java 为主的 Apache 网络服务器。安装在哪里并不重要,重要的是你可以找到它。一般而言,它会放在上层目录,这种方式可以让你取代 JSWDK 或 JSDK 的网络服务器,不需要移动其它的网络服务器。在你安装好这个档案之后,你就可以准备发展 JSP 了。
在你正确的安装 JSWDK 之后,执行 startserver 指令文件来激活网络服务器,预设通讯端口 为 8080 。要看你在激活服务器之后是均 C 有正确的安装工具,你可以加载范例 JSP 档案中的任何一个 (http://localhost:8080/examples/jsp/) 。如果你能够成功的执行一个范例档案,你可以知道你已经正确的设定好软件了。如果你在激活服务器的控制台窗口看到错误讯息,那么你需要解决这个问题。最常发生的问题是没有设定 ( 或者不正确设定 ) 环境变量 JAVA.HOME 。要检视目前的环境设定,在 DOS 模式下键入 set 。
开始
解释 JSP 语法之前,先建立一个显示目前日期与时间的快速网页并且将它储存成 sample.jsp:
<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is:
<%= new java.util.Date() %>
</H3>
</body>
</html>.
将这个档案与你所有的 HTML 与 JSP 网页放在你 JSWDK 安装目录下的网页目录里 . 你可以在 http://localhost:8080/sample.jsp 下载此页 . 当你第一次参观这个网页时,网站服务器会将 JSP 翻译成 Java servlet 程序代码,那你就会看到目前的日期与时间 .
现在你已经下载,安装,并且架构好发展环境,你已经准备好要了解 JSP 语法与建立你自己的 JSP 为主的解决之道 .
JSP
开发入门
(
二
)----JSP
语法的基本原理
安装之后,接下来我们要讨论
JSP
的语法
.
如果要偷懒,你可以下载语法卡而如果你不熟悉
Java
的程序设计,你可能会想要参考
Sun
的使用手册;然而,网站建立者不应该做太多的
Java
发展。除了几个函式呼叫之外,出现在你
JSP
网页上的
Java
程序代码应该将它减到最少
;
记住这点之后,现在让我们先来看看 JSP 的编译器指引与指令组件,之后我们将解释 JavaBeans 与内部对象 . JSP 编译器指引与指令组件有五种型态 .JSP 1.0 之后,大部分的 JSP 是包含在以 <% 作为开始 %> 作为结束的单一卷标里 . 新的 JSP 1.1 规格已经发表了,它同时也与 XML 兼容 .
JSP 的编译器指引与指令组件
编译器指示 <%@ 编译器指示 %>
声明 <%! 声明 %>
表达式 <%= 表达式 %>
程序代码段 / 小型指令 <% 程序代码片段 %>
注释 <%-- 注释 --%>
编译器指示
JSP 的编译器指示是针对 JSP 引擎。它们并不会直接产生任何看得见的输出;相反的,它们是在告诉引擎如何处理其它的 JSP 网页。它们永远包含在 <%@ ?%> 卷标里。两个主要的指引是 page 与 include 。我们不会讨论 taglib 编译器指引但它可以在 JSP1.1 里用来建立自订卷标。
你几乎可以在你所有的 JSP 网页最上面找到 page 编译器指示。虽然这不是必须的,但它可以让你指定到哪里可以找到支持的 Java 类别这类的事:
<%@ page import="java.util.Date" %> ,
当发生 Java 问题的事件时应该将讯息传送到哪里:
<%@ page errorPage="errorPage.jsp" %> ,
以及你是 ? 需要为使用者管理通话期的信息,可能存取多个网页 ( 稍后在 JavaBeans 里会有更多通话期的讨论 ):
<%@ page session="true" %> 。
include 编译器指示让你将你的内容分成几个可管理的组件,就像那些有表头或脚注的网页。所包含的网页可以是固定格式的 HTML 网页或者是 JSP 内容的网页 :
<%@ include file="filename.jsp" %> 。
宣告
JSP 声明让你定义网页层的变量,来储存信息或定义支持的函式,让 JSP 网页的其余部分能够使用。如果你发现自己有太多的程序代码,你最好将它们放在不同的 Java 类别里。你可以在 <%! ?%> 卷标里找到声明。记住要在变量声明的后面加上分号,就跟任何有效的 Java 叙述的形式一样 : <%! int i=0; %> 。
记住这点之后,现在让我们先来看看 JSP 的编译器指引与指令组件,之后我们将解释 JavaBeans 与内部对象 . JSP 编译器指引与指令组件有五种型态 .JSP 1.0 之后,大部分的 JSP 是包含在以 <% 作为开始 %> 作为结束的单一卷标里 . 新的 JSP 1.1 规格已经发表了,它同时也与 XML 兼容 .
JSP 的编译器指引与指令组件
编译器指示 <%@ 编译器指示 %>
声明 <%! 声明 %>
表达式 <%= 表达式 %>
程序代码段 / 小型指令 <% 程序代码片段 %>
注释 <%-- 注释 --%>
编译器指示
JSP 的编译器指示是针对 JSP 引擎。它们并不会直接产生任何看得见的输出;相反的,它们是在告诉引擎如何处理其它的 JSP 网页。它们永远包含在 <%@ ?%> 卷标里。两个主要的指引是 page 与 include 。我们不会讨论 taglib 编译器指引但它可以在 JSP1.1 里用来建立自订卷标。
你几乎可以在你所有的 JSP 网页最上面找到 page 编译器指示。虽然这不是必须的,但它可以让你指定到哪里可以找到支持的 Java 类别这类的事:
<%@ page import="java.util.Date" %> ,
当发生 Java 问题的事件时应该将讯息传送到哪里:
<%@ page errorPage="errorPage.jsp" %> ,
以及你是 ? 需要为使用者管理通话期的信息,可能存取多个网页 ( 稍后在 JavaBeans 里会有更多通话期的讨论 ):
<%@ page session="true" %> 。
include 编译器指示让你将你的内容分成几个可管理的组件,就像那些有表头或脚注的网页。所包含的网页可以是固定格式的 HTML 网页或者是 JSP 内容的网页 :
<%@ include file="filename.jsp" %> 。
宣告
JSP 声明让你定义网页层的变量,来储存信息或定义支持的函式,让 JSP 网页的其余部分能够使用。如果你发现自己有太多的程序代码,你最好将它们放在不同的 Java 类别里。你可以在 <%! ?%> 卷标里找到声明。记住要在变量声明的后面加上分号,就跟任何有效的 Java 叙述的形式一样 : <%! int i=0; %> 。
JSP
开发入门
(
三
)--JSP
与
JavaBean
虽然你可以在小型指令文件里放入一大块的程序代码,但是大多数的
Java
程序代码是属于可以重复使用的组件,称为
JavaBean
。
JavaBean
就跟
ActiveX
控件一样
:
它们提供已知的功能,并且是为了可随时重复使用的目的而设计的。
JavaBean 的价值在于它可以经由一组特性来使用,而这些特性则提供对 JavaBean 设定的存取。以人来作范例,此人就是 JavaBean ,而他的姓名,社会福利安全号码,以及住址可以是特性。对于 JSP 网站,基本上你是将 'JavaBean' 动态的连接到你的网站。
假设 JavaBean 是在建立网站之前建好的,你要做的第一件事是告诉 JSP 网页它所需要使用 JavaBean. 这工作可以用 <jsp:useBean> 卷标来完成: <jsp:useBean id="localName" class="com.jguru.Person" scope="application" />.
<jsp:useBean> 卷标需要你以 id 属性来辨识豆子 . 在这里,你提供一个名称让 JSP 网页来辨识豆子,除了 id 属性之外,你也必须告诉网页要到哪里去找这个豆子,或者是它的 Java 类别名称。类别属性提供如何在各式方法之中找到它,最后一个需要的组件是 scope 属性 . 有了范围属性的帮助,你可以告诉豆子,要它为单一网页 ( 预设 )[scope="page"] ;为一个被请求的网页 [scope="request"] ;为通话期 [scope="session"] ;或为整个应用程序 [scope="application"] 来维护它自己的信息 . 对于通话期范围,你可以很容易的维护 JSP 网页里的项目,例如购物车。
一但你宣告了 JavaBean 之后,你就可以存取它的特性来订定它。要取得一特性的值,使用 <jsp:getProperty> 卷标。有了 <jsp:getProperty> 卷标,你可以指定要使用的豆子名称 ( 从 useBean 的 id 字段 ) ,以及你要取得值的特性。接着,真正的值就会放在输出里: <jsp:getProperty id="localName" property="name" />.
要更改 JavaBean 的特性,你需要使用 <jsp:setProperty> 卷标 . 对这个卷标,你也需要辨认豆子以及要修正的特性,除此之外,你还需要提供新值 . 如果命名正确,这些可以直接经由规定的格式取得: <jsp:setProperty id="localName" property="*" />;
要从一参数取得,你必须直接命名此特性以及参数 : <jsp:setProperty id="localName" property="address" param="parameterName" />;
或是直接以名称与值来设定 : <jsp:setProperty id="localName" property="serialNumber" value="string" /> or <jsp:setProperty id="localName" property="serialNumber" value= <%= expression %> />.
有关 JavaBean 的最后一点 : 要让网络服务器可以找到 JavaBean ,你需要将它们的类别档案放在特别位置。对 JSWDK 而言,最简单的地方是在安装目录里的类别目录,例如 /jswdk-1.0.1/classes.
JavaBean 的价值在于它可以经由一组特性来使用,而这些特性则提供对 JavaBean 设定的存取。以人来作范例,此人就是 JavaBean ,而他的姓名,社会福利安全号码,以及住址可以是特性。对于 JSP 网站,基本上你是将 'JavaBean' 动态的连接到你的网站。
假设 JavaBean 是在建立网站之前建好的,你要做的第一件事是告诉 JSP 网页它所需要使用 JavaBean. 这工作可以用 <jsp:useBean> 卷标来完成: <jsp:useBean id="localName" class="com.jguru.Person" scope="application" />.
<jsp:useBean> 卷标需要你以 id 属性来辨识豆子 . 在这里,你提供一个名称让 JSP 网页来辨识豆子,除了 id 属性之外,你也必须告诉网页要到哪里去找这个豆子,或者是它的 Java 类别名称。类别属性提供如何在各式方法之中找到它,最后一个需要的组件是 scope 属性 . 有了范围属性的帮助,你可以告诉豆子,要它为单一网页 ( 预设 )[scope="page"] ;为一个被请求的网页 [scope="request"] ;为通话期 [scope="session"] ;或为整个应用程序 [scope="application"] 来维护它自己的信息 . 对于通话期范围,你可以很容易的维护 JSP 网页里的项目,例如购物车。
一但你宣告了 JavaBean 之后,你就可以存取它的特性来订定它。要取得一特性的值,使用 <jsp:getProperty> 卷标。有了 <jsp:getProperty> 卷标,你可以指定要使用的豆子名称 ( 从 useBean 的 id 字段 ) ,以及你要取得值的特性。接着,真正的值就会放在输出里: <jsp:getProperty id="localName" property="name" />.
要更改 JavaBean 的特性,你需要使用 <jsp:setProperty> 卷标 . 对这个卷标,你也需要辨认豆子以及要修正的特性,除此之外,你还需要提供新值 . 如果命名正确,这些可以直接经由规定的格式取得: <jsp:setProperty id="localName" property="*" />;
要从一参数取得,你必须直接命名此特性以及参数 : <jsp:setProperty id="localName" property="address" param="parameterName" />;
或是直接以名称与值来设定 : <jsp:setProperty id="localName" property="serialNumber" value="string" /> or <jsp:setProperty id="localName" property="serialNumber" value= <%= expression %> />.
有关 JavaBean 的最后一点 : 要让网络服务器可以找到 JavaBean ,你需要将它们的类别档案放在特别位置。对 JSWDK 而言,最简单的地方是在安装目录里的类别目录,例如 /jswdk-1.0.1/classes.
附:
jsp
基础学习资料
一、
JSP
技术概述
在 Sun 正式发布 JSP(JavaServer Pages) 之后,这种新的 Web 应用开发技术很快引起了人们的关注。 JSP 为创建高度动态的 Web 应用提供了一个独特的开发环境。按照 Sun 的说法, JSP 能够适应市场上包括 Apache WebServer 、 IIS4.0 在内的 85% 的服务器产品。即使您对 ASP “ 一往情深 ” ,我们认为,关注 JSP 的发展仍旧很有必要。
㈠ JSP 与 ASP 的简单比较
JSP 与 Microsoft 的 ASP 技术非常相似。两者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。在 ASP 或 JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 和 JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到 HTML 代码中,然后一起发送给浏览器。 ASP 和 JSP 都是面向 Web 服务器的技术,客户端浏览器不需要任何附加的软件支持。
ASP 的编程语言是 VBScript 之类的脚本语言, JSP 使用的是 Java ,这是两者最明显的区别。此外, ASP 与 JSP 还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在 ASP 下, VBScript 代码被 ASP 引擎解释执行;在 JSP 下,代码被编译成 Servlet 并由 Java 虚拟机执行,这种编译操作仅在对 JSP 页面的第一次请求时发生。
㈡运行环境
Sun 公司的 JSP 主页在 http://www.javasoft.com/products/jsp/index.html ,从这里还可以下载 JSP 规范,这些规范定义了供应商在创建 JSP 引擎时所必须遵从的一些规则。
执行 JSP 代码需要在服务器上安装 JSP 引擎。此处我们使用的是 Sun 的 JavaServer Web Development Kit ( JSWDK )。为便于学习,这个软件包提供了大量可供修改的示例。安装 JSWDK 之后,只需执行 startserver 命令即可启动服务器。在默认配置下服务器在端口 8080 监听,使用 http://localhost:8080 即可打开缺省页面。
在运行 JSP 示例页面之前,请注意一下安装 JSWDK 的目录,特别是 “ work ” 子目录下的内容。执行示例页面时,可以在这里看到 JSP 页面如何被转换成 Java 源文件,然后又被编译成 class 文件(即 Servlet )。 JSWDK 软件包中的示例页面分为两类,它们或者是 JSP 文件,或者是包含一个表单的 HTML 文件,这些表单均由 JSP 代码处理。与 ASP 一样, JSP 中的 Java 代码均在服务器端执行。因此,在浏览器中使用 “ 查看源文件 ” 菜单是无法看到 JSP 源代码的,只能看到结果 HTML 代码。所有示例的源代码均通过一个单独的 “ examples ” 页面提供。
㈢ JSP 页面示例
下面我们分析一个简单的 JSP 页面。您可以在 JSWDK 的 examples 目录下创建另外一个目录存放此文件,文件名字可以任意,但扩展名必须为 .jsp 。从下面的代码清单中可以看到, JSP 页面除了比普通 HTML 页面多一些 Java 代码外,两者具有基本相同的结构。 Java 代码是通过 < % 和 %> 符号加入到 HTML 代码中间的,它的主要功能是生成并显示一个从 0 到 9 的字符串。在这个字符串的前面和后面都是一些通过 HTML 代码输出的文本。
< HTML>
< HEAD>< TITLE>JSP 页面 < /TITLE>< /HEAD>
< BODY>
< %@ page language="java" %>
< %! String str="0"; %>
< % for (int i=1; i < 10; i++) {
str = str + i;
} %>
JSP 输出之前。
< P>
< %= str %>
< P>
JSP 输出之后。
< /BODY>
< /HTML>
这个 JSP 页面可以分成几个部分来分析。
首先是 JSP 指令。它描述的是页面的基本信息,如所使用的语言、是否维持会话状态、是否使用缓冲等。 JSP 指令由 < %@ 开始, %> 结束。在本例中,指令 “ < %@ page language="java" %> ” 只简单地定义了本例使用的是 Java 语言(当前,在 JSP 规范中 Java 是唯一被支持的语言)。
接下来的是 JSP 声明。 JSP 声明可以看成是定义类这一层次的变量和方法的地方。 JSP 声明由 < %! 开始, %> 结束。如本例中的 “ < %! String str="0"; %> ” 定义了一个字符串变量。在每一项声明的后面都必须有一个分号,就象在普通 Java 类中声明成员变量一样。
位于 < % 和 %> 之间的代码块是描述 JSP 页面处理逻辑的 Java 代码,如本例中的 for 循环所示。
最后,位于 < %= 和 %> 之间的代码称为 JSP 表达式,如本例中的 “ < %= str %> ” 所示。 JSP 表达式提供了一种将 JSP 生成的数值嵌入 HTML 页面的简单方法。
二、会话状态管理
会话状态维持是 Web 应用开发者必须面对的问题。有多种方法可以用来解决这个问题,如使用 Cookies 、隐藏的表单输入域,或直接将状态信息附加到 URL 中。 Java Servlet 提供了一个在多个请求之间持续有效的会话对象,该对象允许用户存储和提取会话状态信息。 JSP 也同样支持 Servlet 中的这个概念。
在 Sun 的 JSP 指南 中可以看到许多有关隐含对象的说明(隐含的含义是,这些对象可以直接引用,不需要显式地声明,也不需要专门的代码创建其实例)。例如 request 对象,它是 HttpServletRequest 的一个子类。该对象包含了所有有关当前浏览器请求的信息,包括 Cookies , HTML 表单变量等等。 session 对象也是这样一个隐含对象。这个对象在第一个 JSP 页面被装载时自动创建,并被关联到 request 对象上。与 ASP 中的会话对象相似, JSP 中的 session 对象对于那些希望通过多个页面完成一个事务的应用是非常有用的。
为说明 session 对象的具体应用,接下来我们用三个页面模拟一个多页面的 Web 应用。第一个页面( q1.html )仅包含一个要求输入用户名字的 HTML 表单,代码如下:
< HTML>
< BODY>
< FORM METHOD=POST ACTION="q2.jsp">
请输入您的姓名:
< INPUT TYPE=TEXT NAME="thename">
< INPUT TYPE=SUBMIT VALUE="SUBMIT">
< /FORM>
< /BODY>
< /HTML>
第二个页面是一个 JSP 页面( q2.jsp ),它通过 request 对象提取 q1.html 表单中的 thename 值,将它存储为 name 变量,然后将这个 name 值保存到 session 对象中。 session 对象是一个名字 / 值对的集合,在这里,名字 / 值对中的名字为 “ thename ” ,值即为 name 变量的值。由于 session 对象在会话期间是一直有效的,因此这里保存的变量对后继的页面也有效。 q2.jsp 的另外一个任务是询问第二个问题。下面是它的代码:
< HTML>
< BODY>
< %@ page language="java" %>
< %! String name=""; %>
< %
name = request.getParameter("thename");
session.putValue("thename", name);
%>
您的姓名是: < %= name %>
< p>
< FORM METHOD=POST ACTION="q3.jsp">
您喜欢吃什么 ?
< INPUT TYPE=TEXT NAME="food">
< P>
< INPUT TYPE=SUBMIT VALUE="SUBMIT">
< /FORM>
< /BODY>
< /HTML>
第三个页面也是一个 JSP 页面( q3.jsp ),主要任务是显示问答结果。它从 session 对象提取 thename 的值并显示它,以此证明虽然该值在第一个页面输入,但通过 session 对象得以保留。 q3.jsp 的另外一个任务是提取在第二个页面中的用户输入并显示它:
< HTML>
< BODY>
< %@ page language="java" %>
< %! String food=""; %>
< %
food = request.getParameter("food");
String name = (String) session.getValue("thename");
%>
您的姓名是: < %= name %>
< P>
您喜欢吃: < %= food %>
< /BODY>
< /HTML>
三、引用 JavaBean 组件
JavaBean 是一种基于 Java 的软件组件。 JSP 对于在 Web 应用中集成 JavaBean 组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为 JSP 应用带来了更多的可伸缩性。 JavaBean 组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据提取等。如果我们有三个 JavaBean ,它们分别具有显示新闻、股票价格、天气情况的功能,则创建包含所有这三种功能的 Web 页面只需要实例化这三个 Bean ,使用 HTML 表格将它们依次定位就可以了。
为说明在 JSP 环境下 JavaBean 的应用,我们创建了一个名为 TaxRate 的 Bean 。它有两个属性,即 Product (产品)和 Rate (税率)。两个 set 方法分别用来设置这两个属性,两个 get 方法则用于提取这两个属性。在实际应用中,这种 Bean 一般应当从数据库提取税率值,此处我们简化了这个过程,允许任意设定税率。下面是这个 Bean 的代码清单:
package tax;
public class TaxRate {
String Product;
double Rate;
public TaxRate() {
this.Product = "A001";
this.Rate = 5;
}
public void setProduct (String ProductName) {
this.Product = ProductName;
}
public String getProduct() {
return (this.Product);
}
public void setRate (double rateValue) {
this.Rate = rateValue;
}
public double getRate () {
return (this.Rate);
}
}
在 JSP 页面中应用上述 Bean 要用到 < jsp:useBean> 标记。依赖于具体使用的 JSP 引擎的不同,在何处配置以及如何配置 Bean 的方法也可能略有不同。本文将这个 Bean 的 .class 文件放在 c:jswdk-1.0examplesWEB-INFjspbeanstax 目录下,这里的 tax 是一个专门存放该 Bean 的目录。下面是一个应用上述 Bean 的示例页面:
< HTML>
< BODY>
< %@ page language="java" %>
< jsp:useBean id="taxbean" scope="application" class="tax.TaxRate" />
< % taxbean.setProduct("A002");
taxbean.setRate(17);
%>
使用方法 1 : < p>
产品 : < %= taxbean.getProduct() %> < br>
税率 : < %= taxbean.getRate() %>
< p>
< % taxbean.setProduct("A003");
taxbean.setRate(3);
%>
< b> 使用方法 2 : < /b> < p>
产品 : < jsp:getProperty name="taxbean" property="Product" />
< br>
税率 : < jsp:getProperty name="taxbean" property="Rate" />
< /BODY>
< /HTML>
在 < jsp:useBean> 标记内定义了几个属性,其中 id 是整个 JSP 页面内该 Bean 的标识, scope 属性定义了该 Bean 的生存时间, class 属性说明了该 Bean 的类文件(从包名开始)。
这个 JSP 页面不仅使用了 Bean 的 set 和 get 方法设置和提取属性值,还用到了提取 Bean 属性值的第二种方法,即使用 < jsp:getProperty> 标记。 < jsp:getProperty> 中的 name 属性即为 < jsp:useBean> 中定义的 Bean 的 id ,它的 property 属性指定的是目标属性的名字。
事实证明, Java Servlet 是一种开发 Web 应用的理想构架。 JSP 以 Servlet 技术为基础,又在许多方面作了改进。 JSP 页面看起来象普通 HTML 页面,但它允许嵌入执行代码,在这一点上,它和 ASP 技术非常相似。利用跨平台运行的 JavaBean 组件, JSP 为分离处理逻辑与显示样式提供了卓越的解决方案。 JSP 必将成为 ASP 技术的有力竞争者。
在 Sun 正式发布 JSP(JavaServer Pages) 之后,这种新的 Web 应用开发技术很快引起了人们的关注。 JSP 为创建高度动态的 Web 应用提供了一个独特的开发环境。按照 Sun 的说法, JSP 能够适应市场上包括 Apache WebServer 、 IIS4.0 在内的 85% 的服务器产品。即使您对 ASP “ 一往情深 ” ,我们认为,关注 JSP 的发展仍旧很有必要。
㈠ JSP 与 ASP 的简单比较
JSP 与 Microsoft 的 ASP 技术非常相似。两者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。在 ASP 或 JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 和 JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到 HTML 代码中,然后一起发送给浏览器。 ASP 和 JSP 都是面向 Web 服务器的技术,客户端浏览器不需要任何附加的软件支持。
ASP 的编程语言是 VBScript 之类的脚本语言, JSP 使用的是 Java ,这是两者最明显的区别。此外, ASP 与 JSP 还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在 ASP 下, VBScript 代码被 ASP 引擎解释执行;在 JSP 下,代码被编译成 Servlet 并由 Java 虚拟机执行,这种编译操作仅在对 JSP 页面的第一次请求时发生。
㈡运行环境
Sun 公司的 JSP 主页在 http://www.javasoft.com/products/jsp/index.html ,从这里还可以下载 JSP 规范,这些规范定义了供应商在创建 JSP 引擎时所必须遵从的一些规则。
执行 JSP 代码需要在服务器上安装 JSP 引擎。此处我们使用的是 Sun 的 JavaServer Web Development Kit ( JSWDK )。为便于学习,这个软件包提供了大量可供修改的示例。安装 JSWDK 之后,只需执行 startserver 命令即可启动服务器。在默认配置下服务器在端口 8080 监听,使用 http://localhost:8080 即可打开缺省页面。
在运行 JSP 示例页面之前,请注意一下安装 JSWDK 的目录,特别是 “ work ” 子目录下的内容。执行示例页面时,可以在这里看到 JSP 页面如何被转换成 Java 源文件,然后又被编译成 class 文件(即 Servlet )。 JSWDK 软件包中的示例页面分为两类,它们或者是 JSP 文件,或者是包含一个表单的 HTML 文件,这些表单均由 JSP 代码处理。与 ASP 一样, JSP 中的 Java 代码均在服务器端执行。因此,在浏览器中使用 “ 查看源文件 ” 菜单是无法看到 JSP 源代码的,只能看到结果 HTML 代码。所有示例的源代码均通过一个单独的 “ examples ” 页面提供。
㈢ JSP 页面示例
下面我们分析一个简单的 JSP 页面。您可以在 JSWDK 的 examples 目录下创建另外一个目录存放此文件,文件名字可以任意,但扩展名必须为 .jsp 。从下面的代码清单中可以看到, JSP 页面除了比普通 HTML 页面多一些 Java 代码外,两者具有基本相同的结构。 Java 代码是通过 < % 和 %> 符号加入到 HTML 代码中间的,它的主要功能是生成并显示一个从 0 到 9 的字符串。在这个字符串的前面和后面都是一些通过 HTML 代码输出的文本。
< HTML>
< HEAD>< TITLE>JSP 页面 < /TITLE>< /HEAD>
< BODY>
< %@ page language="java" %>
< %! String str="0"; %>
< % for (int i=1; i < 10; i++) {
str = str + i;
} %>
JSP 输出之前。
< P>
< %= str %>
< P>
JSP 输出之后。
< /BODY>
< /HTML>
这个 JSP 页面可以分成几个部分来分析。
首先是 JSP 指令。它描述的是页面的基本信息,如所使用的语言、是否维持会话状态、是否使用缓冲等。 JSP 指令由 < %@ 开始, %> 结束。在本例中,指令 “ < %@ page language="java" %> ” 只简单地定义了本例使用的是 Java 语言(当前,在 JSP 规范中 Java 是唯一被支持的语言)。
接下来的是 JSP 声明。 JSP 声明可以看成是定义类这一层次的变量和方法的地方。 JSP 声明由 < %! 开始, %> 结束。如本例中的 “ < %! String str="0"; %> ” 定义了一个字符串变量。在每一项声明的后面都必须有一个分号,就象在普通 Java 类中声明成员变量一样。
位于 < % 和 %> 之间的代码块是描述 JSP 页面处理逻辑的 Java 代码,如本例中的 for 循环所示。
最后,位于 < %= 和 %> 之间的代码称为 JSP 表达式,如本例中的 “ < %= str %> ” 所示。 JSP 表达式提供了一种将 JSP 生成的数值嵌入 HTML 页面的简单方法。
二、会话状态管理
会话状态维持是 Web 应用开发者必须面对的问题。有多种方法可以用来解决这个问题,如使用 Cookies 、隐藏的表单输入域,或直接将状态信息附加到 URL 中。 Java Servlet 提供了一个在多个请求之间持续有效的会话对象,该对象允许用户存储和提取会话状态信息。 JSP 也同样支持 Servlet 中的这个概念。
在 Sun 的 JSP 指南 中可以看到许多有关隐含对象的说明(隐含的含义是,这些对象可以直接引用,不需要显式地声明,也不需要专门的代码创建其实例)。例如 request 对象,它是 HttpServletRequest 的一个子类。该对象包含了所有有关当前浏览器请求的信息,包括 Cookies , HTML 表单变量等等。 session 对象也是这样一个隐含对象。这个对象在第一个 JSP 页面被装载时自动创建,并被关联到 request 对象上。与 ASP 中的会话对象相似, JSP 中的 session 对象对于那些希望通过多个页面完成一个事务的应用是非常有用的。
为说明 session 对象的具体应用,接下来我们用三个页面模拟一个多页面的 Web 应用。第一个页面( q1.html )仅包含一个要求输入用户名字的 HTML 表单,代码如下:
< HTML>
< BODY>
< FORM METHOD=POST ACTION="q2.jsp">
请输入您的姓名:
< INPUT TYPE=TEXT NAME="thename">
< INPUT TYPE=SUBMIT VALUE="SUBMIT">
< /FORM>
< /BODY>
< /HTML>
第二个页面是一个 JSP 页面( q2.jsp ),它通过 request 对象提取 q1.html 表单中的 thename 值,将它存储为 name 变量,然后将这个 name 值保存到 session 对象中。 session 对象是一个名字 / 值对的集合,在这里,名字 / 值对中的名字为 “ thename ” ,值即为 name 变量的值。由于 session 对象在会话期间是一直有效的,因此这里保存的变量对后继的页面也有效。 q2.jsp 的另外一个任务是询问第二个问题。下面是它的代码:
< HTML>
< BODY>
< %@ page language="java" %>
< %! String name=""; %>
< %
name = request.getParameter("thename");
session.putValue("thename", name);
%>
您的姓名是: < %= name %>
< p>
< FORM METHOD=POST ACTION="q3.jsp">
您喜欢吃什么 ?
< INPUT TYPE=TEXT NAME="food">
< P>
< INPUT TYPE=SUBMIT VALUE="SUBMIT">
< /FORM>
< /BODY>
< /HTML>
第三个页面也是一个 JSP 页面( q3.jsp ),主要任务是显示问答结果。它从 session 对象提取 thename 的值并显示它,以此证明虽然该值在第一个页面输入,但通过 session 对象得以保留。 q3.jsp 的另外一个任务是提取在第二个页面中的用户输入并显示它:
< HTML>
< BODY>
< %@ page language="java" %>
< %! String food=""; %>
< %
food = request.getParameter("food");
String name = (String) session.getValue("thename");
%>
您的姓名是: < %= name %>
< P>
您喜欢吃: < %= food %>
< /BODY>
< /HTML>
三、引用 JavaBean 组件
JavaBean 是一种基于 Java 的软件组件。 JSP 对于在 Web 应用中集成 JavaBean 组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为 JSP 应用带来了更多的可伸缩性。 JavaBean 组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据提取等。如果我们有三个 JavaBean ,它们分别具有显示新闻、股票价格、天气情况的功能,则创建包含所有这三种功能的 Web 页面只需要实例化这三个 Bean ,使用 HTML 表格将它们依次定位就可以了。
为说明在 JSP 环境下 JavaBean 的应用,我们创建了一个名为 TaxRate 的 Bean 。它有两个属性,即 Product (产品)和 Rate (税率)。两个 set 方法分别用来设置这两个属性,两个 get 方法则用于提取这两个属性。在实际应用中,这种 Bean 一般应当从数据库提取税率值,此处我们简化了这个过程,允许任意设定税率。下面是这个 Bean 的代码清单:
package tax;
public class TaxRate {
String Product;
double Rate;
public TaxRate() {
this.Product = "A001";
this.Rate = 5;
}
public void setProduct (String ProductName) {
this.Product = ProductName;
}
public String getProduct() {
return (this.Product);
}
public void setRate (double rateValue) {
this.Rate = rateValue;
}
public double getRate () {
return (this.Rate);
}
}
在 JSP 页面中应用上述 Bean 要用到 < jsp:useBean> 标记。依赖于具体使用的 JSP 引擎的不同,在何处配置以及如何配置 Bean 的方法也可能略有不同。本文将这个 Bean 的 .class 文件放在 c:jswdk-1.0examplesWEB-INFjspbeanstax 目录下,这里的 tax 是一个专门存放该 Bean 的目录。下面是一个应用上述 Bean 的示例页面:
< HTML>
< BODY>
< %@ page language="java" %>
< jsp:useBean id="taxbean" scope="application" class="tax.TaxRate" />
< % taxbean.setProduct("A002");
taxbean.setRate(17);
%>
使用方法 1 : < p>
产品 : < %= taxbean.getProduct() %> < br>
税率 : < %= taxbean.getRate() %>
< p>
< % taxbean.setProduct("A003");
taxbean.setRate(3);
%>
< b> 使用方法 2 : < /b> < p>
产品 : < jsp:getProperty name="taxbean" property="Product" />
< br>
税率 : < jsp:getProperty name="taxbean" property="Rate" />
< /BODY>
< /HTML>
在 < jsp:useBean> 标记内定义了几个属性,其中 id 是整个 JSP 页面内该 Bean 的标识, scope 属性定义了该 Bean 的生存时间, class 属性说明了该 Bean 的类文件(从包名开始)。
这个 JSP 页面不仅使用了 Bean 的 set 和 get 方法设置和提取属性值,还用到了提取 Bean 属性值的第二种方法,即使用 < jsp:getProperty> 标记。 < jsp:getProperty> 中的 name 属性即为 < jsp:useBean> 中定义的 Bean 的 id ,它的 property 属性指定的是目标属性的名字。
事实证明, Java Servlet 是一种开发 Web 应用的理想构架。 JSP 以 Servlet 技术为基础,又在许多方面作了改进。 JSP 页面看起来象普通 HTML 页面,但它允许嵌入执行代码,在这一点上,它和 ASP 技术非常相似。利用跨平台运行的 JavaBean 组件, JSP 为分离处理逻辑与显示样式提供了卓越的解决方案。 JSP 必将成为 ASP 技术的有力竞争者。
JSP
开发入门
(
四
)--JSP
的内部对象
最后一个与
JSP
语法有关的组件叫做内部对象
.
在
JSP
小型指令文件内,你可以存取这些内部对象来与执行
JSP
网页的
servlet
环境相互作用。许多对内部对象的存取应该要简化。然而,这些是范例,它们的存取都是可接受的,要完整的利用内部对象设定则需要对最新的
Java Servlet API
有所了解。
下表列出你可以使用的内部对象。
内部对象说明
request 客户端请求,此请求会包含来自 GET/POST 请求的参数
response 网页传回客户端的响应
pageContext 网页的属性是在这里管理
session 与请求有关的会话
application servlet 正在执行的内容
out 用来传送响应的输出流
config servlet 的架构对象
page JSP 网页本身
exception 针对错误网页,未捕捉的例外
那么,这些是做什么的,而你应该如何使用它们呢 ? 基本上,在你的小型指令文件里,你可以使用它们来存取执行 JSP 程序代码的 servlet 。为了避免谈论到太多 Servlet API 的细节,让我们来检视一些你可以利用它们来做的事 :
不必使用表达式,你可以直接存取内部 out 对象来打印一些东西到 response:
<% out.println("Hello"); %>.
不必直接传送参数到 JavaBean ,你可以藉由请求对象来取得参数的值 :
<% String name=request.getParameter("name"); out.println(name); %> 。
当你以 JSP 写了许多的应用程序之后,如果你建立了 JavaBeans 或者发现你自己将太多的 Java 原始码放入你的 JSP 档案,你需要建立支持的 Java 类别,这样可以鼓励重复使用并且降低 JSP 网页转换时所需要的时间。当你需要建立 Java 类别时,你必须 :
将 JDSWK 的安装目录 /bin 目录加到你的 PATH 。在你的 autoexec.bat 档案的 PATH 行的最后,加入 C:/1.2.2/bin; 。
以下面的指令将 JAR 档案复制到 /jre/lib/ext 目录 :
copy c:/jswdk-1.0.1/lib/servlet.jar c:/jdk1.2.2/jre/lib/ext.
下表列出你可以使用的内部对象。
内部对象说明
request 客户端请求,此请求会包含来自 GET/POST 请求的参数
response 网页传回客户端的响应
pageContext 网页的属性是在这里管理
session 与请求有关的会话
application servlet 正在执行的内容
out 用来传送响应的输出流
config servlet 的架构对象
page JSP 网页本身
exception 针对错误网页,未捕捉的例外
那么,这些是做什么的,而你应该如何使用它们呢 ? 基本上,在你的小型指令文件里,你可以使用它们来存取执行 JSP 程序代码的 servlet 。为了避免谈论到太多 Servlet API 的细节,让我们来检视一些你可以利用它们来做的事 :
不必使用表达式,你可以直接存取内部 out 对象来打印一些东西到 response:
<% out.println("Hello"); %>.
不必直接传送参数到 JavaBean ,你可以藉由请求对象来取得参数的值 :
<% String name=request.getParameter("name"); out.println(name); %> 。
当你以 JSP 写了许多的应用程序之后,如果你建立了 JavaBeans 或者发现你自己将太多的 Java 原始码放入你的 JSP 档案,你需要建立支持的 Java 类别,这样可以鼓励重复使用并且降低 JSP 网页转换时所需要的时间。当你需要建立 Java 类别时,你必须 :
将 JDSWK 的安装目录 /bin 目录加到你的 PATH 。在你的 autoexec.bat 档案的 PATH 行的最后,加入 C:/1.2.2/bin; 。
以下面的指令将 JAR 档案复制到 /jre/lib/ext 目录 :
copy c:/jswdk-1.0.1/lib/servlet.jar c:/jdk1.2.2/jre/lib/ext.
JSP
开发入门
(
五
)--JSP
其他相关资源
JSP
其他相关资源:
Servlets and JavaServer Pages (JSP) 1.0: A Tutorial
http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
JavaServer PagesTM: A Developer's Perspective
http://developer.java.sun.com/developer/technicalArticles/Programming/jsp/
JAVASERVER PAGESTM NEWS & ARTICLES
http://java.sun.com/products/jsp/news.html
JAVASERVER PAGESTM TECHNICAL RESOURCES
http://java.sun.com/products/jsp/technical.html
SERVLETS TAVERNE
http://www.interpasnet.com/JSS/
servlets.com
http://www.servlets.com/
Servlets and JavaServer Pages (JSP) 1.0: A Tutorial
http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
JavaServer PagesTM: A Developer's Perspective
http://developer.java.sun.com/developer/technicalArticles/Programming/jsp/
JAVASERVER PAGESTM NEWS & ARTICLES
http://java.sun.com/products/jsp/news.html
JAVASERVER PAGESTM TECHNICAL RESOURCES
http://java.sun.com/products/jsp/technical.html
SERVLETS TAVERNE
http://www.interpasnet.com/JSS/
servlets.com
http://www.servlets.com/
JSP 里有表达式,评估表达式的结果可以转换成字符串并且直接使用在输出网页上。 JSP 运算是属于 <%= ?%> 卷标里,并不包含分号,加引号字符串的无用部分。
<%= i %>
<%= "Hello" %> 。
程序代码段 / 小型指令文件
JSP 程序代码片段或小型指令文件是包含在 <% ?%> 卷标里。当网络服务器接受这段请求时,这段 Java 程序代码会执行。小型指令文件可以是原始的 HTML 或 XML ,其内部的程序代码片段可以让你建立有条件的执行程序代码,或者只是一些使用另一块程序代码的东西。举例来说,下列的程序代码结合了表达式与小型指令文件,在 H1 , H2 , H3 ,以及 H4 卷标里显示字符串 "Hello" 。小型指令文件不限于一行的原始程序代码 :
<% for (int i=1; i<=4; i++) { %>
<H<%=i%>>Hello</H<%=i%>>
<% } %> 。
注释
最后一个主要 JSP 组件是嵌入式注释。虽然你可以在你的档案里包含 HTML 注释,如果使用者检视网页的原始码,他们也会看到这些注释。如果你不要让使用者看到你的批注,你可以将它放在 <%-- ?--%> 卷标里 :
<%-- 针对服务器端的注释 --%> 。