Sun Java System Application Server 7 Web应用开发者指南

上一部分 | 目录 | 下一部分


使用JSP

本模块介绍了在Sun Java System Application Server上的web应用中如何将JavaServer Pages (JSP)用作页模板。

该模块包含以下各节:

介绍JSP

JSPHTMLXML的浏览器页面。它们也可以包含Java 代码,通过这些代码可以执行复杂的处理,有条件地进行输出,并和其它应用对象通信。Sun Java System Application Server中的JSP基于JSP 1.2规范。在install_dir/docs/index.htm下有可以找到规范,其中install_dir Sun Java System 应用服务器的安装目录。

Sun Java System Application Server应用中,JSP是构成应用的单个页面。可以从servlet调用JSP来处理用户交互输出结果,或者,由于JSP和其它应用部件具有相同的应用环境访问,可以直接将JSP用于交互。

JSP是由JSP元素和模板数据组成的。模板数据是指那些不包含在JSP规范中的任何东西,包括文本和HTML标签。例如,最小的JSP不需要JSP 引擎的处理,它是一个静态的HTML页面。

在第一次调用JSP时,Sun Java System Application Server将它编译成HTTP servlet (或者也可以预编译它们,这样可以获得更好的性能)。这样它们就能够成为应用环境的标准对象,并且客户端使用URL可以调用它们。

JSP在服务器的JSP引擎内运行,该引擎负责解释特定的JSP标签,并执行特定的行为从而产生动态内容。将这些内容和其它模板数据组织到结果页中并且返回给调用者。

创建JSP

创建JSP的方法和创建HTML文件的方法基本相同。可以使用HTML编辑器创建页面和编辑页面布局。通过在源代码文件中需要的地方插入JSP特有标签并给文件加上.jsp 扩展名,就能创建JSP页面。

基于JSP1.2规范的JSP基本上遵守XML语法,而XML语法和HTML是一致的。如果想了解使用的JSP标签的概要,请参考"JSP标签库和标准可移植标签"

JSP是编译进servlets的,所以servlet设计风格也应用到JSP中。JSPservlet可以执行相同的任务,但是它们都有自己突出和不足的地方。Servlet的优势在于它的处理和适应性上。然而,使用它们来执行HTML输出结果需要手工编写很多println 语句。相反的,JSP在布局上比较突出,因为它们是简单的HTML文件,并且可以使用HTML编辑器创建,但是执行复杂的计算和处理就不太理想了。如果想查看servlet的相关信息,请参考"使用servlet"

这里还有一些其它的JSP设计技巧:

设计易维护性

每个JSP都可以调用或包含任何其它JSP。例如,你可以创建一个通用的公司标志,一个标准的导航条和内容的左列表,它们中的每个元素在单个JSP中, 并且包含在每个建立的页面中。可以使用JSP功能将它构成框架,动态决定装入每个子框架中的页面。当JSP编译成servlet或收到一个请求的时候,可以包含进一个JSP

设计可移植性

在不同的应用和不同的服务器上,JSP完全是可移植的。它的主要缺点是它们不知道特定的应用数据,但是当它们需要这类数据的时候,这就不是什么问题了。

通用JSP可能用于可移植的页面元素,如导航条、公司的标题,以及脚注等,这就意味这它们都可以包含在其它JSP中。可以创建一个可重用的通用页面元素库,在整个应用中都使用这个库,甚至可以在几个应用中都使用它。

例如,最小的通用JSP是一个不带特定JSP标签的静态HTML页面。稍微大一些的JSP可能包含一些Java代码,这些代码处理一些通用数据,如打印日期和时间、或根据请求对象中设置的标准值改变页面的结构。

处理异常

如果JSP文件中出现一个没有捕获的异常,Sun Java System Application Server将产生一个异常,通常是404 500 错误。为了避免这个问题,设置<%@ page%> 标签的errorPage 属性。

JSP标签库和标准可移植标签

Sun Java System Application Server支持标签库和标准可移植标签。如果想获得关于标签库的更多信息,请参考JSP 1.2 规范,该规范位于:

http://java.sun.com/products/jsp/download.html

如果想获得JSP 1.2标签语法的方便的摘要信息,请参考下面的PDF 文件:

http://java.sun.com/products/jsp/pdf/card12.pdf

JSP缓存

