1、 1 JSP 基础学习资料 一、 JSP 技术概述 在 Sun 正式发布 JSP(JavaServer Pages) 之后,这种新的 Web 应用开发技术很快引起了人们的关注。 JSP 为创建高度动态的 Web 应用提供了一个独特的开发环境。按照 Sun 的说法, JSP 能够适应市场上包括 Apache WebServer 、 IIS4.0 在内的 85% 的服务器产品。即使您对 ASP “一往情深 ”,我们认为,关注 JSP 的发展仍旧很有必要。 JSP 与 ASP 的简单比较 JSP 与 Microsoft 的 ASP 技术非常相似。两者都提供在 HTML 代码中混合某种程序代码、由语言
2、引擎解释执行程序代码的能力。在 ASP 或 JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 和 JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到 HTML 代码中,然后一起发送给浏览器。 ASP 和 JSP 都是面向 Web 服务器的技术,客户端浏览器不需要任何附加 的软件支持。 ASP 的编程语言是 VBScript 之类的脚本语言, JSP 使用的是 Java ,这是两者最明显的区别。此外, ASP 与 JSP 还有一个更为本质的区别:两种语言引擎用完全不同
3、的方式处理页面中嵌入的程序代码。在 ASP 下, VBScript 代码被 ASP 引擎解释执行;在 JSP 下,代码被编译成 Servlet 并由 Java 虚拟机执行,这种编译操作仅在对 JSP 页面的第一次请求时发生。 运行环境 Sun 公司的 JSP 主页在 http:/ ,从这里还可以下载 JSP 规范,这些规范定义了供应商在创建 JSP 引擎时所必须遵从的一些规则。 执行 JSP 代码需要在服务器上安装 JSP 引擎。此处我们使用的是 Sun 的 JavaServer Web Development Kit ( JSWDK )。为便于学习,这个软件包提供了大量可供修改的示例。安装
4、JSWDK 之后,只需执行 startserver 命令即可启动服务器。在默认配置下服务器在端口 8080 监听,使用 http:/localhost:8080 即可打开缺省页面。 在运行 JSP 示例页面之前,请注意一下安装 JSWDK 的目录,特别是 “ work ”子目录下的内容。执行示例页面时,可以在这里看到 JSP 页面如何被转换成 Java 源文件,然后又被编译成 class 文件(即 Servlet )。 JSWDK 软件包中的示例页 2 面分为两类,它们或者是 JSP 文件,或者是包含一个表单的 HTML 文件,这些表单均由 JSP 代码处理。与 ASP 一样, JSP 中的
5、Java 代码均在服务器端执行。因此,在浏览器中使用 “查看源文件 ”菜单是无法看到 JSP 源代码的,只能看到结果 HTML 代码。所有示例的源代码均通过一个单独的 “ examples ”页面提供。 JSP 页面示例 下面我们分析一个简单的 JSP 页面。您可以在 JSWDK 的 examples 目录下创建另外一个目录存放此文件,文件名字可以任意,但扩展名必须为 .jsp 。从下面的代码清单中可以看到, JSP 页面除了比普通 HTML 页面多一些 Java 代码外,两者具有基本相同的结构。 Java 代码是通过 符号加入到 HTML 代码中间的,它的主要功能是生成并显示一个从 0 到
6、9 的字符串。在这个字符串的前面和后面都是一些通过 HTML 代码输出的文本。 JSP 页面 % for (int i=1; i JSP 输出之前。 JSP 输出之后。 这个 JSP 页面可以分成几个部分来分析。 首先是 JSP 指令。它描述的是页面的基本信息,如所使用的语言、是否维持会话状态、是否使用缓冲等。 JSP 指令由 结束。在本例中,指令 “ ”只简单地定义了本例使用的 是 Java 语言(当前,在 JSP 规范中 Java 是唯一被支持的语言)。 接下来的是 JSP 声明。 JSP 声明可以看成是定义类这一层次的变量和方法的地方。 JSP 声明由 结束。如本例中的 “ ”定义了一个
7、字符串变量。在每一项声明的后面都必须有一个分号,就象在普通 Java 类中声明成员变量一样。 位于 之间的代码块是描述 JSP 页面处理逻辑的 Java 代码,如本 3 例中的 for 循环所示。 最后,位于 之间的代码称为 JSP 表达式,如本例中的 “ ”所示。 JSP 表达式提供了一种将 JSP 生成的数值嵌入 HTML 页面的简单方法。 二、会话状态管理 会话状态维持是 Web 应用开发者必须面对的问题。有多种方法可以用来解决这个问题,如使用 Cookies 、隐藏的表单输入域,或直接将状态信息附加到 URL 中。 Java Servlet 提供了一个在多个请求之间持续有效的会话对象,
8、该对象允许用户存储和提取会话状态信息。 JSP 也同样支持 Servlet 中的这个概念。 在 Sun 的 JSP 指南 中可以看到许多有关隐含对象的说明(隐含的含义是,这些对象可以直接引用,不需要显式地声明,也不需要专门的代码创建其实例)。例如 request 对象,它是 HttpServletRequest 的一个子类。该对象包含了所有有关当前浏览器请求的信息,包括 Cookies , HTML 表单变量等等。 session 对象也是这样一个隐含对象。这个对象在第一个 JSP 页面被装载时自动创建,并被关联到 request 对象上。与 ASP 中的会话对象相似, JSP 中的 sess
9、ion 对象对于那些希望通过多个页面完成一个事务的应用是非常有用的。 为说明 session 对象的具体应用,接下来我们用三个页面模拟一个多页面的 Web 应用。第一个页面( q1.html )仅包含一个要求输入用户名字的 HTML 表单,代码如下: 请输入您的姓名: 第二个页面是一个 JSP 页面( q2.jsp ),它通过 request 对象提取 q1.html 表单中的 thename 值,将它存储为 name 变量,然后将这个 name 值保存到 session 对象中。 session 对象是一个名字 / 值对的集合,在这里,名字 / 值对中的名字为 “ thename ”,值即为 name 变量的值。由于 session 对 象在会话期间是一直有效的,因此这里保存的变量对后继的页面也有效。 q2.jsp 的另外一个任务是询问第