JSP实用教程——第三章Tag文件与Tag标记

本文详细介绍了Tag文件的结构、保存方法,以及Tag标记的使用和运行原理。通过两个实验展示了如何在JSP页面中使用Tag文件处理数据,包括向Tag文件传递对象和从Tag文件接收返回的对象。同时,解释了attribute和variable指令的作用,强调了在JSP页面中避免与Tag文件返回对象同名的重要性。
摘要由CSDN通过智能技术生成

目录

3.1 Tag文件

3.1.1 Tag文件的结构

3.1.2 Tag文件的保存

3.2 Tag标记

3.2.1.Tag标记与Tag文件

3.2.2 Tag标记的使用

3.2.3 Tag标记的运行原理

3.3 Tag文件中的常用指令

3.3.1 tag指令

3.3.2 include指令

3.3.3 attribute指令

3.3.4 variable指令

3.3.5 taglib指令

总结


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给出的对象不能相同否则将出现编译错误。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值