目录
3.1 Tag文件
3.1.1 Tag文件的结构
Tag文件是拓展名为.tag的文本文件,结构和JSP文件类似。其中可以有普通的HTML标记符、某些特殊指令标记、成员变量和方法的定义、Java程序片和Java表达式。
3.1.2 Tag文件的保存
1、Tag文件所在目录
为了能让web应用中的JSP页面使用某一个Tag文件,需要把该Tag文件保存到Tomcat服务器指定的目录中:
Web服务目录\WEB-INF\tags
2、Tag文件的编码
保存Tag文件时按照Tag文件指定编码保存,例如:
<%@ tag pageEncoding="utf-8"%>
指定为UTF-8,因此需要在保存时将“保存类型“选择为”所有文件(*.*)“,将”编码(E)"选择为“UTF-8”.
3.2 Tag标记
3.2.1.Tag标记与Tag文件
JSP页面必须通过Tag标记来调用一个Tag文件。Tag标记的名字和Tag文件的名字一致,也就是说,编写完一个Tag文件并保存到特定目录后就给出了一个Tag标记,格式为:
<Tag文件的名字 />
3.2.2 Tag标记的使用
Web服务目录下的一个JSP页面必须首先使用taglib指令标记引入该Web服务目录下的标记库,这样才能使用Tag标记调用相应的Tag文件。taglib指令格式如下:
<%@ taglib tagdir="标记库的位置" prefix="前缀">
taglib指令中的prefix给出的前缀由用户自定义,其好处时,通过前缀可以有效区分不同标记库中具有相同名字的标记文件。
实验一:解析单词
①实验目的
掌握JSP 页面中使用Tag 文件,向Tag文件传递对象,Tag文件负责处理对象中的数据
②实验要求
1.JSP页面giveText.jsp 负责将String 对象,比如String str="how are you",传递给
所调用的Tag文件backWords.tag。
2.backWords.tag 文件负责解析出String对象中的单词,并将这些单词返回给JSP页
面giveText.jsp。
3.JSP页面giveText.jsp负责显示backWords.ta8返回给它的单词
4.在Tomcat 服务器的webappps 目录下(比如,D:\apache-tomccat-9. 0.26 webapps)新建
个名字是ch3_practice_ one的Web服务目录。把giveText.jsp 文件保存到ch3_practice_ one目录
中。在ch3_ practice_one 日录下再建立目录结构:WEB-INF\tagsel,将backWords.
保存在practicel目录中。
5.用浏览器访问JSP页面giveText.jsp.
giveText.jsp
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.util.Iterator" %>
<%@ taglib tagdir = "/WEB-INF/tags/prictice1" prefix = "getWords"%>
<HTML><body bgcolor = #CCCCFF>
<% String str = "How are you,are you student? where are you from? ";
%>
<getWords:backWords okString ="<%= str %>" /> <%-- 使用Tag标记 --%>
<p style="font-family:宋体;font-size:26">
<%= str %><br>
<%
Iterator<String> ite = words.iterator(); //使用Tag标记返回的Double对象words
out.print("使用了"+ words.size()+"个单词:<br>");
while(ite.hasNext()) { //遍历集合
out.print(" "+ite.next());
}
%>
</p></body></HTML>
backWords.tag
<%@ tag import="java.util.HashSet" %>
<%@ tag import="java.util.regex.Pattern" %>
<%@ tag import="java.util.regex.Matcher" %>
<%@ attribute name="okString" required="true" type="java.lang.String" %>
<%@ variable name-given="words" variable-class="java.util.HashSet "
scope="AT_BEGIN" %>
<%
HashSet<String> set = new HashSet<String>(); //集合不允许有相同的元素
Pattern pattern; //模式对象
Matcher matcher; //匹配对象
String regex="[a-zA-Z]+" ;//匹配英文单词
pattern = Pattern.compile(regex); //初试化模式对象
matcher = pattern.matcher(okString); //初始化匹配对象,用于检索mess
while(matcher.find()) {
String str = matcher.group();
set.add(str);
}
//将返回的arrayList对象放在jspContext中:
jspContext.setAttribute("words",set);
%>
实验结果 :
3.2.3 Tag标记的运行原理
如果该Tag标记对应的Tag文件是首次被JSP页面调用,那么Tomcat服务器会将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
如果该Tag文件已经被转编译为字节码文件,Tomcat服务器将直接执行这个字节码文件。
如果对Tag文件进行了修改,那么Tomcat服务器会重新将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
3.3 Tag文件中的常用指令
3.3.1 tag指令
类似于JSP文件中的page指令。可以指定某些属性的值,tag指令的语法如下:
<%@ tag 属性1=“属性值” 属性2=“属性值” ......属性n=“属性值” %>
3.3.2 include指令
使用方法和作用与JSP文件中的include指令标记类似。
3.3.3 attribute指令
在Tag文件中通过使用attribute指令让使用它的JSP页面向该Tag文件传递需要的数据。
<%@ attribute name="对象名字" required="true"|"false" type="对象的类型" %>
attribute指令中的name属性是必需的,该属性的值是一个对象的名字。JSP页面在调用Tag文件时,可向name属性指定的对象传递一个引用。
3.3.4 variable指令
Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面。
1、variable指令的格式
<%@ variable name-given="对象名" variable-class="对象类型" scope="有效范围" %>
属性name-given的值就是Tag文件返回给JSP页面的对象,该对象名字必须符合标识符规定。variable-class的值是返回的对象的类型,对象的类型必须带有包名。
2、对象的返回
Tag文件为了给JSP页面返回一个对象,就必须将返回的对象的名字以及该对象的引用存储到Tomcat服务器提供的内置对象jspContext中。Tag文件只有将对象的名字及其引用存储到jspContext中,JSP页面才可以使用该对象。比如:
<%@ variable name-given="time" variable-class="java.time.LocalDate" scope="AT_END”>
为JSP页面返回名字是time的LocalDate对象。那么Tag文件中必须让jspContext调用
setAttribute("对象名",对象的引用);
3.3.5 taglib指令
JSP页面或Tag文件都可以使用taglib指令引入标记库(如前面各个例子所示)。taglib指令格式如下:
<%@ taglib tagdir ="自定义标记库的位置" prefix=“前缀”>
一个Tag文件也可以使用几个taglib指令标记引入若干个标记库。
实验二:
显示日历
①实验目的
和实验1的目的相同,进一步强化掌握JSP页面使用Tag文件,即向Tag文件传递对象
Tag文件负责处理数据
②实验要求
1.Tag 文件calendar.tag负责显示日历。
2.编写JSP 页面 useCalendarr.jsp,要求useCalendar.jsp使用Tag标记使用calendar.
tag,并将日期的年份和月份传递给calendar.tag。
3.在Tomcat 服务器的webaapps目录下(比如,D: apache-ttomcat-9.0. 26 webapps)新建
个名字是ch3_practice_two的Web服务目录。把usecCaleendar.jsp 文件保存到ch3 pracctice two
日录中。在ch3_practice_two 目录下再建立目录结构:\WEB-INF tags\ practice2,将 calenddar.tag
保存在practice2目录中
4.用浏览器访问JSP页面useCalendar.jsp
calendar.tag
<%@ tag import="java.time.LocalDate" %>
<%@ tag import="java.time.DayOfWeek" %>
<%@ attribute name="year" required="true" type="java.lang.String" %>
<%@ attribute name="month" required="true" type="java.lang.String" %>
<%
int y = Integer.parseInt(year);
int m = Integer.parseInt(month);
LocalDate date = LocalDate.of(y,m,1);
int days = date.lengthOfMonth(); //得到该月有多少天。
int space = 0; //存放空白字符的个数
DayOfWeek dayOfWeek = date.getDayOfWeek()//得到1号是星期几
switch(dayOfWeek) {
case SUNDAY: space = 0;
break;
case MONDAY: space = 1;
break;
case TUESDAY: space = 2;
break;
case WEDNESDAY: space = 3;
break;
case THURSDAY: space = 4;
break;
case FRIDAY: space = 5;
break;
case SATURDAY: space = 6;
break;
}
int [] calendar = new int[space+days]; //用于存放日期和1号前面的空白
for(int i=0;i<space;i++)
calendar[i]="--";
for(int i = space,n=1;i<calendar.length;i++){
calendar[i] = String.valueOf(n) ;
n++;
}
%>
<h3> <%=year %>年<%=month %>月的日历:</h3>
<table border=1>
<tr><th>星期日</th><th>星期一</th><th>星期二</th><th>星期三</th>
<th>星期四</th><th>星期五</th><th>星期六</th>
</tr>
<% for(int n=0;n<calendar.length;n=n+7){
%> <tr>
<% for(int i=n;i<7+n;i++) {
%> <td> <%=calendar[i] %></td>
<% }
%>
</tr>
<% }
%>
</table>
useCalendarr.jsp
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ taglib tagdir = "/WEB-INF/tags/prictice2" prefix = "getCalendar"%>
<HTML><body bgcolor = #CCCCFF>
<getCalendar:calendar year ="2025" month = "2" /> <%-- 使用Tag标记 --%>
</body></HTML>
实验结果:
总结
1.在Tag文件中通过使用attribute指令让使用它的JSP页面向该Tag文件传递需要的数据。
2.Tag 文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面。
3.在JSP页面中不可以再定义与Tag文件返回的对象具有相同名字的变量,否则Tag文件无法将variable指令给出的对象返回给JSP页面并将出现编译错误。如果Tag文件同时使用variable指令和attribute指令,那么variable指令中 name-given 和attribute指令中name给出的对象不能相同否则将出现编译错误。