Tag文件
Tag文件和JSP文件很類似,可以被JSP頁(yè)面動(dòng)態(tài)加載調(diào)用,但是用戶不能通過(guò)該Tag文件所在Web服務(wù)目錄直接訪問(wèn)這個(gè)Tag文件。
Tag文件的兩點(diǎn)好處:
(1)在設(shè)計(jì)Web應(yīng)用時(shí),可以通過(guò)編寫Tag文件實(shí)現(xiàn)代碼復(fù)用。
(2)可將JSP頁(yè)面中的關(guān)于數(shù)據(jù)處理的代碼放在一個(gè)Tag文件中,讓JSP頁(yè)面只負(fù)責(zé)顯示數(shù)據(jù),即通過(guò)使用Tag文件將數(shù)據(jù)的處理和顯示相分離,有利于Web應(yīng)用的維護(hù)。
Tag文件目錄:
為了能使JSP頁(yè)面使用某一個(gè)Tag文件,必須將這個(gè)Tag文件存放到Tomcat服務(wù)器的“指定目錄“ (web服務(wù)目錄\WEB-INF\Tags)
例如:C:\Tomcat 8.0\webapps\ROOT\WEB-INF\tags
編寫Tag文件(AddSum.tag):
這是一個(gè)tag文件,負(fù)責(zé)計(jì)算1~100的偶數(shù)之和
<%
int sum=0;i=1;
for(int i;i<=100;i++)
{
if(i%2==0)
sum+=i;
}
out.println(sum);
%>
Tag標(biāo)記
我們是通過(guò)JSP頁(yè)面中的Tag標(biāo)記來(lái)調(diào)用Tag文件。
(1)使用taglib指令標(biāo)記引入該web服務(wù)器目錄下的標(biāo)記庫(kù)
格式如下:
<%@ taglib tagdir=”自定義標(biāo)記庫(kù)的位置” prefix=”前綴”%>
(2)一個(gè)jsp頁(yè)面可以是用多個(gè)taglib指令引入多個(gè)標(biāo)記庫(kù).
<%@ taglib tagdir=”/WEB-INF/tags” prefix=”demo”%>
<%@ taglib tagdir=”/WEB-INF/tags/one” prefix=”demo1″%>
引入標(biāo)記庫(kù)后,jsp頁(yè)面就可以使用帶前綴的Tag標(biāo)記調(diào)用相應(yīng)的Tag文件了。
<demo:AddSum />
<demo1:AddSum /> //通過(guò)前綴區(qū)分兩個(gè)不同目錄下的tag文件
JSP處理Tag文件的原理如下:
(1)如果該Tag標(biāo)記對(duì)應(yīng)的Tag文件是首次被JSP頁(yè)面調(diào)用,那么JSP引擎將Tag文件轉(zhuǎn)譯成一個(gè)Java文件,并編譯這個(gè)java文件生成字節(jié)碼文件,然后執(zhí)行這個(gè)字節(jié)碼文件來(lái)實(shí)現(xiàn)Tag文件的動(dòng)態(tài)處理。(原理和jsp頁(yè)面一樣。。。。)
以下是jsp調(diào)用tag文件:(example.jsp)
<%@ page contentType="text/html; chatset=utf-8" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="1"%>
<h3>調(diào)用Tag文件的效果:</h3>
<1:AddSum />
Tag文件中常用指令
tag指令
Tag文件通過(guò)使用tag指令可以指定某些屬性的值,以便從總體上影響Tag文件的處理和表示。
<%@ tag 屬性1=”屬性值” 屬性2=”屬性值” 屬性3=”屬性值”%>
tag指令可以操作的屬性有:
body-content
language
import
pageEnconding
body-content屬性: 決定Tag標(biāo)記是否可以有標(biāo)記體,如果允許有標(biāo)記體,該屬性會(huì)給出標(biāo)記體內(nèi)容的類型。
language: 只能取java
import: 為Tag文件引入java包
pageEncoding: 該屬性指定Tag文件的字符編碼
include指令
和jsp文件的include指令類似。
attribute指令
Tag文件通過(guò)使用attribute指令,可以讓使用它的jsp頁(yè)面向該Tag傳遞需要的數(shù)據(jù)。
<%@ attribute name=”對(duì)象的名字” required=”true|false” type=”對(duì)象的類型”%>
name屬性:對(duì)象的名字
type屬性:對(duì)象的類型
例如tag文件,SumCode.tag 中有如下attribute指令:
<%@ attribute name=”length” required=”true” %>
那么,jsp頁(yè)面就可以使用如下Tag標(biāo)記(假設(shè)前綴為computer)調(diào)用SumCode.tag
<computer:SumCode length=”1000″ />
或者
<computer:SumCode length=”1000″>
向Tag文件中傳遞的值為1000
<computer:SumCode />
注意:在Tag文件中不可再定義和attribute指令中的name屬性指定的對(duì)象具有相同名字的變量,否則將隱藏attribute指令中的對(duì)象,使其失效。
練習(xí)
在例3-3中,Triangle.tag存放在\WEB-INF\tags目錄下,該Tag文件負(fù)責(zé)計(jì)算,顯示三角形的面積,example3_3.jsp 使用Tag標(biāo)記調(diào)用Triangle.tag文件,并向Triangle.tag傳遞三角形三邊的長(zhǎng)度。
Triangle.tag
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ 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"+"不能構(gòu)成三角形,無(wú)法計(jì)算面積.";
}
%>
<%
out.println("<BR>JSP頁(yè)面?zhèn)鬟f過(guò)來(lái)的三條邊:"+sideA+","+sideB+","+sideC);
double a=Double.parseDouble(sideA);
double b=Double.parseDouble(sideB);
double c=Double.parseDouble(sideC);
out.println(getArea(a,b,c));
%>
example3_3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="computer" %>
</head>
<body>
<H3>以下是調(diào)用Tag文件的結(jié)果:</H3>
<computer:Triangle sideA="5" sideB="6" sideC="7" />
</body>
</html>
variable指令
在jsp的設(shè)計(jì)中,我們不僅希望能向Tag文件中傳遞數(shù)據(jù),而且還希望Tag文件能返回某些數(shù)據(jù)給JSP頁(yè)面,這時(shí)variable指令就可以很好的解決此問(wèn)題。
Tag文件通過(guò)使用variable指令可以將Tag文件中的對(duì)象返回給調(diào)用該Tag文件的JSP頁(yè)面。
1.variable指令的格式如下:
<%@ variable name-given=”對(duì)象名字” variable-class=”對(duì)象的類型” scope=”有效范圍” %>
name-given屬性:用來(lái)指定對(duì)象的名字
variable-class屬性:用來(lái)指定對(duì)象的類型(例如可以是java.lang.String,java.lang.Integer….)
scope屬性:用來(lái)指定對(duì)象的有效范圍(scope值可以取AT_BEGIN,NESTED,AT_END)
2.對(duì)象的返回
Tag文件為了給JSP頁(yè)面返回一個(gè)對(duì)象,就必須將對(duì)象的名字以及該對(duì)象的引用存儲(chǔ)到TomCat引擎提供的內(nèi)置對(duì)象jspContext中,這樣,jsp頁(yè)面才能使用該對(duì)象。
jspContext調(diào)用
setAttribute(“對(duì)象的名字”,對(duì)象的引用);
方法存儲(chǔ)對(duì)象的名字以及對(duì)象的引用。例如:
jspContext.setAttribute(“time”,new Date());
將名字是time的Date對(duì)象存儲(chǔ)到j(luò)spContext中。
以下是variable指令:
<%@ variable name-given=”time” variable-class=”java.util.Date” scope=”AT_END” %>
為jsp頁(yè)面返回名字為time的Date對(duì)象。
編寫一個(gè)Tag文件GetWord.tag,負(fù)責(zé)分解出字符串中的全部單詞,并將分解出的全部單詞返回給調(diào)用該Tag文件的jsp頁(yè)面,編寫一個(gè)jsp頁(yè)面giveString.jsp,頁(yè)面負(fù)責(zé)向Tag文件傳遞一個(gè)由英文單詞構(gòu)成的字符串。并負(fù)責(zé)顯示Tag文件返回的全部單詞。
giveString.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="words" %>
<% String s="South Africa World Cup(Espana is champion)"; %>
字符串:
<h3><%=s %></h3>
中全部單詞
<%
for(int i=0;i<wordList.size();i++)
out.print("
"+wordList.get(i));
%>
GetWord.tag
<%@tag import="java.util.ArrayList"%>
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ attribute name="str" required="true" %>
<%@ variable name-given="wordList" variable-class="java.util.ArrayList" scope="AT_END" %>
<%
ArrayList list=new ArrayList();
String regex="[\\s\\d\\p{Punct}]+";
String []words=str.split(regex);
for(int i=0;i<words.length;i++){ list.add(words[i]); } jspContext.setAttribute("wordlist",list); //將list對(duì)象返回給jsp頁(yè)面 %>