(作者:天译编译 2000年12月01日 14:26)
JavaServerTM Pages(JSP)技术为我提供了一种建立动态网页de简单方法,而且也简化了构造web程序de工作.本文从一个开发人员de角度对JSP技术做了一个全面介绍(并提供了一些JSP实例程序).
前言
JavaServer Pages技术可以让web开发人员和设计人员非常容易de创建和维护动态网页,特别是目前de商业系统.作为JavaTM技术de一部分,JSP能够快速开发出基于web、独立于平台de应用程序.JSP 把用户界面从系统内容中分离开来,使得设计人员能够在不改变底层动态内容de前提下改变整个网页布局.
那么什么是JavaServer Page呢?简单de说,一个JSP网页就是在HTML网页中包含了能够生成动态内容de可执行应用程序相关代码.此应用程序可能包含JavaBeanTM,JDBCTM对象,Enterprise Java BeanTM (EJB)和Remote Method Invocation (RMI)对象,所有de部分都可以非常容易de从JSP网页上访问到.例如,一个JSP网页可以包含 HTML相关代码所显示de静态文本和图像,也可以调用一个JDBC对象来访问数据库;当网页显示到用户界面上以后,它将包含静态HTML内容和从数据库中找到相应de动态信息.
在JSP网页中,要把用户界面和应用程序分开可以考虑在网页设计人员和开发人员之间执行一个非常方便de授权任务.它也允许开发人员去建立灵活de相关代码,从而非常容易de进行更新和重复利用.由于JSP网页能够根据需要自动进行编译,web设计人员无须重新编译应用程序逻辑就可以改变表述相关代码.这也使得JSP与Java servlet(它是JavaSever Pages功能de扩展)相比成为一种可以更灵活生成动态web内容de方法.
JSP和Servlet
如果您已经用过Java servlet,那么您就会知道servlet可以让您建立动态生成de网页,而网页中包含有从服务器方deJava对象中所获得de数据.但是您也得知道servlet 生成网页de方法就是在Java类中嵌入HTML标签和表述相关代码.这就意味着改变表述相关代码需要修改和重新编译servlet源文件.因为设计HTML页面de设计人员可能与编写servlet相关代码de开发人员不是同一个人,更新基于servletdeweb应用程序就成了一件非常棘手de事情.
Enter JavaServer Page是Servlet APIde一个扩展.事实上,JSP网页在编译成servlet之前也可以使用,所以它们也具有servletde所有优势,包括访问Java API.由于JSP 是嵌入到servlet中关于应用程序de一般表述相关代码,所以他们能够被看成一种“彻底”deservlet.
JSP网页主要提供了一种建立servletde高水平方法,它还带来了其他de优点.即使您已经为web应用程序编写了servlet,使用JSP仍然有很多优势:
JSP网页可以非常容易de与静态模板结合,包括HTML 或XML 片段,以及生成动态内容de相关代码.
JSP网页可以在被请求de时候动态de编译成servlet,所以网页de设计人员可以非常容易de对表述相关代码进行更新.如果需要de话,JSP网页还可以进行预编译.
为了调用JavaBean组件,JSP标签可以完全管理这些组件,避免网页设计人员复杂化应用程序.
开发人员可以提供定制化deJSP标签库.
网页设计人员能够改变和编辑网页de固定模板部分而不影响应用程序.同样,开发人员也无须一个个编辑页面而只须对组件进行合理de改变.
通常,JSP允许开发人员向许多网页设计人员分发功能性应用程序.这些设计人员也不必知道Java编程语言或任何servlet相关代码,所以他们能够集中精力去编写HTML相关代码,而编程人员就可以集中精力去建立对象和应用程序.
建立JSP页面
粗略看来,JSP网页和HTML (或XML)网页非常相似——都包含用标签封装de文本(在“<>”之间被定义).当HTML标签被用户de浏览器处理以显示网页de时候,JSP标签能够通过web服务器de处理来生成动态内容.这些JSP标签能够定义个别de操作,比如说用一个方法来调用JavaBean,或者包含标准deJava相关代码块(也就是所谓descriptlet),这些相关代码块能够在网页被访问de时候被执行.
为了了解它们如何使用,下面我介绍了一个JSP网页de简单例子,在这个JSP网页中包含了静态HTML内容和从JavaBean生成de动态数据.当用户访问这个网页de时候,它可以显示当前de日期,并根据当前de时间增加相应de问候语(例如“早上好”和“下午好”).为简单起见,JSP标签显示在块中:
<%@ page language="java" imports="java.util.*" %>
Welcome
Today is
- Day: <%= clock.getDayOfMonth() %>
- Year: <%= clock.getYear() %>
<%-- Check for AM or PM --%>
<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
<%
if (time == Calendar.AM) {
%>
早上好
<%
}
else {
%>
下午好
<%
}
%>
<%@ include file="copyright.html" %>
上面deJSP例子是不是很简单?我在JSP网页中使用了几个不同de组件.这些组件包括下面de内容:
JSP action (或JSP标签)使用了多种函数并扩展了JSPde功能.JSP action使用de是一种类似XMLde语法,并且被用来处理JavaBean组件.在上面de例子中,jsp:useBean action初始化了一个JavaBean ,JavaBean将在网页de后面部分被用到:
如果在网页中需要获得和设置这个Beande属性,另一个JSP action将被给出,使用de是下面de语法:
当网页被编译成一个servletde时候,Directive将被JSP引擎处理.Directive被用来设置页面级de指令、从外部文件插入数据以及制定定制de标签库.Directive被定义在<%@ 和 %>之间. 在上面de例子中,Directive定义了页面所使用de语言(Java),为了关联Java类需要植入相关代码并指定一个将要插入页面底部deHTML文件内容:
<%@ page language=="java" imports=="java.util.*" %>
<%@ include file=="copyright.html" %>
声明与Java中de变量声明相似,它也是为了后面表达式或scriptletde需要来定义变量.声明被定义在<%! 和 %>之间.在上面de例子中,“int”声明并给出了一个当前时间de相应值 (AM 或 PM):
<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
表达式可以是变量或常量,它插在由web服务器所返回de数据里,并用<%= 和 %>来定义.在上面de例子中,表达式将调用JavaBean组件并在页面中插入结果数据:
<%= clock.getDayOfMonth() %>
<%= clock.getYear() %>
Scriptlet将作为一个Java相关代码块植入JSP页面中.Scriptlet相关代码被一一插入由页面所产生deservlet中,它被定义在<% 和%>之间.上面例子中descriptlet可以根据当前用户产生相应de时间和问候语:
<%
if (time == Calendar.AM) {
%>
早上好
<%
}
else {
%>
下午好
<%
}
%>
注释部分和HTMLde注释相似,当在执行de时候JSP引擎将去掉对注释de解释.这就意味着JSP注释并不返回到用户de浏览器中.不象HTML注释被定义在之间.例如:
<%-- Check for AM or PM --%>