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頁面 %>