1. 程式人生 > >Jsp中標籤使用:tag 檔案方式 和 tld檔案方式

Jsp中標籤使用:tag 檔案方式 和 tld檔案方式

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伺服器目錄下的標記庫

格式如下:

<%@ taglib tagdir=”自定義標記庫的位置” prefix=”字首”%>

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

<%@ taglib tagdir=”/WEB-INF/tags” prefix=”demo”%>

<%@ taglib tagdir=”/WEB-INF/tags/one” prefix=”demo1″%>

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

<demo:AddSum />

<demo1:AddSum />   //通過字首區分兩個不同目錄下的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 屬性1=”屬性值” 屬性2=”屬性值” 屬性3=”屬性值”%>

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

  • body-content
  • language
  • import
  • pageEnconding

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

language: 只能取java

import: 為Tag檔案引入java包

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

include指令

和jsp檔案的include指令類似。

attribute指令

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

<%@ attribute name=”物件的名字” required=”true|false” type=”物件的型別”%>

name屬性:物件的名字

type屬性:物件的型別

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

<%@ attribute name=”length” required=”true” %>

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

<computer:SumCode length=”1000″ />

或者

<computer:SumCode length=”1000″>

向Tag檔案中傳遞的值為1000

<computer:SumCode />

注意:在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指令的格式如下:

<%@ variable name-given=”物件名字” variable-class=”物件的型別” scope=”有效範圍” %>

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指令:

<%@ variable name-given=”time” variable-class=”java.util.Date” scope=”AT_END” %>

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

 

2、使用tld檔案

      tld為XML格式檔案,在其中描述標籤元件的類和屬性等。         方法1的使用比較直接簡單,修改標籤直接修改JSP檔案即可;方法2使用定義方式來描述標籤,修改標籤需要修改tld描述檔案和對應的class檔案。  

自定義標籤開發整理

從jsp1.1開始就可以在jsp頁面中使用自定義標籤了,使用自定義標籤不但可以實現程式碼重用,而且可以使jsp程式碼更簡潔。Jsp2.0的標籤擴充套件API中又增加了SimpleTag介面和其實現類SimpleTagSupport。

標籤擴充套件API層次結構:

  

TLD檔案元素詳解:

每個自定義標籤都必須在TLD檔案中宣告,TLD檔案只不過是一個XML檔案。根元素是<taglib>,它包含一個或者多個<tag>標籤,該元素用來宣告定製標籤。<taglib>元素中只有<tlib-version>元素是必須的,其他都是可選的。

TLD檔案中的元素

標  籤

含  義

<taglib>

TLD檔案的根元素

<tlib-version> 

此標籤庫的版本

<jsp-version>

此標籤庫依賴的JSP版本。

<short-name>

<description>

<display-name>

<icon>

<uri>

<validator>

<listener>

<function>

當在JSP中使用標籤時,此標籤庫首選或者建議的字首。當然可以完全忽略這個建議

描述資訊

圖形工具可顯示的一個簡短名稱

圖形工具可顯示的圖示

指定使用該標籤庫中標籤的URI

關於該庫的TagLibraryValidator資訊

指定事件監聽器類

定義一個在EL中使用的函式

<tag>

定義一個標籤

<tag>元素的子元素

標  籤

含  義

<description>

<display-name>

<icon>

<name>

指定針對標籤的資訊

開發工具用於顯示的一個簡短名稱

可被開發工具使用的圖示

標籤名稱

<tag-class>

<tei-class>

Java標籤處理器類的名稱。注意這是處理器類的全限定名稱,比如com.xx.tag.TableTag

Javax.servlet.jsp.tagext.TagExtraInfo類的一個可選子類

<body-content>

<variable>

<example>

此標籤的主體部分的內容。其值可為scriptless\tagdependent\empty,預設為empty

定義指令碼變數資訊

使用該標籤例子的可選的非正式描述

<attribute>

包含了此標籤的一個屬性的元資料

<attribute>的子元素

標  籤

含  義

<description>

<name>

有關描述的文字資訊

在jsp標籤中使用的屬性名稱

<required>

<rtexprvalue>

<type>

