Jsp中标签使用:tag 文件方式 和 tld文件方式
2017-03-24 00:01
471 查看
JSP标签有两种实现方法,一种是使用tag 文件,一种是使用tld文件。
tag文件相当于公共的jsp页面,作用一般是一段小代码,类似include文件的作用。
tld文件相当于xml配置文件,需对应的java后台实现类,作用比较复杂,可以实现很多高级的作用。
标签名和tag文件名一致, tag文件为JSP文件,可以有属性,把JSP页面当JavaBean文件一样使用。
例子:
1)WEB-INF/lib下放置TAG文件:MyTag.tag,那么就有了一个名为MyTag的标签:
?
可定义属性attribute,有变量名(name),是否必需(required)等属性,相当于定义一个JavaBean的属性。在使用属性的值时,可通过get方法来访问或通过变量名的方式来访问。
2)创建引用标签的JSP文件test.jsp,放置于Web目录下,如何WEB-INF同级目录
?
在定义好属性后,就可在TAG被引用时,接受传入参数。标签TAG的属性id,webletID。
3)访问test.jsp,效果如下:
JSP TAG ATTRIBUTE GET
Here, got the attribute value by get method:W1001
Got the attribute value by variable:W1001
============================================
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的偶数之和
我们是通过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)
Tag文件通过使用tag指令可以指定某些属性的值,以便从总体上影响Tag文件的处理和表示。
<%@ tag 属性1=”属性值” 属性2=”属性值” 属性3=”属性值”%>
tag指令可以操作的属性有:
body-content
language
import
pageEnconding
body-content属性: 决定Tag标记是否可以有标记体,如果允许有标记体,该属性会给出标记体内容的类型。
language: 只能取java
import: 为Tag文件引入java包
pageEncoding: 该属性指定Tag文件的字符编码
和jsp文件的include指令类似。
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传递三角形三边的长度。
<%!
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"+"不能构成三角形,无法计算面积.";
}
%>
在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文件返回的全部单词。
<% String s="South Africa World Cup(Espana is champion)"; %>
字符串:
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文件中的元素
<tag>元素的子元素
<attribute>的子元素
实例(继承SimpleTagSupport类方式):
编写一个DateTag标签,输出系统时间。<c1:date/>,输出的格式:2011年11月9日
step1: 写一个java类,继承SimpleTagSupport类
step2: override doTag()方法,在该方法里,实现相应的处理逻辑
step3: 在.tld文件当中,描述该标签
step4: 使用taglib导入标签(jsp中)
参考:
JSP中的TAG文件和TLD文件小结
在jsp文件中,可以引用tag和tld文件。
1.对于tag文件
<%@ taglib prefix="ti" tagdir="/WEB-INF/tags" %>
其中的tags是个目录,里面有若干tag文件。
但使用<ti:XXXX>时,目录WEB-INF/tags下,必然有个XXXX.tag文件与之对应。
2.对于tld文件
在jsp中可以引用TLD文件,如
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
但是这个http://struts.apache.org/tags-html对应着什么呢?
jsp会在当前目录的\WEB-INF下找所有tld文件,确认这个URL对应哪个TLD文件。
当找到struts-html.tld文件时,发现其中的内与这个URL对应。
但使用<html:YYYYY>时,这个TLD文件中必然有个YYYY项与之对应。
还有一种更保险的方法是,在WEB-INF/web.xml中加上
<taglib>
<taglib-uri> http://jakarta.apache.org/tomcat/examples-taglib </taglib-uri>
<taglib-location>
/WEB-INF/jsp/example-taglib.tld
</taglib-location>
</taglib>
这样表示http://jakarta.apache.org/tomcat/examples-taglib对应着/WEB-INF/jsp/example-taglib.tld
tag文件相当于公共的jsp页面,作用一般是一段小代码,类似include文件的作用。
tld文件相当于xml配置文件,需对应的java后台实现类,作用比较复杂,可以实现很多高级的作用。
1、使用tag文件
标签名和tag文件名一致, tag文件为JSP文件,可以有属性,把JSP页面当JavaBean文件一样使用。
例子:
1)WEB-INF/lib下放置TAG文件:MyTag.tag,那么就有了一个名为MyTag的标签:
?
可定义属性attribute,有变量名(name),是否必需(required)等属性,相当于定义一个JavaBean的属性。在使用属性的值时,可通过get方法来访问或通过变量名的方式来访问。
2)创建引用标签的JSP文件test.jsp,放置于Web目录下,如何WEB-INF同级目录
?
在定义好属性后,就可在TAG被引用时,接受传入参数。标签TAG的属性id,webletID。
3)访问test.jsp,效果如下:
JSP TAG ATTRIBUTE GET
Here, got the attribute value by get method:W1001
Got the attribute value by variable:W1001
============================================
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> | 定义一个标签 |
标 签 | 含 义 |
<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> | 包含了此标签的一个属性的元数据 |
标 签 | 含 义 |
<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</tag-class> 12 <body-content>empty</body-content> 13 </tag> 14 </taglib>
step4: 使用taglib导入标签(jsp中)
1 <%@taglib prefix="c1" uri="http://www.tarena.com.cn/mytag1" %> 2 <c1:date/>
参考:
JSP中的TAG文件和TLD文件小结
在jsp文件中,可以引用tag和tld文件。
1.对于tag文件
<%@ taglib prefix="ti" tagdir="/WEB-INF/tags" %>
其中的tags是个目录,里面有若干tag文件。
但使用<ti:XXXX>时,目录WEB-INF/tags下,必然有个XXXX.tag文件与之对应。
2.对于tld文件
在jsp中可以引用TLD文件,如
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
但是这个http://struts.apache.org/tags-html对应着什么呢?
jsp会在当前目录的\WEB-INF下找所有tld文件,确认这个URL对应哪个TLD文件。
当找到struts-html.tld文件时,发现其中的内与这个URL对应。
但使用<html:YYYYY>时,这个TLD文件中必然有个YYYY项与之对应。
还有一种更保险的方法是,在WEB-INF/web.xml中加上
<taglib>
<taglib-uri> http://jakarta.apache.org/tomcat/examples-taglib </taglib-uri>
<taglib-location>
/WEB-INF/jsp/example-taglib.tld
</taglib-location>
</taglib>
这样表示http://jakarta.apache.org/tomcat/examples-taglib对应着/WEB-INF/jsp/example-taglib.tld
相关文章推荐
- jsp使用jstl、el标签时出现According to TLD or attribute directive in tag file, attribute items does not acc错误
- JSP EL标签不能和struts tag 一起使用,只能和JSTL一起使用了。
- 【Jsp标签库】.tld文件配置
- JSP自建标签_1_TLD文件描述
- jsp中引用的tag和tld文件
- jsp中tag文件使用
- vi/vim: 使用标签(tag)文件
- JSP自定义标签开发+TLD文件元素详解+实例
- Java_JSP2_标签文件Tag File支持;
- JSP自定义标签开发+TLD文件元素详解
- JSP-tag文件使用介绍
- 使用jstl标签报错:According to TLD or attribute directive in tag file, attribute value
- jsp自定义标签的使用以及tld文件配置总结
- 使用jsp调用tag文件时浏览器运行结果不识别中文怎么办?
- jsp自定标签tld文件
- jsp tag file中使用c:when 标签无法正确判断的问题
- [教程]自定义JSP中的Taglib标签之五自定义标签之SimpleTagSupport使用
- struts2 标签文件struts-tags.tld使用设置
- JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用
- jsp 自定义标签- *.tld 文件的创建方法之一