JSP标识表记标帜
添加时间:2013-7-11 点击量:
JSP标识表记标帜是JSP页面中很首要的构成项目组,JSP标识表记标帜包含指令标识表记标帜、动作标识表记标帜和自定义标识表记标帜。此中自定义标识表记标帜首要讲述与Tag文件有关的Tag标识表记标帜。
一 指令标识表记标帜page
Page指令标识表记标帜,简称page指令,用来定义全部JSP页面的一些属性和这些属性的值。可以用一个page指令指定多个属性的值,也可以应用多个page指令分别为每个属性指定值。Page指令的感化对全部页面有效,与其书写的地位无关,习惯把page指令写在全部页面的最前面。Page指令的格局如下:
<%@ page 属性1=”属性1的值” 属性2=”属性2的值” ... %>
Page指令标识表记标帜可认为下列属性指定值:contentType属性,import属性,language属性,session属性,buffer属性,autoFlush属性,isThreadSafe属性,pageEncoding属性。
1. 属性contentType的值
JSP页面应用page指令只能为contentType指定一个值,以此断定响应的MIME类型。当用户恳求一个JSP页面时,Tomcat办事器负责申明履行JSP页面,并将某些信息发送给客户机的浏览器,以便用户浏览这些信息。若是客户机的浏览器用HTML解析器来解析履行这些信息,就可以用page指令指定JSP页面的contentType属性的值为“text/html;charset=GB2312”,例如:
<%@ page contentType=”text/html;charset=GB2312” %>
若是不应用page指令为contentType指定一个值,那么属性“contentType”的默认值是“text/html;charset=ISO-8859-1”。
注:不容许两次应用page指令给contentType属性指定不合的值,下列用法错误:
<%@ page contentType=“text/html;charset=GB2312” %>
<%@page contentType=“application/msword” %>
注:若是想深切懂得MIME类型,可以在收集搜刮引擎中搜刮MIME关键字。
【例1】建造3个JSP页面:A.jsp页面,应用page指令设置contentType属性的值为”text/html;charset=GB2312”,当客户恳求A.jsp页面时,客户的浏览器应用HTML解析器来解析履行收到的信息;B.jsp页面,应用page指令设置contentType属性的值为“application/msword”,当客户恳求B.jsp页面时,客户的浏览器将应用Word应用法度来解析履行收到的信息;C.jsp页面,应用page指令设定contentType属性的值为“image/jpeg”,当客户恳求C.jsp页面时,客户的浏览器将应用图形解析器来解析履行收到的信息。
A.jsp
<%@ page contentType=text/html;Charset=UTF-8 %>
<HTML><BODY bgcolor=cyan>
<FONT size=3>
<P>我在进修page指令
</FONT></BODY></HTML></HTML>
B.jsp
<%@ page contentType=application/msword %>
<HTML><BODY bgcolor=cyan>
<FONT size=3>
<P>启动Word应用法度
</FONT></BODY></HTML>
C.jsp
<%@ page contentType=image/jpeg %>
<%@ page import=java.awt. %>
<%@ page import=java.io. %>
<%@ page import=java.awt.image. %>
<%@ page import=java.awt.geom. %>
<%@ page import=com.sun.image.codec.jpeg. %>
<% int width=260,height=260;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,width,height);
Graphics2D g_2d=(Graphics2D)g;
Ellipse2D ellipse=new Ellipse2D.Double(40,80,100,40);
g_2d.setColor(Color.blue);
AffineTransform trans=new AffineTransform();
for(int i=1;i<=12;i++){
trans.rotate(30.0Math.PI/180,90,100);
g_2d.setTransform(trans);
g_2d.draw(ellipse);
}
g.dispose();
OutputStream outClient=response.getOutputStream();
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(outClient);
encoder.encode(image);
%>
结果如图所示:
2. 属性import的值
Import属性的感化是为JSP页面引入Java核心包中的类,如许就可以在JSP页面的法度片项目组、变量及办法声明项目组、表达式项目组应用包中的类。可认为该属性指定多个值,该属性的值可所以Java某包中的所有类或一个具体的类。
应用page指令可认为import属性指定几个值,这些值用逗号分隔。例如:
<%@page import=”java.util.”,”java.io.”,”java.awt.”%>
也可以应用多个page指令为import属性指定几个值。例如:
<%@ page import=”java.util.” %>
<%@ page import=”java.io. %>
<%@ page import=”java.awt.” %>
当为import属性指定多个值时,JSP引擎把JSP页面转换成的Java文件中会有以下import语句:
Import java.util.;
Import java.io.;
Import java.awt.;
JSP页面的默认import属性有如下值:”java.lang.”、”javax.servlet.”、”havax.servlet.jsp.”、”javax.servlet.http.”。Import属性是一个斗劲特别的属性,可以被指定多个值。须要希罕重视的是,除import属性外,其余属性只能被指定一个值。
3. 属性language的值
Language属性定义JSP页面应用的脚本说话,该属性的值今朝只能取“Java”。为language属性指定值的格局如下:
<%@ page language=”java” %>
Language属性的默认值是“Java”。若是在JSP页面没有应用page指令指定该属性的值,那么JSP页面默认有如下page指令:
<%@ page language=”java” %>
4. 属性session
Session属性的值用于设置是否须要应用Tomcat办事器内置的session对象。Session属性的值可所以true或者false,默认属性值是true。
5. 属性buffer
内置输出流对象out负责将办事器的某些信息或应用成果发送到客户端显示,buffer属性用来指定out应用的缓冲区大小或不应用缓冲区。
Buffer属性的默认值是8KB,可以应用page指令批改这个默认值。例如:
<%@ page buffer=”24KB” %>
若是不筹办让out流应用缓冲区,可将buffer属性的值设为none。
6. 属性autoFlush
autoFlush属性指定out流的缓冲区被填满时,缓冲区是否主动刷新。
autoFlush可以取值true或false,默认值是true。当autoFlush属性取值为false时,若是out的缓冲区填满,就会呈现缓存溢出异常。当buffer的值为none时,autoFlush的值就不克不及设置成false。
7. 属性isThreadSafe
isThreadSafe属性取值true或false,默认值是true。Tomcat办事器应用多线程技巧处理惩罚客户的恳求,即当多个客户机恳求一个JSP页面时,Tomcat办事器为每个客户机启动一个线程,每个线程分别负责履行常驻内存的字节码文件来响应响应客户机的恳求。这些线程由Tomcat办事器来经管,将CPU的应用权在各线程之间快速切换,以包管每个线程都有机会履行字节码文件。当isThreadSafe属性值为true时,CPU的应用权在各线程间快速切换,也就是说,即使一个客户机的线程没有履行完毕,CPU的应用权也可能要切换给其他线程。如此轮流,直到各线程履行完毕。当JSP应用page指令将isThreadSafe属性值设置成false时,该JSP页面同一时刻只能处理惩罚响应一个客户机的恳求,其他客户持续列队守候。也就是说,CPU要包管一个线程将JSP页面履行完毕,才会把CPU应用权切换给其他线程。
二 指令标识表记标帜include
设计一个Web应用可能须要编写若干个JSP页面,若是这些JSP页面都须要显示某些同样的信息,如每个JSP页面上都可能须要一个导航条,以便用户在各JSP页面之间往返切换,那么每个JSP页面都可以应用include指令标识表记标帜在页面的恰当地位整体嵌入一个雷同的文件。
指令标识表记标帜include的语法如下:
<%@ include file=”文件的URL” %>
该指令标识表记标帜的感化是在JSP页面上呈现该指令的地位处静态嵌入一个文件。被嵌入的文件必须是可接见和可应用的。若是该文件和当前JSP页面在同一Web办事目次中,那么“文件的URL”就是文件的名字;若是该文件在JSP页面地点的Web办事目次的一个子目次中,如image子目次,那么“文件的URL”就是“image/文件的名字”.
所谓静态嵌入,就是Tomcat办事器在编译阶段就完成文件的嵌入操纵,即将当前的JSP页面和要嵌入的文件归并成一个新的JSP页面,Tomcat办事器再将这个新的JSP页面转译成Java文件。是以,嵌入文件后,必须包管新归并成的JSP页面合适JSP语律例则,即可以或许成为一个NSP页面文件。比如,当前JSP页面已经应用page指令设置了contentType属性的值:
<%@ page coontentType=”text/html;Charset=GB2312” %>
若被嵌入的文件也是一个JSP页面,此中也应用page指令为contentType属性设置了值:
<%@ page contentType=”application/msword” %>
那么,归并后的JSP页面就两次应用page指令为contentType属性设置了不合的属性值,导致语法错误,因为JSP页面中的page指令只能为contentType指定一个值。
Tomcat 5.0版本今后的办事器每次都要搜检被嵌入的文件是否被修悔改。是以,JSP页面成功静态嵌入一个文件后,若是对嵌入的文件进行了批改,那么Tomcat办事器会从头编译JSP页面,即将当前的JSP页面和批改后的文件归并成一个JSP页面,然后Tomcat办事器将这个新的JSP页面转译成Java类文件。
【例 2】在JSP页面静态嵌入一个文本文件Hello.txt,该文本文件的内容是:”祝贺深圳成功举办大运会“。文本文件和当前JSP页面在同一Web办事目次中。
Example3_2.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<HTML><BODY bgcolor=yellow>
<H1>
<%@ include file=”Hello.txt” %>
</H1>
</BODY></HTML>
上述example3_2.jsp等价于下面的JSP文件exm.jsp。
Exm.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<HTML><BODY bgcolor=yellow>
<H1>祝贺深圳成功举办大运会</H1>
</BODY></HTML>
注:在Tomcat 4 版本中,不容许在include指令标识表记标帜嵌入的文件中应用page指令指定contentType属性的值。然则在Tomcat 5 后的版本中,在include指令标识表记标帜嵌入的文件中必须应用page指令指定contentType属性的值,并且指定的值必须与嵌入该文件的JSP页面中的page指令指定的contentType属性的值雷同。
三 动作标识表记标帜include
动作标识表记标帜是一种特别的标识表记标帜,影响JSP运行时的行动。Include动作标识表记标帜的语法有以下两种格局:
<jsp:include page=”文件的URL”/>
或
<jsp:include page=”文件的URL”>
子标识表记标帜
</jsp:include>
Include动作标识表记标帜在JSP页面履行阶段处理惩罚所须要的文件,是以JSP页面和它所须要的文件在逻辑和语法上是自力的。重视:当include动作标识表记标帜不须要子标识表记标帜时,必须应用上述第一种情势。
尽管include动作标识表记标帜和include指令标识表记标帜的感化都是处理惩罚所需文件,然则在处理惩罚体式格式和处理惩罚时候上是不合的。Include指令标识表记标帜用嵌入体式格式处理惩罚文件,在编译阶段就处理惩罚所需文件,长处是页面的履行速度快;而include动作标识表记标帜不应用嵌入体式格式来处理惩罚所需文件,在JSP页面运行时才处理惩罚文件,也就是说,当Tomcat办事器把JSP页面转译成Java文件时,不把JSP页面中include动作标识表记标帜所包含的文件与原JSP页面归并一个新的JSP页面,而是告诉Java申明器,这个文件在JSP运行时(Java文件的字节码文件被加载履行)才被处理惩罚,其长处是能更灵活地处理惩罚所需文件(见后面的param标识表记标帜),毛病是履行速度要慢一些。Include动作标识表记标帜要处理惩罚的文件若是不是JSP文件,就将文件的内容发送到客户机,由客户机负责履行并显示;若是包含的文件是JSP文件,那么Tomcat办事器就履行这个JSP文件,然后将履行的成果发送到客户机,并由客户既负责显示这些成果。
注:书写include动作标识表记标帜时要重视“jsp”、“:”、“include”三者之间不要有空格。
【例 3】example3_3.jsp页面包含两个文件:time.jsp和sun.jsp。Time.jsp和example3_3.jsp页面在同一Web办事目次中,sun.jsp在当前Web办事目次的子目次image中。
Example3_3.jsp
<%@ page contentType=”text/html;Charset-GB2312” %>
<HTML><BODY bgcolor=red>
<jsp:include page=”time.jsp”/>
<P>请看一幅图像:<BR/>
<jsp:include page=”images/sun.jsp” />
</BODY></HTML>
Time.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<%@ page import=”java.util.Date” %>
<HTML><BODY><FONT size=3>
<P>如今的时候:
<% Date date=new Date();
Out.println(date.toString());
%>
</FONT></BODY></HTML>
Sun.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<HTML><BODY>
<IMAGE src=”image/ok.jpg” width=120 height=120>太阳</IMAGE>
</BODY></HTML>
注:sun.jsp页面应用的文件ok.jpg需保存在当前Web办事目次(chapter3)的image子目次中。
结果如图所示:
四 动作标识表记标帜pagam
Param动作标识表记标帜可以作为include、forward动作标识表记标帜的子标识表记标帜来应用,该标识表记标帜以“名字-值”对的情势为这些动作标识表记标帜供给附加信息。
Param动作标识表记标帜的格局如下:
<jsp:param name=”名字” value=”指定给name属性的值”/>
当应用include动作标识表记标帜动态处理惩罚所须要的JSP文件时,经常会应用param子标识表记标帜,以便向动态加载的JSP页面传递须要的值,这也表现出include动作标识表记标帜比include指令标识表记标帜更灵活的特点。Include动作标识表记标帜所要加载的JSP文件可以应用Tomcat办事器供给的request内置对象获取param标识表记标帜中name属性所供给的值。
【例 4】建造页面example3-4.jsp,应用include动作标识表记标帜动态加载computer.jsp文件。当computer.jsp文件被加载时,该文件获取include动作标识表记标帜的param子标识表记标帜中属性name的值。
Example3_4.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=yellow>
<P>加载一个JSP文件,该文件负责策画连气儿整数之和:
<jsp:include page=computer.jsp>
<jsp:param name=item value=100 />
</jsp:include>
</BODY></HTML>
Computer.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY>
<% String str=request.getParameter(item);
int n=Integer.parseInt(str);
int sum=0;
for(int i=1;i<=n;i++){
sum=sum+i;
}
out.println(<BR>从1~+n+的连气儿和是:</BR>+sum);
%>
</BODY></HTML>
结果如图所示:
五 动作标识表记标帜forward
Forword动作标识表记标帜的感化是,从该标识表记标帜呈现处停止当前JSP页面的持续履行,而转向履行forward动作标识表记标帜中page属性所指定的JSP页面。
Forward动作标识表记标帜有两种格局:
<jsp:forward page=”要转向的页面”/>
或
<jsp:forward page=”要转向的页面”>
Param 子标识表记标帜
</jsp:forward>
须要重视的是,当forward动作标识表记标帜不须要param字标识表记标帜时,必须应用上述第一种情势。Forward标识表记标帜可以应用param动作标识表记标帜作为子标识表记标帜,以便向要转向的页面传送信息。Forward动作标识表记标帜指定的要转向的JSP文件,可以应用Tomcat办事器供给的request内置对象获取param子标识表记标帜中name属性所供给的值。
【例 5】建造example3_5.jsp页面,应用forward标识表记标帜转向num1.jsp或num2.jsp页面。在example3_5.jsp页面中随即获取一个1~100之间的整数,该数大于50就转向页面num1.jsp,不然转向页面num2.jsp。Forward动作标识表记标帜时用param子标识表记标帜,将example3-5.jsp页面获取的随机数传递给要转向的页面。
Example3_5.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY>
<%out.println(按照不合的值转向不合的页面:<BR>);
int n=(int)(Math.random()100)+1;
if(n>50){
%> <jsp:forward page=num1.jsp>
<jsp:param name=item value=<%=n %> />
</jsp:forward>
<%
}
else{
%> <jsp:forward page=num2.jsp>
<jsp:param name=item value=<%=n %> />
</jsp:forward>
<%
}
out.println(看不见这句话);
%>
</BODY></HTML>
Num1.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan>
<% String str=request.getParameter(item);
int n=Integer.parseInt(str);
out.println(<BR>不大于+n+的素数:</BR>);
int i=0,j=0;
for(i=1;i<=n;i++){
for(j=2;j<i;j++){
if(i%j==0)
break;
}
if(j==i)
out.println(,+i);
}
%>
</BODY></HTML>
Num2.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML><BODY bgcolor=cyan>
<% String str=request.getParameter(item);
int n=Integer.parseInt(str);
out.println(<BR>不大于+n+的奇数:</BR>);
for(int i=1;i<=n;i++){
if(i%2!=0)
out.println(,+i);
}
%>
</BODY></HTML>
结果如图所示:
六 动作标识表记标帜useBean
该标识表记标帜用来创建并应用一个JavaBean,它是很是首要的一个动作标识表记标帜。Sun公司倡导的是:用HTML完成JSP页面的静态项目组,用JavaBean完成动态项目组,实现真正意义上的静态与动态的分别。
七 Tag文件与Tag标识表记标帜
一个Web应用中的很多JSP页面可能须要应用某些雷同的信息,如都须要应用雷同的导航栏、题目等。若是能将很多页面都须要的共同的信息形成一种特别文件,并且各JSP页面都可以应用这种特别的文件,那么如许的特别文件就是可复用的代码。代码复用是软件设计的一个首要方面,代码复用是衡量软件可保护性的首要指标之一。为了更好地保护一个Web应用,JSP页面可以经由过程自定义标识表记标帜应用一种特别的文件:Tag文件(标识表记标帜),在设计Web应用时,可以经由过程编写Tab文件来实现代码复用。
1. Tag文件的布局
Tag文件是扩大名为.tag的文本文件,其布局几乎与JSP文件雷同,只是扩大名不合。也就是说,一个Tag文件中可以有通俗的HTML标识表记标帜符、某些特别的指令标识表记标帜、成员变量和办法、Java法度片和Java表达式等。以下是一个简单的Tab文件:
FirstTag.tag
<HTML><BODY>
<p>这是一个Tab文件,负责策画1~100的连气儿和
<% int sum=0,i=1;
for(i=1;i<=100;i++){
sum=sum+i;
}
out.println(sum);
%>
</BODY></HTML>
2. Tag标识表记标帜
编写了一个Tag文件后,也就自定义出了一个标识表记标帜,该标识表记标帜的格局如下:
<Tag 文件名字/>
或
<Tag 文件名字 >
标识表记标帜体
</ Tag 文件名字>
也就是说,一个Tag文件对应一个标识表记标帜,习惯上称为Tag标识表记标帜。若干Tag标识表记标帜构成一个标识表记标帜库,习惯上称为自定义标识表记标帜库。
3. Tag标识表记标帜的应用
Tag文件只供JSP页面应用,用户不克不及经由过程浏览器直接恳求一个Tag文件。一个JSP页面应用Tag标识表记标帜来调用响应的Tag文件。
为了能让一个Web应用中的JSP页面应用某些Tag文件,必须把这些Tag文件存放到Tomcat办事器指定的目次中,寄存放到“Web办事目次\WEB-INF\tags”中。此中的WEB-INF和tags都是固定的子目次名称,而tags下的子目次名字可由用户给定。也就是说,tags或其下的子目次是专门存放Tag文件的,而一个Tag文件对应一个Tag标识表记标帜,是以习惯上称tags或其下的子目次为一个标识表记标帜库。
一个JSP页面必须应用<taglib>指令标识表记标帜引入若干个标识表记标帜库。引入标识表记标帜库后,JSP页面就可以应用带前缀的Tag标识表记标帜调用响应的Tag文件,此中的前缀由<taglib>指令中的prefix属性指定。例如:
<前缀:Tag 文件名字/>
前缀可以有效地区分不合标识表记标帜库中具有雷同名字的标识表记标帜文件。
当应用JSP页面调用一个Tag文件时,Tomcat办事器负责处理惩罚响应的Tag文件,也就是说,Tomcat办事器将Tag文件转译成一个Java文件,再将这个Java文件编译生成字节码文件,并将这个字节码文件加载到内存中,然后履行这个字节码文件,就如同它是一个常规的JSP文件一样。
如今用一个例子来申明如何在JSP页面中调用Tag文件。假设应用的Web办事目次是Tomcat安装目次webapps下的一个子目次chapter3。编写FirstTag.tag和SecondTag.tag两个Tag文件。
FirstTag.tag
<HTML><BODY>
<p>这是一个Tab文件,负责策画1~100的连气儿和
<% int sum=0,i=1;
for(i=1;i<=100;i++){
sum=sum+i;
}
out.println(sum);
%>
</BODY></HTML>
SecondTag.tag
<p>这是一个Tab文件负责策画20内的素数:
<% int i,j;
for(i=1;i<=20;i++){
for(j=2;j<i;j++){
if(i%j==0)
break;
}
if(j==i)
out.println(<BR>素数:+i);
}
%>
在chapter3下建树目次布局:chapter3\WEB-INF\tags\tagsTwo,将FirstTag.tag存放在tags目次中,而SecondTag.tag存放在tags的子目次tagsTwo中。
【例6】页面文件example3-6.jsp应用了FirstTag.tag和SecondTag.tag文件。
Example3_6.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=com%>
<%@ taglib tagdir=/WEB-INF/tags/tagsTwo prefix=game%>
<HTML><BODY>
<H3>以下是调用Tag文件的结果:</H3>
<com:FirstTag />
<H3>以下是调用Tag文件的结果:</H3>
<game:SecondTag />
</BODY></HTML>
结果如图所示:
4. Tag文件中的常用指令
与JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的行动。Tag文件中经常应用的指令有tag、taglib、include、attribute、variable。以下将分别讲述上述指令在Tag文件中的感化和用法。
(1)tag指令
Tag文件中的tag指令类似于JSP文件中的page指令。Tag文件经由过程应用tag指令可以指定某些属性的值,以便从总体上影响标识表记标帜文件的处理惩罚和默示。Tag指令的语法如下:
<%@ tag 属性1=”属性值” 属性2=”属性值” ……属性n=”属性值”>
一个Tag文件中可以应用多个tag指令,是以经常应用多个tag指令为属性指定须要的值:
<%@ tag 属性1=”属性值”>
<%@ tag 属性2=”属性值”>
……
<%@ tag 属性n=”属性值”>
Tag指令可以操纵的属性有body-content、language、import、pageEncoding。以下分别讲述如何设置这些属性的值。
A.body-content属性
我们已经知道,一个Tag文件会对应一个自定义标识表记标帜,该标识表记标帜的格局如下:
<Tag 文件名字 />
或
<Tag 文件名字>
标识表记标帜体
</Tag 文件名字>
JSP文件经由过程应用该定义标识表记标帜调用响应的Tag文件,那么JSP文件到底应当应用自定义标识表记标帜的哪种格局来调用Tag文件呢?
一个Tag文件经由过程tag指令指定body-content属性的值,以决意Tag标识表记标帜的应用格局,也就是说,该属性的值可以断定JSP页面应用Tag标识表记标帜时是否可以有标识表记标帜体,若是容许有标识表记标帜体,该属性会给出标识表记标帜体内容的类型。
Body-content属性值有empty、tagdependent、scriptless,默认值是scriptless。
若是body-content属性的值是empty,那么JSP页面必须应用没有标识表记标帜体的Tag标识表记标帜
<Tag 文件名字 />
来调用响应的Tag文件。
若是body-content属性的值是tagdependent或scriptless,那么JSP页面可以应用无标识表记标帜体或有标识表记标帜体的Tag标识表记标帜
<Tag文件名字>
标识表记标帜体
</Tag文件名字>
来调用响应的Tag文件。若是属性值是scriptless,那么标识表记标帜体中不克不及有Java法度片;若是属性值是tagdependent,那么标识表记标帜体的内容将按纯文本处理惩罚。
Tag标识表记标帜中的标识表记标帜体由响应的Tag文件负责处理惩罚,是以,当JSP页面应用有标识表记标帜体的Tag标识表记标帜调用一个Tag文件时,可以经由过程“标识表记标帜体”向该Tag文件动态地传递文本数据或须要的JSP指令。
Tag文件经由过程应用指令
<jsp:doBody />
来获得JSP页面传递过来的“标识表记标帜体”,也就是说,在一个Tag文件中,<jsp:doBody/>指令被调换成“标识表记标帜体”的内容。
【例 7】Show.tag文件负责用某种色彩显示文本,example3_7.jsp页面负责调用Show.tag文件,并且经由过程标识表记标帜体向Show.tag文件传递文本内容。
Example3_7.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib prefix=tags tagdir=/WEB-INF/tags %>
<HTML>
<tags:Show>
我喜好看足球
</tags:Show>
<tags:Show>
I love this game
</tags:Show>
<tags:Show>
我喜好看奥运比赛
</tags:Show>
</HTML>
Show.tag
<BODY><P>
<% for(int i=1;i<=3;i++){ %>
<FONT color=red size=3>
<jsp:doBody />
</FONT>
<% }
%>
</P></BODY>
结果如图所示:
B. Language属性
Language属性的值指定Tag文件应用的脚本说话,今朝只能取值Java,其默认值就是Java,是以在编写Tag文件时,没有须要应用tag指令指定language属性的值。
C.import属性
Import属性的感化是为Tag文件引入Java核心包中的类,如许就可以在Tag文件的法度片项目组、变量及函数声明项目组、表达式项目组应用包中的类。Import属性可以取多个值,import属性已经有如下值:”java.lang.”、”javax.servlet.”、”javax.servlet.jsp.”、”javax.servlet.http.”。
D. pageEncoding属性
该属性指定Tag文件的字符编码,其默认值是ISO-8859-1。Tag文件必须应用ANSI编码保存。
(2)include指令
在Tag文件中也可以应用include指令标识表记标帜,其应用办法和感化与JSP文件中类似。
【例8】Tag文件Trangle.tag负责策画显示三角形的面积。Example3_8.jsp页面在调用Trangle.tag文件时向Trangle.tag文件传递三角形三边的长度。Example3_8.jsp页面存放在Web办事目次chapter3zhong ,Trangle.tag存放在chapter3\WEB-INF\tags中。
Example3_8.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=computer %>
<HTML><BODY>
<H3>以下是调用Tag文件的结果:</H3>
<computer:Trangle sideA=3 sideB=4 sideC=5/>
</BODY></HTML>
Trangle.tag
<p>这是一个Tag文件,负责策画三角形的面积。
<%@ attribute name=sideA required=true %>
<%@ attribute name=sideB required=true %>
<%@ attribute name=sideC required=true %>
<%! public String getArea(double a,double b,double c){
if(a+b>c&&a+c>b&&c+b>a){
double p=(a+b+c)/2.0;
double area=Math.sqrt(p(p-a)(p-b)(p-c));
return <BR>三角形的面积为:+area;
}
else{
return(<BR>+a+,+b+,+c+不克不及构成一个三角形,无法策画面积);
}
}
%>
<% out.println(<BR>JSP页面传递过来的三条边:+sideA+,+sideB+,+sideC);
double a=Double.parseDouble(sideA);
double b=Double.parseDouble(sideB);
double c=Double.parseDouble(sideC);
out.println(getArea(a,b,c));
%>
结果如图所示:
小结
1. JSP页面应用page指令可认为属性contentType指定几个值?
答:JSP页面应用page指令只能为contentType指定一个值
2. JSP页面应用page指令可认为import属性指定多个值吗?
答:可认为该属性指定多个值
3. Include指令标识表记标帜和include动作标识表记标帜有何不合?
答:在处理惩罚体式格式和处理惩罚时候上是不合的。Include指令标识表记标帜用嵌入体式格式处理惩罚文件,在编译阶段就处理惩罚所需文件,长处是页面的履行速度快;而include动作标识表记标帜不应用嵌入体式格式来处理惩罚所需文件,在JSP页面运行时才处理惩罚文件,也就是说,当Tomcat办事器把JSP页面转译成Java文件时,不把JSP页面中include动作标识表记标帜所包含的文件与原JSP页面归并一个新的JSP页面,而是告诉Java申明器,这个文件在JSP运行时(Java文件的字节码文件被加载履行)才被处理惩罚,其长处是能更灵活地处理惩罚所需文件(见后面的param标识表记标帜),毛病是履行速度要慢一些。
4. Param动作标识表记标帜经常作为哪些标识表记标帜的子标识表记标帜,有何感化?
答:param动作标识表记标帜可以作为include、forward动作标识表记标帜的子标识表记标帜来应用,该标识表记标帜以“名字-值”对的情势为这些动作标识表记标帜供给附加信息。
5. Tag文件该当存放在如何的目次中?
答:存放到“Web办事目次\WEB-INF\tags”中
6. 用户可以应用浏览器直接接见一个Tag文件吗?
答:用户不克不及经由过程浏览器直接恳求一个Tag文件
7. JSP页面如何调用一个Tag文件?
答:JSP页面可以应用带前缀的Tag标识表记标帜调用响应的Tag文件
8. 编写两个Tag文件Rect.tag和Circle.tag。Rect.tag负责策画矩形的面积,Circle.tag负责策画圆的面积。编写一个JSP页面,该JSP页面应用Tag标识表记标帜调用Rect.tag和Circle.tag。调用Rect.tag时,向其传递矩形的两个边的长度;调用Circle.tag时,向其传递圆的半径。
8.Jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=rect%>
<%@ taglib tagdir=/WEB-INF/tags prefix=circle%>
<HTML><BODY>
<H3>以下是矩形的面积:</H3>
<rect:Rect length=4 width=3/>
<H3>以下是圆的面积:</H3>
<circle:Circle radius=4/>
</BODY></HTML>
Rect.tag
<p>这是一个Tag文件,负责策画矩形的面积。
<%@ attribute name=length required=true %>
<%@ attribute name=width required=true %>
<%! public String getArea(double a,double b){
double area=ab;
return <BR>矩形的面积为:+area;
}
%>
<% out.println(<BR>JSP页面传递过来的两条边:+length+,+width);
double a=Double.parseDouble(length);
double b=Double.parseDouble(width);
out.println(getArea(a,b));
%>
Circle.tag
<p>这是一个Tag文件,负责策画圆的面积。
<%@ attribute name=radius required=true %>
<%! public String getArea(double a){
double area=3.14159265aa;
return <BR>圆的面积为:+area;
}
%>
<% out.println(<BR>JSP页面传递过来的半径:+radius);
double a=Double.parseDouble(radius);
out.println(getArea(a));
%>
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
JSP标识表记标帜是JSP页面中很首要的构成项目组,JSP标识表记标帜包含指令标识表记标帜、动作标识表记标帜和自定义标识表记标帜。此中自定义标识表记标帜首要讲述与Tag文件有关的Tag标识表记标帜。
一 指令标识表记标帜page
Page指令标识表记标帜,简称page指令,用来定义全部JSP页面的一些属性和这些属性的值。可以用一个page指令指定多个属性的值,也可以应用多个page指令分别为每个属性指定值。Page指令的感化对全部页面有效,与其书写的地位无关,习惯把page指令写在全部页面的最前面。Page指令的格局如下:
<%@ page 属性1=”属性1的值” 属性2=”属性2的值” ... %>
Page指令标识表记标帜可认为下列属性指定值:contentType属性,import属性,language属性,session属性,buffer属性,autoFlush属性,isThreadSafe属性,pageEncoding属性。
1. 属性contentType的值
JSP页面应用page指令只能为contentType指定一个值,以此断定响应的MIME类型。当用户恳求一个JSP页面时,Tomcat办事器负责申明履行JSP页面,并将某些信息发送给客户机的浏览器,以便用户浏览这些信息。若是客户机的浏览器用HTML解析器来解析履行这些信息,就可以用page指令指定JSP页面的contentType属性的值为“text/html;charset=GB2312”,例如:
<%@ page contentType=”text/html;charset=GB2312” %>
若是不应用page指令为contentType指定一个值,那么属性“contentType”的默认值是“text/html;charset=ISO-8859-1”。
注:不容许两次应用page指令给contentType属性指定不合的值,下列用法错误:
<%@ page contentType=“text/html;charset=GB2312” %>
<%@page contentType=“application/msword” %>
注:若是想深切懂得MIME类型,可以在收集搜刮引擎中搜刮MIME关键字。
【例1】建造3个JSP页面:A.jsp页面,应用page指令设置contentType属性的值为”text/html;charset=GB2312”,当客户恳求A.jsp页面时,客户的浏览器应用HTML解析器来解析履行收到的信息;B.jsp页面,应用page指令设置contentType属性的值为“application/msword”,当客户恳求B.jsp页面时,客户的浏览器将应用Word应用法度来解析履行收到的信息;C.jsp页面,应用page指令设定contentType属性的值为“image/jpeg”,当客户恳求C.jsp页面时,客户的浏览器将应用图形解析器来解析履行收到的信息。
A.jsp
<%@ page contentType=text/html;Charset=UTF-8 %>
<HTML><BODY bgcolor=cyan>
<FONT size=3>
<P>我在进修page指令
</FONT></BODY></HTML></HTML>
B.jsp
<%@ page contentType=application/msword %>
<HTML><BODY bgcolor=cyan>
<FONT size=3>
<P>启动Word应用法度
</FONT></BODY></HTML>
C.jsp
<%@ page contentType=image/jpeg %>
<%@ page import=java.awt. %>
<%@ page import=java.io. %>
<%@ page import=java.awt.image. %>
<%@ page import=java.awt.geom. %>
<%@ page import=com.sun.image.codec.jpeg. %>
<% int width=260,height=260;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,width,height);
Graphics2D g_2d=(Graphics2D)g;
Ellipse2D ellipse=new Ellipse2D.Double(40,80,100,40);
g_2d.setColor(Color.blue);
AffineTransform trans=new AffineTransform();
for(int i=1;i<=12;i++){
trans.rotate(30.0Math.PI/180,90,100);
g_2d.setTransform(trans);
g_2d.draw(ellipse);
}
g.dispose();
OutputStream outClient=response.getOutputStream();
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(outClient);
encoder.encode(image);
%>
结果如图所示:
2. 属性import的值
Import属性的感化是为JSP页面引入Java核心包中的类,如许就可以在JSP页面的法度片项目组、变量及办法声明项目组、表达式项目组应用包中的类。可认为该属性指定多个值,该属性的值可所以Java某包中的所有类或一个具体的类。
应用page指令可认为import属性指定几个值,这些值用逗号分隔。例如:
<%@page import=”java.util.”,”java.io.”,”java.awt.”%>
也可以应用多个page指令为import属性指定几个值。例如:
<%@ page import=”java.util.” %>
<%@ page import=”java.io. %>
<%@ page import=”java.awt.” %>
当为import属性指定多个值时,JSP引擎把JSP页面转换成的Java文件中会有以下import语句:
Import java.util.;
Import java.io.;
Import java.awt.;
JSP页面的默认import属性有如下值:”java.lang.”、”javax.servlet.”、”havax.servlet.jsp.”、”javax.servlet.http.”。Import属性是一个斗劲特别的属性,可以被指定多个值。须要希罕重视的是,除import属性外,其余属性只能被指定一个值。
3. 属性language的值
Language属性定义JSP页面应用的脚本说话,该属性的值今朝只能取“Java”。为language属性指定值的格局如下:
<%@ page language=”java” %>
Language属性的默认值是“Java”。若是在JSP页面没有应用page指令指定该属性的值,那么JSP页面默认有如下page指令:
<%@ page language=”java” %>
4. 属性session
Session属性的值用于设置是否须要应用Tomcat办事器内置的session对象。Session属性的值可所以true或者false,默认属性值是true。
5. 属性buffer
内置输出流对象out负责将办事器的某些信息或应用成果发送到客户端显示,buffer属性用来指定out应用的缓冲区大小或不应用缓冲区。
Buffer属性的默认值是8KB,可以应用page指令批改这个默认值。例如:
<%@ page buffer=”24KB” %>
若是不筹办让out流应用缓冲区,可将buffer属性的值设为none。
6. 属性autoFlush
autoFlush属性指定out流的缓冲区被填满时,缓冲区是否主动刷新。
autoFlush可以取值true或false,默认值是true。当autoFlush属性取值为false时,若是out的缓冲区填满,就会呈现缓存溢出异常。当buffer的值为none时,autoFlush的值就不克不及设置成false。
7. 属性isThreadSafe
isThreadSafe属性取值true或false,默认值是true。Tomcat办事器应用多线程技巧处理惩罚客户的恳求,即当多个客户机恳求一个JSP页面时,Tomcat办事器为每个客户机启动一个线程,每个线程分别负责履行常驻内存的字节码文件来响应响应客户机的恳求。这些线程由Tomcat办事器来经管,将CPU的应用权在各线程之间快速切换,以包管每个线程都有机会履行字节码文件。当isThreadSafe属性值为true时,CPU的应用权在各线程间快速切换,也就是说,即使一个客户机的线程没有履行完毕,CPU的应用权也可能要切换给其他线程。如此轮流,直到各线程履行完毕。当JSP应用page指令将isThreadSafe属性值设置成false时,该JSP页面同一时刻只能处理惩罚响应一个客户机的恳求,其他客户持续列队守候。也就是说,CPU要包管一个线程将JSP页面履行完毕,才会把CPU应用权切换给其他线程。
二 指令标识表记标帜include
设计一个Web应用可能须要编写若干个JSP页面,若是这些JSP页面都须要显示某些同样的信息,如每个JSP页面上都可能须要一个导航条,以便用户在各JSP页面之间往返切换,那么每个JSP页面都可以应用include指令标识表记标帜在页面的恰当地位整体嵌入一个雷同的文件。
指令标识表记标帜include的语法如下:
<%@ include file=”文件的URL” %>
该指令标识表记标帜的感化是在JSP页面上呈现该指令的地位处静态嵌入一个文件。被嵌入的文件必须是可接见和可应用的。若是该文件和当前JSP页面在同一Web办事目次中,那么“文件的URL”就是文件的名字;若是该文件在JSP页面地点的Web办事目次的一个子目次中,如image子目次,那么“文件的URL”就是“image/文件的名字”.
所谓静态嵌入,就是Tomcat办事器在编译阶段就完成文件的嵌入操纵,即将当前的JSP页面和要嵌入的文件归并成一个新的JSP页面,Tomcat办事器再将这个新的JSP页面转译成Java文件。是以,嵌入文件后,必须包管新归并成的JSP页面合适JSP语律例则,即可以或许成为一个NSP页面文件。比如,当前JSP页面已经应用page指令设置了contentType属性的值:
<%@ page coontentType=”text/html;Charset=GB2312” %>
若被嵌入的文件也是一个JSP页面,此中也应用page指令为contentType属性设置了值:
<%@ page contentType=”application/msword” %>
那么,归并后的JSP页面就两次应用page指令为contentType属性设置了不合的属性值,导致语法错误,因为JSP页面中的page指令只能为contentType指定一个值。
Tomcat 5.0版本今后的办事器每次都要搜检被嵌入的文件是否被修悔改。是以,JSP页面成功静态嵌入一个文件后,若是对嵌入的文件进行了批改,那么Tomcat办事器会从头编译JSP页面,即将当前的JSP页面和批改后的文件归并成一个JSP页面,然后Tomcat办事器将这个新的JSP页面转译成Java类文件。
【例 2】在JSP页面静态嵌入一个文本文件Hello.txt,该文本文件的内容是:”祝贺深圳成功举办大运会“。文本文件和当前JSP页面在同一Web办事目次中。
Example3_2.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<HTML><BODY bgcolor=yellow>
<H1>
<%@ include file=”Hello.txt” %>
</H1>
</BODY></HTML>
上述example3_2.jsp等价于下面的JSP文件exm.jsp。
Exm.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<HTML><BODY bgcolor=yellow>
<H1>祝贺深圳成功举办大运会</H1>
</BODY></HTML>
注:在Tomcat 4 版本中,不容许在include指令标识表记标帜嵌入的文件中应用page指令指定contentType属性的值。然则在Tomcat 5 后的版本中,在include指令标识表记标帜嵌入的文件中必须应用page指令指定contentType属性的值,并且指定的值必须与嵌入该文件的JSP页面中的page指令指定的contentType属性的值雷同。
三 动作标识表记标帜include
动作标识表记标帜是一种特别的标识表记标帜,影响JSP运行时的行动。Include动作标识表记标帜的语法有以下两种格局:
<jsp:include page=”文件的URL”/>
或
<jsp:include page=”文件的URL”>
子标识表记标帜
</jsp:include>
Include动作标识表记标帜在JSP页面履行阶段处理惩罚所须要的文件,是以JSP页面和它所须要的文件在逻辑和语法上是自力的。重视:当include动作标识表记标帜不须要子标识表记标帜时,必须应用上述第一种情势。
尽管include动作标识表记标帜和include指令标识表记标帜的感化都是处理惩罚所需文件,然则在处理惩罚体式格式和处理惩罚时候上是不合的。Include指令标识表记标帜用嵌入体式格式处理惩罚文件,在编译阶段就处理惩罚所需文件,长处是页面的履行速度快;而include动作标识表记标帜不应用嵌入体式格式来处理惩罚所需文件,在JSP页面运行时才处理惩罚文件,也就是说,当Tomcat办事器把JSP页面转译成Java文件时,不把JSP页面中include动作标识表记标帜所包含的文件与原JSP页面归并一个新的JSP页面,而是告诉Java申明器,这个文件在JSP运行时(Java文件的字节码文件被加载履行)才被处理惩罚,其长处是能更灵活地处理惩罚所需文件(见后面的param标识表记标帜),毛病是履行速度要慢一些。Include动作标识表记标帜要处理惩罚的文件若是不是JSP文件,就将文件的内容发送到客户机,由客户机负责履行并显示;若是包含的文件是JSP文件,那么Tomcat办事器就履行这个JSP文件,然后将履行的成果发送到客户机,并由客户既负责显示这些成果。
注:书写include动作标识表记标帜时要重视“jsp”、“:”、“include”三者之间不要有空格。
【例 3】example3_3.jsp页面包含两个文件:time.jsp和sun.jsp。Time.jsp和example3_3.jsp页面在同一Web办事目次中,sun.jsp在当前Web办事目次的子目次image中。
Example3_3.jsp
<%@ page contentType=”text/html;Charset-GB2312” %>
<HTML><BODY bgcolor=red>
<jsp:include page=”time.jsp”/>
<P>请看一幅图像:<BR/>
<jsp:include page=”images/sun.jsp” />
</BODY></HTML>
Time.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<%@ page import=”java.util.Date” %>
<HTML><BODY><FONT size=3>
<P>如今的时候:
<% Date date=new Date();
Out.println(date.toString());
%>
</FONT></BODY></HTML>
Sun.jsp
<%@ page contentType=”text/html;Charset=GB2312” %>
<HTML><BODY>
<IMAGE src=”image/ok.jpg” width=120 height=120>太阳</IMAGE>
</BODY></HTML>
注:sun.jsp页面应用的文件ok.jpg需保存在当前Web办事目次(chapter3)的image子目次中。
结果如图所示:
四 动作标识表记标帜pagam
Param动作标识表记标帜可以作为include、forward动作标识表记标帜的子标识表记标帜来应用,该标识表记标帜以“名字-值”对的情势为这些动作标识表记标帜供给附加信息。
Param动作标识表记标帜的格局如下:
<jsp:param name=”名字” value=”指定给name属性的值”/>
当应用include动作标识表记标帜动态处理惩罚所须要的JSP文件时,经常会应用param子标识表记标帜,以便向动态加载的JSP页面传递须要的值,这也表现出include动作标识表记标帜比include指令标识表记标帜更灵活的特点。Include动作标识表记标帜所要加载的JSP文件可以应用Tomcat办事器供给的request内置对象获取param标识表记标帜中name属性所供给的值。
【例 4】建造页面example3-4.jsp,应用include动作标识表记标帜动态加载computer.jsp文件。当computer.jsp文件被加载时,该文件获取include动作标识表记标帜的param子标识表记标帜中属性name的值。
Example3_4.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=yellow>
<P>加载一个JSP文件,该文件负责策画连气儿整数之和:
<jsp:include page=computer.jsp>
<jsp:param name=item value=100 />
</jsp:include>
</BODY></HTML>
Computer.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY>
<% String str=request.getParameter(item);
int n=Integer.parseInt(str);
int sum=0;
for(int i=1;i<=n;i++){
sum=sum+i;
}
out.println(<BR>从1~+n+的连气儿和是:</BR>+sum);
%>
</BODY></HTML>
结果如图所示:
五 动作标识表记标帜forward
Forword动作标识表记标帜的感化是,从该标识表记标帜呈现处停止当前JSP页面的持续履行,而转向履行forward动作标识表记标帜中page属性所指定的JSP页面。
Forward动作标识表记标帜有两种格局:
<jsp:forward page=”要转向的页面”/>
或
<jsp:forward page=”要转向的页面”>
Param 子标识表记标帜
</jsp:forward>
须要重视的是,当forward动作标识表记标帜不须要param字标识表记标帜时,必须应用上述第一种情势。Forward标识表记标帜可以应用param动作标识表记标帜作为子标识表记标帜,以便向要转向的页面传送信息。Forward动作标识表记标帜指定的要转向的JSP文件,可以应用Tomcat办事器供给的request内置对象获取param子标识表记标帜中name属性所供给的值。
【例 5】建造example3_5.jsp页面,应用forward标识表记标帜转向num1.jsp或num2.jsp页面。在example3_5.jsp页面中随即获取一个1~100之间的整数,该数大于50就转向页面num1.jsp,不然转向页面num2.jsp。Forward动作标识表记标帜时用param子标识表记标帜,将example3-5.jsp页面获取的随机数传递给要转向的页面。
Example3_5.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY>
<%out.println(按照不合的值转向不合的页面:<BR>);
int n=(int)(Math.random()100)+1;
if(n>50){
%> <jsp:forward page=num1.jsp>
<jsp:param name=item value=<%=n %> />
</jsp:forward>
<%
}
else{
%> <jsp:forward page=num2.jsp>
<jsp:param name=item value=<%=n %> />
</jsp:forward>
<%
}
out.println(看不见这句话);
%>
</BODY></HTML>
Num1.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan>
<% String str=request.getParameter(item);
int n=Integer.parseInt(str);
out.println(<BR>不大于+n+的素数:</BR>);
int i=0,j=0;
for(i=1;i<=n;i++){
for(j=2;j<i;j++){
if(i%j==0)
break;
}
if(j==i)
out.println(,+i);
}
%>
</BODY></HTML>
Num2.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML><BODY bgcolor=cyan>
<% String str=request.getParameter(item);
int n=Integer.parseInt(str);
out.println(<BR>不大于+n+的奇数:</BR>);
for(int i=1;i<=n;i++){
if(i%2!=0)
out.println(,+i);
}
%>
</BODY></HTML>
结果如图所示:
六 动作标识表记标帜useBean
该标识表记标帜用来创建并应用一个JavaBean,它是很是首要的一个动作标识表记标帜。Sun公司倡导的是:用HTML完成JSP页面的静态项目组,用JavaBean完成动态项目组,实现真正意义上的静态与动态的分别。
七 Tag文件与Tag标识表记标帜
一个Web应用中的很多JSP页面可能须要应用某些雷同的信息,如都须要应用雷同的导航栏、题目等。若是能将很多页面都须要的共同的信息形成一种特别文件,并且各JSP页面都可以应用这种特别的文件,那么如许的特别文件就是可复用的代码。代码复用是软件设计的一个首要方面,代码复用是衡量软件可保护性的首要指标之一。为了更好地保护一个Web应用,JSP页面可以经由过程自定义标识表记标帜应用一种特别的文件:Tag文件(标识表记标帜),在设计Web应用时,可以经由过程编写Tab文件来实现代码复用。
1. Tag文件的布局
Tag文件是扩大名为.tag的文本文件,其布局几乎与JSP文件雷同,只是扩大名不合。也就是说,一个Tag文件中可以有通俗的HTML标识表记标帜符、某些特别的指令标识表记标帜、成员变量和办法、Java法度片和Java表达式等。以下是一个简单的Tab文件:
FirstTag.tag
<HTML><BODY>
<p>这是一个Tab文件,负责策画1~100的连气儿和
<% int sum=0,i=1;
for(i=1;i<=100;i++){
sum=sum+i;
}
out.println(sum);
%>
</BODY></HTML>
2. Tag标识表记标帜
编写了一个Tag文件后,也就自定义出了一个标识表记标帜,该标识表记标帜的格局如下:
<Tag 文件名字/>
或
<Tag 文件名字 >
标识表记标帜体
</ Tag 文件名字>
也就是说,一个Tag文件对应一个标识表记标帜,习惯上称为Tag标识表记标帜。若干Tag标识表记标帜构成一个标识表记标帜库,习惯上称为自定义标识表记标帜库。
3. Tag标识表记标帜的应用
Tag文件只供JSP页面应用,用户不克不及经由过程浏览器直接恳求一个Tag文件。一个JSP页面应用Tag标识表记标帜来调用响应的Tag文件。
为了能让一个Web应用中的JSP页面应用某些Tag文件,必须把这些Tag文件存放到Tomcat办事器指定的目次中,寄存放到“Web办事目次\WEB-INF\tags”中。此中的WEB-INF和tags都是固定的子目次名称,而tags下的子目次名字可由用户给定。也就是说,tags或其下的子目次是专门存放Tag文件的,而一个Tag文件对应一个Tag标识表记标帜,是以习惯上称tags或其下的子目次为一个标识表记标帜库。
一个JSP页面必须应用<taglib>指令标识表记标帜引入若干个标识表记标帜库。引入标识表记标帜库后,JSP页面就可以应用带前缀的Tag标识表记标帜调用响应的Tag文件,此中的前缀由<taglib>指令中的prefix属性指定。例如:
<前缀:Tag 文件名字/>
前缀可以有效地区分不合标识表记标帜库中具有雷同名字的标识表记标帜文件。
当应用JSP页面调用一个Tag文件时,Tomcat办事器负责处理惩罚响应的Tag文件,也就是说,Tomcat办事器将Tag文件转译成一个Java文件,再将这个Java文件编译生成字节码文件,并将这个字节码文件加载到内存中,然后履行这个字节码文件,就如同它是一个常规的JSP文件一样。
如今用一个例子来申明如何在JSP页面中调用Tag文件。假设应用的Web办事目次是Tomcat安装目次webapps下的一个子目次chapter3。编写FirstTag.tag和SecondTag.tag两个Tag文件。
FirstTag.tag
<HTML><BODY>
<p>这是一个Tab文件,负责策画1~100的连气儿和
<% int sum=0,i=1;
for(i=1;i<=100;i++){
sum=sum+i;
}
out.println(sum);
%>
</BODY></HTML>
SecondTag.tag
<p>这是一个Tab文件负责策画20内的素数:
<% int i,j;
for(i=1;i<=20;i++){
for(j=2;j<i;j++){
if(i%j==0)
break;
}
if(j==i)
out.println(<BR>素数:+i);
}
%>
在chapter3下建树目次布局:chapter3\WEB-INF\tags\tagsTwo,将FirstTag.tag存放在tags目次中,而SecondTag.tag存放在tags的子目次tagsTwo中。
【例6】页面文件example3-6.jsp应用了FirstTag.tag和SecondTag.tag文件。
Example3_6.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=com%>
<%@ taglib tagdir=/WEB-INF/tags/tagsTwo prefix=game%>
<HTML><BODY>
<H3>以下是调用Tag文件的结果:</H3>
<com:FirstTag />
<H3>以下是调用Tag文件的结果:</H3>
<game:SecondTag />
</BODY></HTML>
结果如图所示:
4. Tag文件中的常用指令
与JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的行动。Tag文件中经常应用的指令有tag、taglib、include、attribute、variable。以下将分别讲述上述指令在Tag文件中的感化和用法。
(1)tag指令
Tag文件中的tag指令类似于JSP文件中的page指令。Tag文件经由过程应用tag指令可以指定某些属性的值,以便从总体上影响标识表记标帜文件的处理惩罚和默示。Tag指令的语法如下:
<%@ tag 属性1=”属性值” 属性2=”属性值” ……属性n=”属性值”>
一个Tag文件中可以应用多个tag指令,是以经常应用多个tag指令为属性指定须要的值:
<%@ tag 属性1=”属性值”>
<%@ tag 属性2=”属性值”>
……
<%@ tag 属性n=”属性值”>
Tag指令可以操纵的属性有body-content、language、import、pageEncoding。以下分别讲述如何设置这些属性的值。
A.body-content属性
我们已经知道,一个Tag文件会对应一个自定义标识表记标帜,该标识表记标帜的格局如下:
<Tag 文件名字 />
或
<Tag 文件名字>
标识表记标帜体
</Tag 文件名字>
JSP文件经由过程应用该定义标识表记标帜调用响应的Tag文件,那么JSP文件到底应当应用自定义标识表记标帜的哪种格局来调用Tag文件呢?
一个Tag文件经由过程tag指令指定body-content属性的值,以决意Tag标识表记标帜的应用格局,也就是说,该属性的值可以断定JSP页面应用Tag标识表记标帜时是否可以有标识表记标帜体,若是容许有标识表记标帜体,该属性会给出标识表记标帜体内容的类型。
Body-content属性值有empty、tagdependent、scriptless,默认值是scriptless。
若是body-content属性的值是empty,那么JSP页面必须应用没有标识表记标帜体的Tag标识表记标帜
<Tag 文件名字 />
来调用响应的Tag文件。
若是body-content属性的值是tagdependent或scriptless,那么JSP页面可以应用无标识表记标帜体或有标识表记标帜体的Tag标识表记标帜
<Tag文件名字>
标识表记标帜体
</Tag文件名字>
来调用响应的Tag文件。若是属性值是scriptless,那么标识表记标帜体中不克不及有Java法度片;若是属性值是tagdependent,那么标识表记标帜体的内容将按纯文本处理惩罚。
Tag标识表记标帜中的标识表记标帜体由响应的Tag文件负责处理惩罚,是以,当JSP页面应用有标识表记标帜体的Tag标识表记标帜调用一个Tag文件时,可以经由过程“标识表记标帜体”向该Tag文件动态地传递文本数据或须要的JSP指令。
Tag文件经由过程应用指令
<jsp:doBody />
来获得JSP页面传递过来的“标识表记标帜体”,也就是说,在一个Tag文件中,<jsp:doBody/>指令被调换成“标识表记标帜体”的内容。
【例 7】Show.tag文件负责用某种色彩显示文本,example3_7.jsp页面负责调用Show.tag文件,并且经由过程标识表记标帜体向Show.tag文件传递文本内容。
Example3_7.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib prefix=tags tagdir=/WEB-INF/tags %>
<HTML>
<tags:Show>
我喜好看足球
</tags:Show>
<tags:Show>
I love this game
</tags:Show>
<tags:Show>
我喜好看奥运比赛
</tags:Show>
</HTML>
Show.tag
<BODY><P>
<% for(int i=1;i<=3;i++){ %>
<FONT color=red size=3>
<jsp:doBody />
</FONT>
<% }
%>
</P></BODY>
结果如图所示:
B. Language属性
Language属性的值指定Tag文件应用的脚本说话,今朝只能取值Java,其默认值就是Java,是以在编写Tag文件时,没有须要应用tag指令指定language属性的值。
C.import属性
Import属性的感化是为Tag文件引入Java核心包中的类,如许就可以在Tag文件的法度片项目组、变量及函数声明项目组、表达式项目组应用包中的类。Import属性可以取多个值,import属性已经有如下值:”java.lang.”、”javax.servlet.”、”javax.servlet.jsp.”、”javax.servlet.http.”。
D. pageEncoding属性
该属性指定Tag文件的字符编码,其默认值是ISO-8859-1。Tag文件必须应用ANSI编码保存。
(2)include指令
在Tag文件中也可以应用include指令标识表记标帜,其应用办法和感化与JSP文件中类似。
【例8】Tag文件Trangle.tag负责策画显示三角形的面积。Example3_8.jsp页面在调用Trangle.tag文件时向Trangle.tag文件传递三角形三边的长度。Example3_8.jsp页面存放在Web办事目次chapter3zhong ,Trangle.tag存放在chapter3\WEB-INF\tags中。
Example3_8.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=computer %>
<HTML><BODY>
<H3>以下是调用Tag文件的结果:</H3>
<computer:Trangle sideA=3 sideB=4 sideC=5/>
</BODY></HTML>
Trangle.tag
<p>这是一个Tag文件,负责策画三角形的面积。
<%@ attribute name=sideA required=true %>
<%@ attribute name=sideB required=true %>
<%@ attribute name=sideC required=true %>
<%! public String getArea(double a,double b,double c){
if(a+b>c&&a+c>b&&c+b>a){
double p=(a+b+c)/2.0;
double area=Math.sqrt(p(p-a)(p-b)(p-c));
return <BR>三角形的面积为:+area;
}
else{
return(<BR>+a+,+b+,+c+不克不及构成一个三角形,无法策画面积);
}
}
%>
<% out.println(<BR>JSP页面传递过来的三条边:+sideA+,+sideB+,+sideC);
double a=Double.parseDouble(sideA);
double b=Double.parseDouble(sideB);
double c=Double.parseDouble(sideC);
out.println(getArea(a,b,c));
%>
结果如图所示:
小结
1. JSP页面应用page指令可认为属性contentType指定几个值?
答:JSP页面应用page指令只能为contentType指定一个值
2. JSP页面应用page指令可认为import属性指定多个值吗?
答:可认为该属性指定多个值
3. Include指令标识表记标帜和include动作标识表记标帜有何不合?
答:在处理惩罚体式格式和处理惩罚时候上是不合的。Include指令标识表记标帜用嵌入体式格式处理惩罚文件,在编译阶段就处理惩罚所需文件,长处是页面的履行速度快;而include动作标识表记标帜不应用嵌入体式格式来处理惩罚所需文件,在JSP页面运行时才处理惩罚文件,也就是说,当Tomcat办事器把JSP页面转译成Java文件时,不把JSP页面中include动作标识表记标帜所包含的文件与原JSP页面归并一个新的JSP页面,而是告诉Java申明器,这个文件在JSP运行时(Java文件的字节码文件被加载履行)才被处理惩罚,其长处是能更灵活地处理惩罚所需文件(见后面的param标识表记标帜),毛病是履行速度要慢一些。
4. Param动作标识表记标帜经常作为哪些标识表记标帜的子标识表记标帜,有何感化?
答:param动作标识表记标帜可以作为include、forward动作标识表记标帜的子标识表记标帜来应用,该标识表记标帜以“名字-值”对的情势为这些动作标识表记标帜供给附加信息。
5. Tag文件该当存放在如何的目次中?
答:存放到“Web办事目次\WEB-INF\tags”中
6. 用户可以应用浏览器直接接见一个Tag文件吗?
答:用户不克不及经由过程浏览器直接恳求一个Tag文件
7. JSP页面如何调用一个Tag文件?
答:JSP页面可以应用带前缀的Tag标识表记标帜调用响应的Tag文件
8. 编写两个Tag文件Rect.tag和Circle.tag。Rect.tag负责策画矩形的面积,Circle.tag负责策画圆的面积。编写一个JSP页面,该JSP页面应用Tag标识表记标帜调用Rect.tag和Circle.tag。调用Rect.tag时,向其传递矩形的两个边的长度;调用Circle.tag时,向其传递圆的半径。
8.Jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=rect%>
<%@ taglib tagdir=/WEB-INF/tags prefix=circle%>
<HTML><BODY>
<H3>以下是矩形的面积:</H3>
<rect:Rect length=4 width=3/>
<H3>以下是圆的面积:</H3>
<circle:Circle radius=4/>
</BODY></HTML>
Rect.tag
<p>这是一个Tag文件,负责策画矩形的面积。
<%@ attribute name=length required=true %>
<%@ attribute name=width required=true %>
<%! public String getArea(double a,double b){
double area=ab;
return <BR>矩形的面积为:+area;
}
%>
<% out.println(<BR>JSP页面传递过来的两条边:+length+,+width);
double a=Double.parseDouble(length);
double b=Double.parseDouble(width);
out.println(getArea(a,b));
%>
Circle.tag
<p>这是一个Tag文件,负责策画圆的面积。
<%@ attribute name=radius required=true %>
<%! public String getArea(double a){
double area=3.14159265aa;
return <BR>圆的面积为:+area;
}
%>
<% out.println(<BR>JSP页面传递过来的半径:+radius);
double a=Double.parseDouble(radius);
out.println(getArea(a));
%>