指定屬性是必須的還是可選的,預設為false,表示屬性可選。如果該值為true,則jsp頁面必須為該屬性提供一個值。可能的值true、false、yes、no

指定屬性是否能接受請求時表示式的值,預設為false,表示不能接受請求時表示式的值。可能值:true、false、yes、no

屬性的資料型別,該元素只能用在當<rtexprvalue>設定為true時。它指定當使用請求時屬性表示式(<%= %>)返回型別。預設string

例項(繼承SimpleTagSupport類方式):

編寫一個DateTag標籤,輸出系統時間。<c1:date/>,輸出的格式:2011年11月9日

step1: 寫一個java類,繼承SimpleTagSupport類

step2: override doTag()方法,在該方法裡,實現相應的處理邏輯

複製程式碼
 1 package mytag;
 2 import java.io.IOException;
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import javax.servlet.jsp.JspException;
 6 import javax.servlet.jsp.JspWriter;
 7 import javax.servlet.jsp.PageContext;
 8 import javax.servlet.jsp.tagext.SimpleTagSupport;
 9 
10 public class DateTag extends SimpleTagSupport{
11     @Override
12     public void doTag() throws JspException, IOException {
13         PageContext ctx = (PageContext)getJspContext();
14         JspWriter out = ctx.getOut();
15         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
16         out.println(sdf.format(new Date()));
17     }
18 }
複製程式碼

step3: 在.tld檔案當中,描述該標籤

複製程式碼
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
 5     version="2.0">
 6     <tlib-version>1.1</tlib-version>
 7     <short-name>c1</short-name>
 8     <uri>http://www.tarena.com.cn/mytag1</uri>
 9     <tag>
10         <name>date</name>
11         <tag-class>mytag.DateTag
            
           

相關推薦

Jsp標籤使用tag 檔案方式 tld檔案方式

Tag檔案 Tag檔案和JSP檔案很類似,可以被JSP頁面動態載入呼叫,但是使用者不能通過該Tag檔案所在Web服務目錄直接訪問這個Tag檔案。 Tag檔案的兩點好處: (1)在設計Web應用時,可以通過編寫Tag檔案實現程式碼複用。 (2)可將JSP頁面中的關於資料處

JSPTAG檔案TLD檔案小結

在jsp檔案中,可以引用tag和tld檔案。 1.對於tag檔案 <%@ taglib prefix="ui" tagdir="/WEB-INF/tags" %> 其中的tags是個目錄,裡面有若干tag檔案。 但使用<ti:XXXX>時,目錄WEB-

Nginx-第四篇在實踐對日誌格式詳解日誌檔案按日期進行分割