可以使用JSP缓存来缓存Java引擎中的JSP页段。可以使用不同的缓存原则分别缓存它们。例如,假设你有浏览股票行情、天气预报等的页段,股票行情段可以缓存10分钟,天气预报段可以缓存30分钟,等等。

如果想获得servlet响应缓存的相关信息,请参考"缓存servlet结果"

JSP缓存使用JSP1.2支持的常规标签库。JSP缓存由打包进install_dir/lib/appserv-tags.jar 文件的标签库实现,可以将它复制到应用的WEB-INF/lib 目录下。appserv-tags.tld 标签描述文件放在该 JAR文件中,在install_dir/lib/tlds 目录下。

可以使用下面的方法在JSP文件中访问这些标签:

<%@ taglib prefix="prefix" uri="Sun Java System Application Server Tags" %>

然后,就可以使用<prefix:cache> <prefix:flush>访问缓存标签。例如,如果prefix mypfx,缓存标签就是<mypfx:cache> <mypfx:flush>

如果希望使用指向这个标签库的不同的URI,可以使用web.xml 文件中的显式<taglib> 元素。

标签如下:

cache

cache标签根据指定的属性缓存开始标志和结束标志之间的内容。第一次遇到该标签时,内容被执行并缓存下来。以后每次运行它的时候,就检查缓存的内容,看看需不需要刷新它,如果需要,就再次执行它,缓存的数据就刷新了。否则,就直接使用缓存的数据。

属性

下面的表格描述了cache 标签的属性。左列是属性的名字,中间一列是属性的默认值,右边一列描述了属性的作用。

cache 属性

属性

默认值

描述

Key

ServletPath_Suffix

(可选)容器用于访问缓存项的名字。将缓存关键字(Key)作为servlet路径的后缀,产生用来访问缓存项的一个关键字。如果没有指定关键字,就根据页中的标签所在位置产生一个号码。

timeout

60s

(可选) 经过这段长的一段时间(以秒计)后就执行标签体并刷新缓存。默认情况下,将该值解释成秒。如果要指定不同的时间单位,就在超时值后面添加一个后缀,如下所示: s 表示秒,m 表示分钟,h 表示小时,d 表示天数。 例如,2h 指两小时。 

nocache

false

(可选)如果设置为true,执行内容体并认为没有cache 标签。这样就可以在程序中决定是否要发送缓存的响应,或决定在响应没有被缓存的情况下,是否要执行内容体。

refresh

false

(可选) 如果设置为true,就执行内容体并再次缓存响应。这样就可以在程序中刷新缓存,而不用考虑timeout 设置。

示例:

下面的例子显示了一个缓存的JSP页:

<%@ taglib prefix="mypfx" uri="Sun Java System Application Server Tags" %>

<%
   String cacheKey = null;
   if (session != null)
      cacheKey = (String)session.getAttribute("loginId");

   //
检查nocache
   boolean noCache = false;
   String nc = request.getParameter("nocache");
   if (nc != null)
      noCache = "true";

   //
强制重载
   boolean reload=false;
   String refresh = request.getParameter("refresh");
   if (refresh != null)
      reload = true;
%>

