JSP是建立在Java Servlets模型之上的表达层技术,它使编写HTML变得更简单。像SSJS一样,它也允许你将静态HTML内容与服务器端脚本混合起来生成动态输出。JSP把Java作为默认的脚本语言,然而,就像ASP可以使用其他语言(如javascript和VBScript)一样,JSP 规范也允许使用其他语言。尽管JSP和Java比那些基于简单语言的脚本平台(如javascript 和VBScript)具有更好的兼容性和坚固性,但同时Java的学习难度也比简单的脚本语言要大。
为了兼顾两者的优点――一个健壮的web应用平台和一种简单易用的语言工具――JSP 提供了大量的服务器端标签(Tag),这使得开发者可以在不写Java代码的情况下完成大多数动态内容操作。那些只熟悉编写脚本的开发人员,甚至仅仅是HTML设计者,就可以使用J SP标签生成简单的输出而不必学习Java。高级的脚本编写者或Java程序员也可以使用这些标签,如果要在JSP页面中完成更高级的操作,他们可以使用完整的Java语言。
Page过时了,Component妙极了
要理解JSP怎样联合无限的力量来轻而易举地实现魔术般的效果,你必须首先了解“组件为中心的网页开发”和“页面为中心的网页开发”的区别。
SSJS和ASP都是在几年前推出的,那时网络还很年轻,没有人知道除了把所有的商务、数据和表达逻辑统统堆进原始网页中之外还有什么更好的解决方法。这种以页面为中心的模型容易学习并且得到相当快
速的发展。然而,随着时间的推移,人们认识到这种方法不适于构建大型的、可升级的web应用程序。在脚本环境中书写的表达逻辑被锁在页面内,只有通过剪切和粘贴才能被重用。表达逻辑通常和商务及数据逻辑混在一起,这使得当程序员试图改变一个应用程序的外观而不想破坏与之紧密结合的商务逻辑时,应用程序的维护就像在蛋壳上走路一样困难。其实在企业中,可重用组件的应用早已经很成熟,没有人愿意为他们的应用程序重写那些逻辑。HTML和图形设计师把他们的设计的实施工作交给了web编写者,使他们不得不加倍工作――常常是手工编写,因为没有合适的工具可以把服务器端脚本与HTM L内容结合起来。简而言之,随着web应用程序的复杂性不断提升,以页面为中心的开发方式的局限性变得明显起来。
与此同时,人们一直在寻建立web应用程序的更好方法,组件在客户机-服务器领域风行起来。JavaBeans和ActiveX被“快速应用程序开发”(RAD)工具发行商推广给Java和W indows应用程序开发者用来快速开发复杂的程序。这些技术使某领域内的专家可以为本领域内的垂直应用编写组件,而开发者可以直接拿来使用而不必掌握这一领域的专门技术。比如,编制旅鼠交配习性图表的Java程序员不需要了解任何关于旅鼠的知识,他只要调用 Lemmi ngsInLove JavaBeans(JavaBeans是一种基于Java的组件)就可得到相应的领域专门信息,他只需关注如何使软件更易于使用。出现一种把组件为中心的程序设计方法带到服务器端w eb应用领域的技术只是时间的问题。
作为一种以组件为中心的开发平台,JSP出现了。它以JavaBeans和Enterprise JavaB eans(EJB)
组件包含商务和数据逻辑的模型为基础,提供大量标签和一个脚本平台用来在H TML页中显示由JavaBeans产生或回送的内容。由于JSP的以组件为中心的性质,他可以被Ja va和非Java开发者同样使用。非Java开发者可以通过JSP的标签(Tags)来使用高级Java开发者创建的JavaBeans。Java开发者不仅可以创建和使用JavaBeans,还能在JSP页中使用Ja
va语言来更精密地控制基于底层JavaBeans的表达逻辑。
JSP请求模型
现在我们来看看JSP是如何处理HTTP请求的。在基本请求模型中,一个请求直接被送到J SP页中。图1说明了这个模型中的信息流程。JSP代码控制着进行逻辑处理时与JavaBeans 组件的交互,并在动态生成的、混合了静态HTML代码的HTML页中显示结果。
图1.基本JSP请求模型
Beans 可以是JavaBeans 或EJB组件。另外,更加复杂的请求模型可看作从被请求页呼叫其他JSP页或Java Servlets。
JSP引擎技术内幕
JSP引擎实际上要把JSP标签、JSP页中的Java代码甚至连同静态HTML内容都转换为大块的Java代码。这些代码块被JSP引擎组织到用户看不到的Java servlet中去,然后Servlet自动把它们编译成Java字节码。这样,当网站的访问者请求一个JSP页时,在他不知道的情况下,一个已经生成的、预编译过的servlet实际上将完成所有的工作。非常隐蔽-而又高效。因为servlet是编译过的,所以网页中的JSP代码不需要在每次请求该页时被解释一遍。JSP 引擎只需在servlet代码最后被修改后编译一次,然后这个编译过的servlet就可以被执行了。由于是JSP引擎自动生成并编译Servlet,不用程序员动手编译代码,所以JSP能带给你高效的性能和快速开发所需的灵活性。
如果你从Sun的网站下载JSP reference implementation并用它编写应用程序,你将能够看到JSP引擎生成的.java和.class文件。如果你想更多地了解所生成的代码,可以用文本编辑器打开.java文件查看Java Servlet的代码。
一、 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 主页在 www.Javasoft/products/jsp/index.html ,从这里还可以下载 JSP 规范,这些规范定义了供应商在创建 JSP 引擎时所必须遵从的一些规则。
执行 JSP 代码需要在服务器上安装 JSP 引擎。此处我们使用的是 Sun 的 JavaServer Web Development Kit ( JSWDK )。为便于学习,这个软件包提供了大量可供修改的示例。安装 JSWDK 之后,只需执行 startserver 命令即可启动服务器。在默认配置下服务器在端口 8080 监听,使用 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 V ALUE="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 = Parameter("thename");
session.putValue("thename", name);
%>
您的姓名是: < %= name %>
< p>
< FORM METHOD=POST ACTION="q3.JSP">
您喜欢吃什么 ?
< INPUT TYPE=TEXT NAME="food">
< P>
< INPUT TYPE=SUBMIT V ALUE="SUBMIT">
< /FORM>
java修改html文件< /BODY>
< /HTML>
第三个页面也是一个 JSP 页面( q3.jsp ),主要任务是显示问答结果。它从 session 对象提取 thena
me 的值并显示它,以此证明虽然该值在第一个页面输入,但通过 session 对象得以保留。 q3.JSP 的另外一个任务是提取在第二个页面中的用户输入并显示它:
< HTML>
< BODY>
< %@ page language="Java" %>
< %! String food=""; %>
< %
food = Parameter("food");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。