JSP(JavaServer Pages)是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
JSP(全称 JavaServer Pages)是由 Sun Microsystems 公司主导创建的一种动态网页技术标准。JSP 部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。JSP 技术以 Java 语言作为脚本语言,为用户的 HTTP 请求提供服务,并能与服务器上的其它 Java 程序共同处理复杂的业务需求。
JSP 将 Java 代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP 引入了被称为“JSP 动作”的 XML 标签,用来调用内建功能。另外,可以创建 JSP 标签库,然后像使用标准 HTML 或 XML 标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP 文件在运行时会被其编译器转换成更原始的 Servlet 代码。JSP 编译器可以把 JSP 文件编译成用 Java 代码写的 Servlet,然后再由 Java 编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
能以模板化的方式简单、高效地添加动态网页内容。
可利用 JavaBean 和标签库技术复用常用的功能代码(设计好的组件容易实现重复利用,减少重复劳动)。标签库不仅带有通用的内置标签(JSTL),而且支持可扩展功能的自定义标签。
有良好的工具支持。
继承了 Java 语言的相对易用性。
继承了 Java 的跨平台优势,实现“一次编写,处处运行”。因为支持 Java 及其相关技术的开发平台多,网站开发人员可以选择在最适合自己的系统平台上进行 JSP 开发;不同环境下开发的 JSP 项目,在所有客户端上都能顺利访问。
页面中的动(控制变动内容的部分)/静(内容不需变动的部分)区域以分散但又有序的形式组合在一起,能使人更直观地看出页面代码的整体结构,也使得设计页面效果和程序逻辑这 2 部分工作容易分离(外观视图与逻辑分离)。从而方便分配人员并发挥各自长处,实现高效地分工合作。
可与其它企业级 Java 技术相互配合。JSP 可以只专门负责页面中的数据呈现,实现分层开发。
JSP 指令
JSP 指令控制 JSP 编译器如何去生成 servlet,以下是可用的指令:
包含指令 include –包含指令通知 JSP 编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和 C 预处理器所提供的很类似。被包含文件的扩展名一般都是”jspf”(即 JSPFragment,JSP 片段):
<%@ include file=”somefile.jsp” %>
页面指令 page –页面指令有以下几个选项:
import 使一个 JAVA 导入声明被插入到最终页面文件。contentType 规定了生成内容的类型。当生成非 HTML 内容或者当前字符集并非默认字符集时使用。errorPage 处理 HTTP 请求时,如果出现异常则显示该错误提示信息页面。isErrorPage 如果设置为 TRUE,则表示当前文件是一个错误提示页面。isThreadSafe 表示最终生成的 servlet 是否具有线程安全性。
<%@ page import=”java.util.*” %> //example import 导入样例<%@ page contentType=”text/html” %> //example contentType 页面类型样例<%@ page isErrorPage=false %> //example for non error page 无错页面样例<%@ page isThreadSafe=true %> //example for a thread safe JSP 执行绪安全 JSP 样例
注意:在同一个 JSP 文件中只有“import”导入页面指令可以被多次使用。
标签库指令 taglib –标签库指令描述了要使用的 JSP 标签库。该指令需要指定一个前缀 prefix(和 C++的名字空间很类似)和标签库的描述 URI:
<%@ taglib prefix=”myprefix” uri=”taglib/mytag.tld” %>
JSP2.0 中的一个主要功能是 JSP fragment,它的基本特点是可以使处理 JSP 的容器推迟评估 JSP 标记属性。我们知道一般 JSP 是首先评估 JSP 标记的属性,然后在处理 JSP 标记时使用这些属性,而 JSP fragment 提供了动态的属性。也就是说,这些属性在 JSP 处理其标记体时是可以被改变的。JSP 需要将这样的属性定义为 javax.servlet.jsp.tagext.JspFragment 类型。当 JSP 标记设置成这种形式时,这种标记属性实际上的处理方法类似于标记体。在实现标记的程序中,标记属性可以被反复评估多次。这种用法称为 JSP fragment。JSP fragment 还可以定义在一个 SimpleTag 处理程序中使用的自制标记动作。像前面例子说明的,getJspBody 返回一个 JspFragment 对象并可以在 doTag 方法中多次使用。需要注意的是,使用 JSP fragment 的 JSP 只能有一般的文本和 JSP action,不能有 scriptlet 和 scriptlet 表达式。
句法
一个 JSP 页面可以被分为以下几部份:
静态数据,如 HTML
JSP 指令,如 include 指令
JSP 脚本元素和变量
JSP 动作
用户自定义标签
静态数据在输入文件中的内容和输出给 HTTP 响应的内容完全一致。此时,该 JSP 输入文件会是一个没有内嵌 JAVA 或动作的 HTML 页面。而且,客户端每次请求都会得到相同的响应内容。
JSP 指令控制 JSP 编译器如何去生成 servlet,以下是可用的指令:
包含指令 include –包含指令通知 JSP 编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和 C 预处理器所提供的很类似。被包含文件的扩展名一般都是”jspf”(即 JSPFragment,JSP 碎片):
<%@ include file=”somefile.jsp” %>
页面指令 page –页面指令有以下几个选项:
import
使一个 JAVA 导入声明被插入到最终页面文件。
contentType
规定了生成内容的类型。当生成非 HTML 内容或者当前字符集 character set 并非默认字符集时使用。
errorPage
处理 HTTP 请求时,如果出现异常则显示该错误提示信息页面。
isErrorPage
如果设置为 TRUE,则表示当前文件是一个错误提示页面。
isThreadSafe
表示最终生成的 servlet 是否安全线程(threadsafe)。
<%@ page import=”java.util.*” %> //example import 导入样例<%@ page contentType=”text/html” %> //example contentType 页面类型样例<%@ page isErrorPage=false %> //example for non error page 无错页面样例<%@ page isThreadSafe=true %> //example for a thread safe JSP 安全线程 JSP 样例
注意:在同一个 JSP 文件中只有”import”导入页面指令可以被多次使用。
标签库指令 taglib –标签库指令描述了要使用的 JSP 标签库。该指令需要指定一个前缀 prefix(和 C++的命名空间很类似)和标签库的描述 URI:
<%@ taglib prefix=”myprefix” uri=”taglib/mytag.tld” %>
为了快速方便地进行动态网站的开发,JSP 在以下几个方面做了改进,使其成为快速建立跨平台的动态网站的首选方案。
1.将内容的生成和显示进行分离
用 JSP 技术,Web 页面开发人员可以使用 HTML 或者 XML 标识来设计和格式化最终页面,并使用 JSP 标识或者小脚本来生成页面上的动态内容(内容是根据请求变化的,例如请求账户信息或者特定的一瓶酒的价格等)。生成内容的逻辑被封装在标识和 JavaBeans 组件中,并且捆绑在脚本中,所有的脚本在服务器端运行。由于核心逻辑被封装在标识和 JavaBeans 中,所以 Web 管理人员和页面设计者,能够编辑和使用 JSP 页面,而不影响内容的生成。
在服务器端,JSP 引擎解释 JSP 标识和脚本,生成所请求的内容(例如,通过访问 JavaBeans 组件,使用 JDBC 技术访问数据库或者包含文件),并且将结果以 HTML(或者 XML)页面的形式发送回浏览器。这既有助于作者保护自己的代码,又能保证任何基于 HTML 的 Web 浏览器的完全可用性。
绝大多数 JSP 页面依赖于可重用的、跨平台的组件(JavaBeans 或者 Enterprise JavaBeans 组件)来执行应用程序所要求的复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者和客户团体所使用。基于组件的方法加速了总体开发过程,并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。
Web 页面开发人员不会都是熟悉脚本语言的编程人员。JSP 技术封装了许多功能,这些功能是在易用的、与 JSP 相关的 XML 标识中进行动态内容生成所需要的。标准的 JSP 标识能够访问和实例化 JavaBeans 组件,设置或者检索组件属性,下载 Applet,以及执行用其他方法更难于编码和耗时的功能。
几乎所有平台都支持 Java,JSP+JavaBeans 几乎可以在所有平台下通行无阻。从一个平台移植到另外一个平台,JSP 和 JavaBeans 甚至不用重新编译,因为 Java 字节码都是标准的与平台无关的。
Java 中连接数据库的技术是 JDBC,Java 程序通过 JDBC 驱动程序与数据库相连,执行查询、提取数据等操作。Sun 公司还开发了 JDBC-ODBC bridge,利用此技术 Java 程序可以访问带有 ODBC 驱动程序的数据库,大多数数据库系统都带有 ODBC 驱动程序,所以 Java 程序能访问诸如 Oracle、Sybase、MS SQL Server 和 MS Access 等数据库。
此外,通过开发标识库,JSP 技术可以进一步扩展。第三方开发人员和其他人员可以为常用功能创建自己的标识库。这使得 Web 页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来进行工作。
JSP 技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且能扩展到支持企业级的分布式应用中。作为采用 Java 技术家族的一部分,以及 Java 2(企业版体系结构)的一个组成部分,JSP 技术能够支持高度复杂的基于 Web 的应用。 由于 JSP 页面的内置脚本语言是基于 Java 的,而且所有的 JSP 页面都被编译成为 Java Servlets,所以 JSP 页面具有 Java 技术的所有好处,包括健壮的存储管理和安全性。作为 Java 平台的一部分,JSP 拥有 Java 编程语言“一次编写,各处运行”的特点。
优点
(1)一次编写,到处运行。除了系统之外,代码不用做任何更改。
(2)系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比 ASP 的局限性 JSP 的优势是显而易见的。
(3)强大的可伸缩性。从只有一个小的 Jar 文件就可以运行 Servlet/JSP,到由多台服务器进行集群和负载均衡,到多台 Application 进行事务处理,消息处理,一台服务器到无数台服务器,Java 显示了一个巨大的生命力。
(4)多样化和功能强大的开发工具支持。这一点与 ASP 很像,Java 已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。
(5)支持服务器端组件。web 应用需要强大的服务器端组件来支持,开发人员需要利用其他工具设计实现复杂功能的组件供 web 页面调用,以增强系统性能。JSP 可以使用成熟的 JAVA BEANS 组件来实现复杂商务功能。