3.3 JSP指令

上一节介绍了JSP表达式的用法以及示例,读者已经可以应用前面章节的知识编写简单的JSP动态网页了,但要编写出功能强大、复杂的JSP页面还需要学习更多的内容。本节介绍JSP的另一元素:指令。JSP指令包括:page指令、include指令、taglib指令。

3.3.1 与页面属性相关的page指令

page指令用来设置JSP页面的属性和相关功能,基本语法形式有两种,如下:

      <%@ page attribute1="value1" […attribute2="value n"]%>

或者

      <jsp:directive.page attribute1="value1" […attribute2="value n"] />

提示

第2种形式的表达现在很少使用,大多使用第1种表达形式。

page指令有多种属性,但使用最多的是language、import、pageEncoding这3个,其中language是必须设置的,目前JSP页面使用Java语言,所以其默认值是java。Import用来声明需要导入的包,pageEncoding属性设置页面的编码。在所有的属性中除import可以声明多个外,其他的属性都只能出现一次。page其他的属性见表3.1。

表3.1 page指令的常用属性

3.3.2 引入文件的include指令

include指令是在JSP页面生成Servlet时引入需要包含的页文件,可以是HTML文件也可以是JSP文件,还可以是其他文件(例如js文件)。include指令的作用是在标签插入的位置插入静态的文件内容,使其与JSP文件组合成新的JSP页面,然后由JSP引擎翻译成Servlet文件。这样做有两个优点:

页面的代码可以复用,因为被引入的文件是静态文件,所以在其他的JSP页面中要是需要也可以导入;

JSP页面的代码结构显得清晰易懂,维护也比较简单。

include指令的基本语法如下:

      <%@include file="URL"%>

file属性是指向要包含的文件,一定要注意引入的路径是否正确,一旦路径出错在编译的时候将不能通过。

include指令经常用来包含网站中经常出现的相同页面。例如,一般网站为每个页面都设置导航栏,把它放在页面的顶端或者左边,这部分的代码在每个页面都重复。那么就可以用include来解决这类问题,它能够为开发者省去这些重复的动作。下面的例子将对include指令进行演示。

【例3.3】演示include指令。

index.jsp是首页,其源代码如下:

      ----------------- index1.jsp ----------------
      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
      01    <head>
      02      <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
      03      <title>JSP include指令演示</title>
      04    </head>
      05    <body>
      06         <%@include file="john.html" %>
      07         <br/>
      08        <div align="center">JSP include指令演示</div>
      09         <%@include file="copyRight.jsp" %>
      10    </body>
      11   </html>

John.html是内嵌页面,用来显示内容,其源代码如下:

      ----------------- john.html ----------------
      01   <table align="center" border="1" width="600">
      02      <tr>
      03          <td align="center" height="18" width="100%">
      04              <span>This is top page.</span>
      05          </td>
      06      </tr>
      07   </table>

copyRight.jsp是显示版权信息的页面,其源代码如下:

      ----------------- copyRight.jsp ----------------
      01   <%@ page language="java" import="java.util.*, java.text.SimpleDateFormat"
      02           pageEncoding="UTF-8"%>
      03   <%
      04      Date d = new Date();
      05      SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
      06      String t = sdf.format(d);
      07      String copyRightsMess = "John 版权所有 2010-"+t;
      08   %>
      09   <br/>
      10   <div align="center" ><%=copyRightsMess%></div>

本例页面效果如图3.4所示。

图3.4 index.jsp页面的运行结果

提示

include指令在JSP页面被转换成Servlet时才将文件导入,这与<jsp:include>动作不同。

3.3.3 与标签相关的taglib指令

taglib指令(又名标签指令)是JSP新增的一个指令,用户可以自定义新的标签在页面中执行。taglib指令的语法如下:

      <%taglib  uri="tagliburl" prefix="tagPre" %>

其中uri属性用来表示自定义标签库的存放位置。prefix属性是为了区分不同标签库的标签名,在页面中引用标签也是以prefix开头的。

现在比较流行的JSTL、EL标签,看下它们如何在JSP中使用。下面的例子是用JSTL标签输出1~10。

提示

JSTL标签库会在后续的章节详细说明,这里先演示它的基本用法。

