Tag文件和Tag标记的用法详解

版权声明: https://blog.csdn.net/acDream_/article/details/82810346

                                      Tag文件和Tag标记


目录

1.为什么要使用Tag文件

2.Tag文件的结构

3.Tag文件的存储目录

4.Tag标记

5.Tag文件中常用的指令

1)tag指令

2)attribute指令

3)variable指令

4)taglib指令

5)include指令

6.Tag文件的嵌套

扫描二维码关注公众号,回复: 3840154 查看本文章

1.为什么要使用Tag文件

 1) 在Web应用中许多JSP页面都有相同的信息,如都需要相同的导航栏和尾页等。如果能把相同的信息都形成一种特殊的文件,而且各个JSP页面都可以使用这种特殊的文件,那么就能实现代码的复用,维护性就比较好了

2)实现代码复用还有另外两种方式,include指令和include动作,那就来说说他们的不足吧,首先不论是include指令还是include动作处理的都是单一 的JSP文件,用户可以通过输入地址栏的方式来访问响应的JSP文件,这时候用户访问的JSP文件可能只是一个导航栏,这不是设计者希望看到的.include指令的耦合性太大,include动作虽然耦合性较小但是能放在Web服务目录的任意子目录中,不仅显的杂乱无章,还不利于管理和维护.

3)使用tag文件就能很好的解决这一缺点,tag文件不仅能实现动态加载实现代码复用,还不能让用户直接访问,tag文件放在指定 的目录下,维护起来会比较方便(很多时候会让tag文件去处理数据,而JSP页面只是去显示数据,实现数据显示和数据处理分离,这样就比较便于维护了)


2.Tag文件的结构

Tag文件是扩展名为.tag的文件,其实与JSP文件差不多.在Tag文件中可以使用HTML标签,可以使用java脚本以及JSP动作和指令,还可以使用某些特殊的指令(后面会讲)


3.Tag文件的存储目录

Tag文件必须存在/WEB-INF/tags 文件夹下(不然会报错),存放目录如下图所示:


4.Tag标记

编写了一个Tag文件会对应生成一个Tag标记,Tag标记的格式为:

<Tag 文件名字/>或

<Tag 文件名字>

         标记体

</Tag 文件名字>

当JSP页面希望向Tag文件传递相应的信息时,可以使用标记体来传递,在Tag文件中通过<jsp:doBody/>来调用标记体

一个Tag文件对应一个Tag标记,那么该目录下有若干个Tag文件就行成了一个库,在JSP页面要调用Tag文件,就要通过taglib指令来引入相应目录下的一个标记库,只有这样JSP页面才能调用相应的Tag文件并动态执行该Tag文件

<%@taglib prefix="前缀" tagdir="自定义标记库的位置"%>

注意:使用前缀可以区别不同标记库下相同名字的标记文件

如:调用/WEB-INF/tags/math/random.tag文件就可以在JSP页面中这样写

<%@taglib prefix="math" tagdir="/WEB-INF/tags/math/"%>来引入标记库

之后可以<math:random/>或者<math:random>标记体</math:random>来调用了并执行相应tag文件了


5.Tag文件中常用的指令

1)tag指令

1.body-content属性

body-content属性的值有empty、tagdependent、scriptless,其默认值是scriptless

empty:当body-content属性的属性值为empty时,JSP页面中必须使用没有标记体的tag标记,<Tag 文件名字>

tagdependent:当body-content属性的属性值为tagdepentdent时,JSP页面通过标记体传来的信息全部按纯文本处理

scriptless:当body-content属性的属性值为scriptless时,标记体中不能使用Java程序块,可以使用文本,EL表达式,一个自定义标记,一个动作

2.language属性

其属性值只支持java

3.import属性

引入java核心类包,可以在Tag文件中使用某些类,跟导包没什么区别就不说了

4.pageEncoding属性

Tag文件的编码属性,其默认值是ISO-8859-1

2)attribute指令

Tag文件充当着代码复用的角色,如果能像include动作一样向Tag文件传递数据,这会让Tag文件的功能更加强大,这当然是可以的,在Tag文件中有attribute指令,其语法格式如下:

