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方法。