天天看點

java tag_Java學習筆記:Tag檔案和Tag标記

Tag檔案

Tag檔案和JSP檔案很類似,可以被JSP頁面動态加載調用,但是使用者不能通過該Tag檔案所在Web服務目錄直接通路這個Tag檔案。

Tag檔案的兩點好處:

(1)在設計Web應用時,可以通過編寫Tag檔案實作代碼複用。

(2)可将JSP頁面中的關于資料處理的代碼放在一個Tag檔案中,讓JSP頁面隻負責顯示資料,即通過使用Tag檔案将資料的處理和顯示相分離,有利于Web應用的維護。

Tag檔案目錄:

為了能使JSP頁面使用某一個Tag檔案,必須将這個Tag檔案存放到Tomcat伺服器的“指定目錄“ (web服務目錄\WEB-INF\Tags)

例如:C:\Tomcat 8.0\webapps\ROOT\WEB-INF\tags

編寫Tag檔案(AddSum.tag):

這是一個tag檔案,負責計算1~100的偶數之和

<%

int sum=0;i=1;

for(int i;i<=100;i++)

{

if(i%2==0)

sum+=i;

}

out.println(sum);

%>

Tag标記

我們是通過JSP頁面中的Tag标記來調用Tag檔案。

(1)使用taglib指令标記引入該web伺服器目錄下的标記庫

格式如下:

(2)一個jsp頁面可以是用多個taglib指令引入多個标記庫.

引入标記庫後,jsp頁面就可以使用帶字首的Tag标記調用相應的Tag檔案了。

//通過字首區分兩個不同目錄下的tag檔案

JSP處理Tag檔案的原理如下:

(1)如果該Tag标記對應的Tag檔案是首次被JSP頁面調用,那麼JSP引擎将Tag檔案轉譯成一個Java檔案,并編譯這個java檔案生成位元組碼檔案,然後執行這個位元組碼檔案來實作Tag檔案的動态處理。(原理和jsp頁面一樣。。。。)

以下是jsp調用tag檔案:(example.jsp)

<%@ page contentType="text/html; chatset=utf-8" %>

<%@ taglib tagdir="/WEB-INF/tags" prefix="1"%>

<h3>調用Tag檔案的效果:</h3>

<1:AddSum />

Tag檔案中常用指令

tag指令

Tag檔案通過使用tag指令可以指定某些屬性的值,以便從總體上影響Tag檔案的處理和表示。

tag指令可以操作的屬性有:

body-content

language

import

pageEnconding

body-content屬性: 決定Tag标記是否可以有标記體,如果允許有标記體,該屬性會給出标記體内容的類型。

language: 隻能取java

import: 為Tag檔案引入java包

pageEncoding: 該屬性指定Tag檔案的字元編碼

include指令

和jsp檔案的include指令類似。

attribute指令

Tag檔案通過使用attribute指令,可以讓使用它的jsp頁面向該Tag傳遞需要的資料。

name屬性:對象的名字

type屬性:對象的類型

例如tag檔案,SumCode.tag 中有如下attribute指令:

那麼,jsp頁面就可以使用如下Tag标記(假設字首為computer)調用SumCode.tag

或者

向Tag檔案中傳遞的值為1000

注意:在Tag檔案中不可再定義和attribute指令中的name屬性指定的對象具有相同名字的變量,否則将隐藏attribute指令中的對象,使其失效。

練習

在例3-3中,Triangle.tag存放在\WEB-INF\tags目錄下,該Tag檔案負責計算,顯示三角形的面積,example3_3.jsp 使用Tag标記調用Triangle.tag檔案,并向Triangle.tag傳遞三角形三邊的長度。

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"+"不能構成三角形,無法計算面積.";

}

%>

<%

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));

%>

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>以下是調用Tag檔案的結果:</H3>

<computer:Triangle sideA="5" sideB="6" sideC="7" />

</body>

</html>

variable指令

在jsp的設計中,我們不僅希望能向Tag檔案中傳遞資料,而且還希望Tag檔案能傳回某些資料給JSP頁面,這時variable指令就可以很好的解決此問題。

Tag檔案通過使用variable指令可以将Tag檔案中的對象傳回給調用該Tag檔案的JSP頁面。

1.variable指令的格式如下:

name-given屬性:用來指定對象的名字

variable-class屬性:用來指定對象的類型(例如可以是java.lang.String,java.lang.Integer….)

scope屬性:用來指定對象的有效範圍(scope值可以取AT_BEGIN,NESTED,AT_END)

2.對象的傳回

Tag檔案為了給JSP頁面傳回一個對象,就必須将對象的名字以及該對象的引用存儲到TomCat引擎提供的内置對象jspContext中,這樣,jsp頁面才能使用該對象。

jspContext調用

setAttribute(“對象的名字”,對象的引用);

方法存儲對象的名字以及對象的引用。例如:

jspContext.setAttribute(“time”,new Date());

将名字是time的Date對象存儲到jspContext中。

以下是variable指令:

為jsp頁面傳回名字為time的Date對象。

編寫一個Tag檔案GetWord.tag,負責分解出字元串中的全部單詞,并将分解出的全部單詞傳回給調用該Tag檔案的jsp頁面,編寫一個jsp頁面giveString.jsp,頁面負責向Tag檔案傳遞一個由英文單詞構成的字元串。并負責顯示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)"; %>

字元串:

<%=s %>

中全部單詞

<%

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對象傳回給jsp頁面 %>