<mypfx:cache key="<%= cacheKey %>" nocache="<%= noCache %>" refresh="<%= reload %>" timeout="10m">
<%
   String page = request.getParameter("page");
   if (page.equals("frontPage") {
      //
从数据库中获得标题
   } else {
      .....
%>
</mypfx:cache>

<mypfx:cache timeout="1h">
<h2> Local News </h2>
<%
   //
获得标题新闻并缓存它们
%>
</mypfx:cache>

flush

强制刷新缓存。如果指定了关键字,就仅刷新带有该关键字的项。如果没有指定key,就刷新整个缓存。

属性

下表描述了flush 标签的属性。左列是属性名,中间一列是该属性的默认值,右边一列描述了属性的作用。

flush 属性

属性

默认值

描述

Key

ServletPath_Suffix

(可选)容器访问缓存项所用的名字。将缓存关键字作为servlet路径的后缀,产生用来访问缓存项的关键字。如果没有指定关键字,就根据页中的标签所在位置产生一个号码。

示例:

刷新带有key="foobar"的项:

<mypfx:flush key="foobar"/>

刷新整个缓存:

<% if (session != null && session.getAttribute("clearCache") != null) { %>
    <mypfx:flush />
<% } %>

编译JSP:命令行编译器

Sun Java System Application Server提供了下列方法将JSP 1.2格式的源文件编译成servlet

  • 运行时JSP会自动编译。
  •    asadmin deploy 命令有precompilejsp选项;请参考Sun ONE Application Server开发者指南。
  • sun-appserv-jspc 蚂蚁任务允许预编译JSP;请参考Sun ONE Application Server开发者指南。
  • 本节介绍的jspc 命令行工具允许你在命令行预编译JSP

为了让JSP容器能够从JAR 文件中找出预编译的JSP,必须禁止动态重载JSP。这就要将sun-web.xml 文件中的jsp-config 元素的reload-interval 属性设置成-1 。请参考"JSP Elements"

jspc 命令行工具存放在install_dir/bin (确信在你的路径下有这个目录)下。jspc 命令的格式如下所示:

jspc [options] file_specifier

下面的表格显示了在jspc 命令中file_specifier 可以设置成什么。左列是文件标识符,右列是对这些文件标识符的描述。

Jspc命令的文件标识符

文件标识符

描述

Files

要编译的一个或多个JSP文件。

-webapp dir

包含web应用的目录。包含在该目录和该目录子目录中的所有的JSP都将被编译。你不能指定WARJARZIP文件;必须首先将它解压缩到一个开放目录结构中。

下面的表格显示了jspc 命令的基本选项。左列是选项,右列是对这些选项的描述。

   基本jspc 选项

选项

描述

-q

启动安静模式(-v0)。仅显示致命错误信息。 

-d dir

指定编译的JSP的输出目录。根据包含未编译的JSP的目录会自动产生程序包目录。默认的顶层目录是从中可以调用jspc的目录。 

-p name

为所有指定的JSP指定目标程序包的名字,覆盖-d选项执行的默认的程序包的产生方式。 

-c name

指定第一个编译的JSP的目标类名字。并不影响后面的JSP

-uribase dir

指定跟编译相关的URI目录。仅应用到命令中列出的JSP 文件,并不应用到使用-webapp 指定的JSP文件。

这是跟uriroot 相关的每个JSP文件的位置。如果不能确定它,就使用默认值/ 

-uriroot dir

指定URI文件分解的根目录。仅应用到命令中列出的JSP 文件,并不应用到使用-webapp 指定的JSP文件。

如果没有指定该选项,会在所有第一个JSP页的父目录中查找WEB-INF 子目录。到JSP页最近的目录已经被使用掉了。

如果JSP的父目录中都没有WEB-INF 子目录,就使用那个其中的jspc处于激活状态的目录。 

-genclass

将产生的servlet编译成类文件。

下面的表格显示了jspc 命令的高级选项。左列是选项,右列是对选项的描述。

   高级jspc 选项

选项

描述

-v[level]

激活冗余模式。level 是可选项,默认值为2。可能的level 值为:

·         0仅输出致命的错误信息

  • 1仅输出错误信息
  • 2仅输出错误和警告信息
  • 3输出错误、警告和消息信息
  • 4输出错误、警告、消息和调试信息

-mapped

为每个HTML行和描述JSP文件中的每行的位置的注释产生单独的write 调用。默认情况下,会结合所有相邻write 调用,并且不会产生任何位置注释。

-die[code]

如果出现错误,就返回code 指定的错误号。如果没有code 或不能分析它,那么就用默认值1

-webinc file

-webapp 选项创建部分servlet映像,可以将它传到一个web.xml 文件中。

-webxml file

-webapp 选项创建完整的web.xml 文件。

-ieplugin class_id

IE指定Java pluginCOM 类的ID。由<jsp:plugin> 标签使用。

例如,该命令编译hello JSP文件并且将编译后的JSP保存在hellodir下。

jspc -d hellodir -genclass hello.jsp

该命令将webappdir 下的所有web应用的JSP文件编译成jspclassdir下的类文件:

jspc -d jspclassdir -genclass -webapp webappdir

要使用web应用中的这些预编译的JSP,将hellodir jspclassdir 下的类放入JAR 文件中。将JAR文件放在WEB-INF/lib下,并且将sun-web.xml 文件中的reload-interval 属性设置成-1

调试JSP

使用Sun Java System Studio 4调试JSP时,可以在JSP代码或产生的servlet代码内设置断点,既可以在它们之间切换,也能查看相同的断点。

设置Sun Java System Studio中的调试时,可以参考Sun Java System Application Server开发者指南。 如果想获得更多信息,请参考Sun Java System Studio 4,企业版指南。


上一部分 | 目录 | 下一部分

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null