【例3.4】演示taglib指令。

      ----------------- index.jsp ----------------
      01   <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      02   <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
      03   <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      04   <html>
      05    <head>
      06      <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
      07      <title>JSP taglib指令演示</title>
      08    </head>
      09    <body>
      10         <table>
      11            <tr>
      12              <td>输出值</td>
      13            </tr>
      14            <c:forEach begin="1" end="10" var="num">
      15               <tr>
      16                 <td><c:out value="${num}"></c:out></td>
      17               </tr>
      18            </c:forEach>
      19         </table>
      20    </body>
      21   </html>

从上述代码可以看出,JSTL标签使得JSP页面十分的简洁,它不需要定义或初始化对象、方法。但凡事都不能只看表面,应该注重本质,标签的制定在页面显示是如此的简单,但在编制时是个复杂的过程,它通过一定的编程步骤将JSP代码和Java代码联系起来。标签制定的最大好处就是使得开发者的职责分工更加地明细,标签制定者无需关注业务逻辑的实现,而页面编程人员直接使用标签即可。这样两者就不会冲突,分工明确。下面简单介绍定制标签的过程。

1.标签库

标签库用于定义标签的XML文件。该文件中包含了标签的属性、和标签的名称、JSP在处理标签时所需的类文件等信息。在使用自定义标签时,必须指明标签库所在目录;在执行标签功能作用时,通过定义标签属性来决定显示的内容。下面看一段标签的源代码,其中包括了标签名的定义、属性定义以及标签对应的Java类。

      01   <? xml version="1.0" encoding="UTF-8" ? >
      02   <! DOCTYPE taglib
      03    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
      04    "http://java.sun.com/dtd/web-jsptaglibrary_1_3.dtd">
      05   <taglib>
      06       <tlib-version>1.0</tlib-version>
      07       <jsp-version>1.2</jsp-version>
      08       <short-name>lms</short-name>
      09      <! --  页面引用的url地址 -->
      10      <uri>/lms-tags</uri>
      11
      12       <tag>
      13          <! --  标签名称 -->
      14           <name>page</name>
      15          <! --  标签处理类 -->
      16           <tag-class>com.common.model.PageTag</tag-class>
      17           <body-content>JSP</body-content>
      18          <! --  标签描述 -->
      19          <description>分页</description>
      20          <! --  标签属性 -->
      21           <attribute>
      22              <! --  标签属性名称 -->
      23               <name>object</name>
      24              <! --  标签属性是否为必需,true是必需,false不是必需 -->
      25               <required>true</required>
      26              <! --  标签属性对应的处理类 -->
      27               <type>com.common.model.PageObject</type>
      28              <! --  标签属性描述 -->
      29              <description>PageObject对象</description>
      30           </attribute>
      31       </tag>
      32
      33     <tag>
      34          <! --  标签名称 -->
      35           <name>substring</name>
      36          <! --  标签处理类 -->
      37           <tag-class>com.gsta.common.tag.SubStringTag</tag-class>
      38           <description>substring</description>
      39           <attribute>
      40               <name>content</name>
      41               <required>true</required>
      42               <type>java.lang.String</type>
      43           </attribute>
      44       </tag>
      45   </taglib>

上述代码中第6~8行分别定义标签的版本、JSP的版本、标签的简称,代码第12~31行定义page标签,代码第21~30行定义page标签的属性,在定义属性名称的时候,可以定义该标签的数据类型以及该属性是否是必需的。例如上述代码第41行定义的,JSP页面就会根据其定义在执行的时候检查相关的错误信息。

2.标签处理类

标签处理类其实就是一个Java类,该Java类实现标签接口(javax.Servlet.jsp.Tag),当自定义标签被JSP处理时即被执行。每个标签中都需要执行的方法是:

      Public int doStartTag() throws JspException

该方法定义了标签被执行时的方法。在标签中定义的属性,那么在Java类中就必须有这些属性并且设定其get/set方法。例如,在上面标签源码中与substring标签对应的标签Java类是一个用于返回结果的Java类,在substring标签定义时,必须定义其content属性并给出get/set方法,如下代码所示:

      01   private String content;
      02   public void setContent(String content) {
      03       this.content = content;
      04   }
      05
      06   public void setLength(int length) {
      07       this.length = length;
      08   }

上述代码中,给出了属性content的get/set方法。