<%attribute name="对象名字" required="true"|"false" type="对象的类型"%>

attribute指令中name属性是必须的,该属性是引用一个对象的名字.required为true时必须给其传值,为false时可以传可以不传,type为该对象的类型,默认为java.lang.String类型,可以改为其他类型,但要注意的是,必须对象类型必须带有包名,如不能简写为type="Integer"必须是type="java.lang.Integer"

需要注意的是:在Tag文件中不可以再定义和attribute指令中name属性指定的对象具有相同名字的变量,否则将隐藏attribute指令中的对象,使其失效(可以通过观察源码发现,attribute中的变量其实在Tag文件中一个成员变量)

下面是使用attribute指令的一个例子计算三角形面积的例子:

JSP页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="kai" tagdir="/WEB-INF/tags/geng" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'MyJsp.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  <form action="" method="post">
  边长A: <input type="text" value="" name="a"><br>
  边长B: <input type="text" value="" name="b"><br>
  边长C: <input type="text" value="" name="c"><br>
  <input type="submit" value="Enter">
  </form>
  <br>
  <%
  		if((request.getParameter("a")!=null && request.getParameter("a")!="")
  			&& (request.getParameter("b")!=null && request.getParameter("b")!="")
  			&& (request.getParameter("c")!=null && request.getParameter("c")!="") ){
   %>
  	<kai:Addsum a="<%=Double.valueOf(request.getParameter(\"a\"))%>" b="<%=Double.valueOf(request.getParameter(\"b\"))%>" c="<%=Double.valueOf(request.getParameter(\"c\"))%>">
  	</kai:Addsum>
  	<%}%>
  </body>
</html>

tag文件:

<%@tag import="java.text.DecimalFormat"%>
<%@tag pageEncoding="UTF-8" body-content="scriptless"%>
<%@attribute name="a" required="false" type="java.lang.Double"%>
<%@attribute name="b" required="false" type="java.lang.Double"%>
<%@attribute name="c" required="false" type="java.lang.Double"%>
<html>
	<head>
	</head>
	<body>
		以下是调用Tag文件的效果:<br>
		这是一个Tag文件,负责计算三角形的面积.<br>
		JSP页面传递过来的三条边:<%=a%>,<%=b%>,<%=c%><br>
		<%
			DecimalFormat format = new DecimalFormat("0.00");
			if(a+b>c && a+c>b && b+c>a){
				double p = (a+b+c)/2;
				out.print("三角形的面积: "+format.format(Math.sqrt(p*(p-a)*(p-b)*(p-c))));
			}else{
				out.print("<br>"+a+" "+b+" "+c+" 不能构成三边");
			}
		 %>
	</body>
</html>

3)variable指令

Tag文件通过使用attribute指令JSP页面可以向Tag文件传递数据.在某些Web设计中,不仅需要向其传递数据,还需要他返回某些数据进行特殊处理.比如多个JSP页面需要Tag文件处理一些数据,但是不需要显示,因为每个JSP页面需要特殊的显示,这时候就可以使用variable指令,variable指令语法格式如下:

<%variable name-given="对象名字" variable-class="对象类型" scope="有效范围"%>

name-given:用来指定对象的名字,要符合命名规则

variable-class:指定的类型,注意需要打全包名,不能进行简写

scope中有三个属性值:

                1.AT_BEGIN,在使用JSP页面标记的时候就可以使用该对象

                 2.NESTED,只能在标记体中使用该对象

                 3.AT_END,只能在标记体结束后使用该对象

Tag通过jspContext.setAttribute("对象的名字",对象的引用);把对象名字和对象引用存储到内置对象jspContext中,JSP页面才能使用该对象

4)taglib指令

和JSP页面一样,Tag文件中也可以使用taglib指令来调用其他的tag文件,操作一样

5)include指令

其用法与JSP页面中的include指令差不多,这里就不说了


6.Tag文件的嵌套

在使用Tag标记时,可以带有标记体,标记体还可以是一个Tag标记,这就实现了Tag标记的嵌套


转载请注明出处

猜你喜欢

转载自blog.csdn.net/acDream_/article/details/82810346
tag