需求:多个JSP页面可能需要使用一些相同的信息 例如:导航栏、标题等。
目标:提高这些相同信息的代码的复用性。
方法:将这些相同的元素形成一种特殊的文件,以便所有页面都可以使用,即:Tag文件
1、Tag对比include
include指令标记<%@ include file=“...” %>
include动作标记<jsp:include page=“...” />
include缺点:有些情况下处理的是JSP文件,而用户可能通过该文件所在的Web服务目录直接访问到这个JSP文件。
当我们不希望这些文件被用户访问到时,需要采用新的办法:Tag文件——可被JSP动态加载,但不能被用户访问。
2、Tag文件的结构
*.tag文件 结构: 近似JSP的结构+Tag特殊指令标记
AddSum.tag:
<p>这是一个Tag文件,负责计算1~100内的奇数之和:</p
<%
int sum=0, i=l ;
for(i=l;i<=l00;i++)
{
if(i%2==1)
sum=sum+i ;
}
out.println(sum);
%>
3、Tag文件的保存
Tag文件的位置必须是:Web服务目录\WEB-INF\tags
比如:webapps\webtest\WEB-INF\tags
其中的WEB-INF和tags部是固定的子目录名称,而tags下的子目录名称可由用户给定。
4、Tag标记与Tag文件的使用
步骤1:引入标记库(对tag的声明)在JSP页面中使用<taglib>指令标记引入tag标记库。
格式
<%@ taglib tagdir=“tag标记的位置” prefix=“前缀” %>
例如: <%@ taglib tagdir=“/WEB-INF/tags” prefix=“beijing” %>
<%@ taglib tagdir=“/WEB-INF/tags/tags2” prefix=“dalian” %>
步骤2:在JSP页面中使用Tag标记来使用Tag。
格式:<前缀: Tag文件名/> 或<前缀: Tag文件名>
标记体</前缀: Tag文件名>
例如:<beijing: AddSum/>
标记体
JSP页面在调用Tag过程中可通过标记体动态地向Tag传送信息。
在Tag中,通过<jsp:doBody/>来处理JSP传递过来的标记体。
默认情况下,标记体是一些文本数据。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="look" tagdir="/WEB-INF/tags" %>
<html>
<look:Show>北京奥运会圆满成功 </look:Show>
<look:Show> I Love this Game!</look:Show>
<look:Show>欢迎您!</look:Show>
</html>
Show.tag
<body bgcolor="yellow"><p>
<%
int size=1;
for(int i=1;i<=3;i++)
{
size=size+1;
%>
<font size="<%=size %>">
<jsp:doBody />
</font>
<% }%>
<p>
</body>
5、Tag文件中的常用指令
作用:与JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的一些属性和行为。
Tag文件中经常使用的指令有:
1. tag
2.include
3.attribute
4.variable
5.taglib
tag指令
作用:类似于page指令,指定Tag某些属性的值。
格式: <%@ tag 属性1=“值1” 属性2=“值2”...... %>
或 <%@ tag 属性1=“值1” %>
<%@ tag 属性2=“值2” %> ......
可设置的属性有body-content language import pageEncoding
body-content属性
作用:定义JSP调用Tag时,标记体的格式。
格式: <%@ tag body-content=“值” %>
可取empty/tagdependent/scriptless三个值,
empty——JSP不能使用标记体;
tagdependent——标记体内容按纯文本处理;
scriptless——标记体中不能有Java程序片。
language属性:定义Tag使用的脚本语言,同JSP一样,目前只能设置为“Java”,无需设置。
import属性:引入Java核心包的类。
pageEncoding属性:指定Tag文件的字符编码,默认是ISO-8859-1。
include指令
同JSP中include指令类似,回顾JSP的include指令。
<%@ include file=“filename” %>
attribute指令
作用:实现JSP向Tag传送数据。
格式:在Tag中
<%@ attribute name=“对象名字” required=“true” type=“对象类型” %>
在引用Tag的JSP中<前缀: Tag文件名字 对象名字=“对象的引用” />
或<前缀: Tag文件名字 对象名字=“对象的引用” >标记体
</前缀: Tag文件名字 >
例如: tag中定义:<%@ attribute name=“length” required=“true"%>
JSP中代码: <beijing: AddSum length=“1000” />
注意:1. 传送的是一个对象的引用。
2. name属性是必须的,对应传送对象的名字。
3. type属性是对象的类型,必须带有包名,如“java.util.Date”不能简写成“Date”。默认值为java.lang.String类型。
4. required属性是可选的,默认值为false,为true时,JSP页面必须在标签中带有指定name属性的对象。
5. tag中不可再定义与name具有相同名字的变量,否则会使attribute对象失效。
variable指令
作用:实现Tag向JSP返回数据。
格式:1.在Tag中首先声明:
<%@ variable name-given=“对象名字” variable-class=“对象类型” scope=“有效范围” %>
2.然后调用jspContext内置对象的setAttribute()将对象存储到jspContext中,以便JSP调用。如:
jspContext.setAttribute(“time”, new Date());
3.那么在JSP中,可以直接通过对象名来使用这个对象。如:
int year=time.getYear()+1900;
该代码使用Date的getYear()方法,将Tag传送的time对象中记录的时间年赋给year变量。
注意:1. 返回的是一个对象。
2. JSP中不可再定义与name具有相同名字的变量,否则会出现编译错误。
3. scope定义了variable在JSP中的使用范围,可取值为AT_BEGIN、NESTED和AT_END。AT_BEGIN: JSP页面一旦使用Tag,就可以使用variable给出的对象。
NESTED: JSP页面只可以在Tag标记的标记体中使用variable给出的对象。
AT_END: JSP页面在Tag标记结束后才可以使用variable给出的对象。
6、Tag标记的嵌套
当我们使用Tag标记时,可以带有标记体,标记体还可以是一个Tag标记,这就实现了Tag标记的嵌套。Tag标记中的标记体由Tag文件的<jsp:doBody/>标记负责处理,而在Tag文件中,<jsp:doBody />标记被替换成对“标记体”进行处理后所得到的结果。
7、JSP引擎与Tomcat服务器
将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP,并将运行结果返回给用户。
JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP页面、Javabean和servlet组成。当用户请求Web服务器上的JSP页面时,JSP引擎负责运行JSP,并将运行结果返回给用户。
attribute指令