学习编写标记文件(tag):
自定义标记的用途就是给程序员可以自定一些特定功能的标记, 以及封装代码, 达到分工, 重用性等
多种好处.
JSP规范2.0中新增了标记文件(tag file)的使用, 免除以前自定义标记必须为一个Java类, 以及必须
加上一个标记描述文件(tld)的编码难度.
以下我们来看标签文件的使用.
1. 存放:
一个标记文件以tag为後缀名, 以同一类型的检签放到同一个文件夹中组成一个标记库, 再放到
"/WEB-INF/tags/"中保存.
例如接下来我打算建立一组有关数学的标记库, 我在"/WEB-INF/tags/"下建立一个"maths"文件夹, 然
後就可以在"/WEB-INF/tags/maths/"下建立後缀名为tag的标记文件了.
现在我想先做一个数字相加的标记, 起名为"add.tag", 放到maths标记库下.
2. 语法:
标记文件其实就是一个jsp文件, 所以语法基本上跟jsp是一样的, 在第一行加上以下这个元素来告诉
服务器它是一个标记文件:
<%@ tag %>
我们还要加上一些属性来告诉服务器这个标记文件的设定:
1) body-content - 设定这个标记的主体内容类型:
A. empty
这个是一个空标记.
B. scriptless
主体可以有内容, 而jsp容器会去处理里面的jsp元素, 换句话就是可以是
文本, EL表达式, 标准动作甚至另一个自定义标记.
C. tagdependent
html学多久
主体可以有内容, 而jsp容器会把它们当作纯文件处理.
2) pageEncoding - 设定这个标记的编码
我们的add标记是个空标记, 而编码是"UTF-8", 所以加上这样的一句:
<%@ tag body-content="empty" pageEncoding="UTF-8" %>
标记中使用以下这个元素来声明属性:
<%@ attribute %>
attribute元素也有几个属性:
1) name - 这个attribute的名称.
2) required - true/false, 是否必须的.
3) rtexprvalue - true/false, 这个attribute可否使用EL表达式, 否则为纯文本.
4) type - 设定这个attribute的类型, jsp容器会把结果自动转换成这个类.
我们的add.tag有两个属性, 分别代表两个要相加的数字, x跟y, 它们都是必须的, 可以用EL 表达式:
<%@ attribute name="x" required="true" rtexprvalue="true" %>
<%@ attribute name="y" required="true" rtexprvalue="true" %>
那这个标记都设定好了, 那我们应该怎样读取这些传入的属性呢? 其实很简单, 标记文件就是一个
jsp文件, 这些输入的属性值都存放在作用域中, 所以利用EL表达式就可以了:
${x + y}
这个标记文件就完成了, 以下为完整代码, 你也可以直接打开"/WEB-INF/tags/maths/add.tag":
<%--
maths标记库add标记
功能: 把传入参数相加
参数:
x, 数字1, 必须
y, 数字2, 必须
--%>
<%@ tag body-content="empty" pageEncoding="UTF-8" %>
<%-- 声明属性--%>
<%@ attribute name="x" required="true" rtexprvalue="true" %>
<%@ attribute name="y" required="true" rtexprvalue="true" %>
<%-- 内容--%>
${x + y}
标记文件完成了, 那我们要怎样在jsp文件中调用它呢? 首先我们导入maths标记库, 跟调用标准动作
一样使用taglib指令, 但是把url属性换成tagdir, 指定我们自定义标记库的位置, 并给它一个前缀
名, 以下我们用"maths":
<%@ taglib tagdir="/WEB-INF/tags/maths/" prefix="maths" %>
然後我们就可以调用标准动作一样去使用它啦, 当然必须的属性一定要有, 不然会报错:
<maths:add x="10" y="10"/>
以下为调用add标记的jsp页的完整代码, 同样的你可以直接打开"/add.jsp":
<%-- maths标记库add标记的演试--%>
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 调用自定义标记库maths --%>
<%@ taglib tagdir="/WEB-INF/tags/maths" prefix="maths" %>
<html>
<head>
<title>Maths标记库add标记演试</title>
</head>
<body>
结果:<br/>
<%-- 使用add标记--%>
<maths:add x="10" y="10"/>
</body>
</html>
相信大家都了解基本工作原理了吧? 你可以把标记文件看作一个jsp页面, 你可以对它传入一些参数,
调用它的面页就像包含它一样, 所以你可以标记文件打上一句"HelloWorld", 一段html代码, 甚至包
含其他的动作, 调用它的面页就会显示, 大家可以打开"/helloworld.jsp"看一下, 它调用了别
一个
标记库others里面的helloworld标记.
add标记是一个空标记, 我们学过body-content="scriptless", 那我们应该怎样去处理标记主体的数
据呢? 我们来新增一个新的标记库, 叫string, 再增加一个标记文件"show.tag", 同样的加上tab指
令告诉服务器这个是一个标记文件, 这一次body-content属性改为scriptless:
<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>
然後我们加入一个标准动作:
<jsp:doBody>
它的用途是读入标记的主体内容, 当没有指定要保存到的变量时, 它把内容直接输出到调用的页面上.
我们写一个"/show.jsp"来简单调用这个show标记:
<%-- string标记库show标记的演试--%>
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%-- 调用自定义标记库string --%>
<%@ taglib tagdir="/WEB-INF/tags/string" prefix="string" %>
<html>
<head>
<title>string标记库trim标记演试</title>
</head>
<body>
<%-- 使用show标记--%>
<string:show>
这个是标记的主体内容
</string:show>
</body>
</html>
<jsp:doBody>有三个属性:
1) var - 当指定这个变量, 读取的主体内容就会以String保存这个变量内, 不会直接输出页面.
2) varReader - 用途跟var一样, 但是保存的不是一个String, 而是一个java.io.Reader.
3) scope - 变量保存到的作用域, 包括: page, request, session, application, 默认为
page.
接下来我们扩充string标记库, 加入一个新的标记"trim.tag", 同样的加入tag指令, 设定body-content为scriptless代表它可以有主体内容, 因为我们会使用到核心标记库, 所以加上taglib
指令导入核心标记库, 并加入jsp:doBody指令读取主体内容并保存到变量body中:
<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>
<%-- 导入核心标记库--%>
<%@ taglib uri="java.sun/jsp/jstl/core" prefix="c" %>
<%-- 把主体内容保存到body变量中, 没有指定作用域下, 保存在page --%>
<jsp:doBody var="body"/>
我们获得一个主体内容的字符串了, 那可以编写一段代码来把字符串中的空白去掉, 我们可以利用核
心标记库的一个标记forTokens来把字符串跟据空白来分割, 再输出就可以达到这个效果了, 以下给出
这个标记的完整代码, 大家也可以直接打开"/WEB-INF/tags/string/trim.tag":
<%--
string标记库trim标记
功能: 把标记主体的内文中的空白去掉
--%>
<%@ tag body-content="scriptless" pageEncoding="UTF-8" %>
<%-- 导入核心标记库--%>
<%@ taglib uri="java.sun/jsp/jstl/core" prefix="c" %>
<%-- 把主体内容保存到body变量中, 没有指定作用域下, 保存在page --%>
<jsp:doBody var="body"/>
<%-- 实现把主体字符串的空白去掉--%>
<c:forTokens var="char" items="${body}" delims=" ">${char}</c:forTokens>
这里有一个要注意的, 最後一行必须要这样写, 什么意思? 很多人(包括我)可能会这样写:
<c:forTokens var="char" items="${body}" delims=" ">
${char}
</c:forTokens>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。