從上面我們可以看出幾部分資訊: 01.【$remote_addr】客戶端(使用者)IP地址。如:上例中的 201.0.69.2 02.【$remote_user】 記錄客戶端使用者名稱稱 03.【[$time_local]】訪問時間。如:上例中的 [26/Jul/2018:03:17:20

JSPrequest.getScheme()+"://"+request.getServerName()+":"+request.getServer

eight 其中 相對 刪除 har post string 語句 ges String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.ge

JSP九大內置對象四大作用域

parameter 文字 其他 fig ons this 單獨 內置 odin 一共有九大內置對象: request、response、out、session、application、pageContext、page、config、exception 內置對象(又叫隱含對象

6_python類方法使用修飾符@staticmethod@classmethod的作用與區別,還有裝飾器@property的使用(20181205)

python類方法中使用:修飾符@staticmethod和@classmethod的作用與區別,還有裝飾器@property的使用 1 @staticmethod(靜態方法)和@classmethod(類方法)使用 1 @staticmethod和@c

JQuery使用FormData非同步提交資料提交檔案

web中資料提交事件是常常發生的,但是大多數情況下我們不希望使用html中的form表單提交,因為form表單提交會中斷當前瀏覽器的操作並且會調到另一個地址(即使這個地址是當前頁面),並且會重複載入一些html浪費頻寬,我們希望達到一個無重新整理的、非同步的提交效果來給使用

Maven指定Java的編譯版本原始檔編碼方式

Maven預設編譯版本是JDK1.5,在很多時候,發現有些程式碼報錯,又找不到原因,很有可能是沒有配置JDK版本。就如有一次我遇到的問題:定義全域性異常處理類繼承HandlerInterceptorAdapter時候,preHandle方法上面有@Overrid

jQuery選擇器探究TAG選擇器CLASS選擇器

(jquery1.6.1版本)假設有一個html文件中存在多個<h1>標籤元素,那麼當我們敲入$("h1")後在jQuery內部將會執行怎樣的邏輯呢? 分析jQuery建構函式我們同樣定位到find( selector )方法,這個方法是jQuery的例項方法,

Java 小例子通過 Socket 傳送接收檔案

這是一個簡單的包含傳送端和接收端的例子。傳送端向接收端傳送檔名和檔案內容,接收端將收到的檔案儲存在磁碟上。接收端可以同時接收多個傳送端傳來的檔案,但沒有處理檔案同名的情況。 這個例子中設計了一個簡單的協議。傳送的內容是這樣的: 檔名長度(4位元組)—檔名—檔案內容長度(4位

Spark Streaming的Receiver方式直連方式

Spark Streaming從Kafka中接受資料的時候有兩種方式,一種是使用Receiver的老方法,另一種是使用直連的方法 1.Receiver方式 Receiver是使用Kafka高階消費者API實現的,與所有接收器一樣,從Kafka通過Receiver接收的資料

如何在命令列使用 ftp 命令上傳下載檔案

本文中,介紹在 Linux shell 中如何使用 ftp 命令。包括如何連線 FTP 伺服器,上傳或下載檔案以及建立資料夾。儘管現在有許多不錯的 FTP 桌面應用,但是在伺服器、SSH、遠端會話中命令列 ftp 命令還是有很多應用的。比如。需要伺服器從 ftp 倉庫拉取

VS2013為C++程式生成libdll檔案

dll的優點 程式碼複用是提高軟體開發效率的重要途徑。只要某部分程式碼具有通用性,就可將它構造成相對獨立的功能模組並在之後的專案中重複使用。比較常見的例子是各種應用程式框架,ATL、MFC等,它們都

遊戲場景需要是可配置的AssetManager工具類xml檔案讀取

我們已經知道,遊戲得有個活動場景(每個場景是個可點選的button控制元件),並且可以通過程式碼生成控制元件的方式把活動場景進行多行多列的排列。見上篇:https://www.cnblogs.com/zzqm-gamelife/p/10254466.html 但是沒有解決這樣的問題: 1.場景名稱需要自定

Spring註解方式配置檔案方式的混用

1.註解方式和配置檔案方式的混用:     1.配置檔案方式 : 用於配置物件的建立          <beans>             <!--開啟掃描-->             <context:component-scan bas

Git版本控制Git查閱、撤銷檔案修改撤銷檔案追蹤

檢視檔案的修改歷史git log --pretty=oneline 檔名 # 顯示修改歷史[Git高階教程:git log與git reflog]git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e # 檢視更改歷史版本檢視和對比

Hibernate學習筆記(一)之——根據配置檔案自動建立表的兩種方式(註解方式配置檔案方式

環境準備:jdk  eclipse   hibernate、mysql jar包 專案截圖: Student是根據配置檔案建立表,Teacher是根據註解建立表 Student.java package com.java1234.model; publi

jsp標籤的作用

利用<pre></pre>這個標籤可以將其包起來的文字排版、格式,原封不動的呈現出來。算是相當好用的標籤之一。也就是說你輸入的東西被原封不動的輸出,包括你輸入的空格之類的,不用 和<BR>等來表示空格或者回車了    為了顯示後臺的格式樣

php佇列方式遞迴方式遍歷目錄檔案及子目錄

如果目錄很多,推薦佇列方式,遞迴方式會慢,慢的原因:遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做地址儲存,引數傳遞等 <?php   //遞迴方式 function read_dir($dir){       $fil

JSP的聲明語句塊表達式塊

建議 import lse cto exp contex ssis express private 一、JSP中的聲明語句塊  在JSP頁面中使用<%!%>括起來的部分,稱為聲明語句塊。聲明語句塊中的內容,將被JSP引擎翻譯到Servlet的類體中,是不會被包含