Java學(xué)習(xí)筆記:Tag文件和Tag標(biāo)記

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)

&lt;%@ page contentType="text/html; chatset=utf-8" %&gt;
&lt;%@ taglib tagdir="/WEB-INF/tags" prefix="1"%&gt;

&lt;h3&gt;調(diào)用Tag文件的效果:&lt;/h3&gt;
&lt;1:AddSum /&gt;

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

&lt;%@ tag language="java" pageEncoding="UTF-8"%&gt;
&lt;%@ attribute name="sideA" required="true" %&gt;
&lt;%@ attribute name="sideB" required="true" %&gt;
&lt;%@ attribute name="sideC" required="true" %&gt;

&lt;%!
public String getArea(double a,double b,double c){
if(a+b &gt;c &amp;&amp; a+c&gt;b &amp;&amp; c+b&gt;a)
{
double p=(a+b+c)/2.0;
double area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
return "&lt;BR&gt;三角形的面積:"+area;
}
else
return "&lt;BR&gt;"+a+","+b+","+"c"+"不能構(gòu)成三角形,無(wú)法計(jì)算面積.";
}
%&gt;

&lt;%
out.println("&lt;BR&gt;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));
%&gt;

example3_3.jsp

&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%&gt;
&lt;%@ taglib tagdir="/WEB-INF/tags" prefix="computer" %&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;H3&gt;以下是調(diào)用Tag文件的結(jié)果:&lt;/H3&gt;
&lt;computer:Triangle sideA="5" sideB="6" sideC="7" /&gt;

&lt;/body&gt;
&lt;/html&gt;

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

&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;%@ taglib tagdir="/WEB-INF/tags" prefix="words" %&gt;

&lt;% String s="South Africa World Cup(Espana is champion)"; %&gt;

字符串:
<h3>&lt;%=s %&gt;</h3>
中全部單詞
&lt;%
for(int i=0;i&lt;wordList.size();i++)
out.print("
"+wordList.get(i));
%&gt;
 

GetWord.tag

&lt;%@tag import="java.util.ArrayList"%&gt;
&lt;%@ tag language="java" pageEncoding="UTF-8"%&gt;
&lt;%@ attribute name="str" required="true" %&gt;
&lt;%@ variable name-given="wordList" variable-class="java.util.ArrayList" scope="AT_END" %&gt;
&lt;%
ArrayList list=new ArrayList();
String regex="[\\s\\d\\p{Punct}]+";
String []words=str.split(regex);
for(int i=0;i&lt;words.length;i++){ list.add(words[i]); } jspContext.setAttribute("wordlist",list); //將list對(duì)象返回給jsp頁(yè)面 %&gt;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容