Jsp之Tag文件和Tag标记

本文详细介绍了JSP中的Tag文件和Tag标记,包括Tag文件的目录位置、编写及调用方式。Tag文件可以实现代码复用,帮助分离数据处理和显示。文中还讲解了Tag文件中的tag、include、attribute和variable指令的用法,并给出了实际的练习案例,如Triangle.tag用于计算三角形面积,以及GetWord.tag用于分解字符串中的单词。

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的偶数之和

1
2
3
4
5
6
7
8
9
&lt ;%
int sum = 0 ;i = 1 ;
for ( int i ;i &lt ;= 100 ;i ++ )
{
if (i %2 == 0 )
sum +=i ;
}
out. println (sum ) ;
%&gt ;

 

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

1
2
3
4
5
&lt ;%@ page contentType = "text/html; chatset=utf-8"  %&gt ;
&lt ;%@ taglib tagdir = "/WEB-INF/tags" prefix = "1" %&gt ;

&lt ;h3 &gt ;调用Tag文件的效果: &lt ;/h3 &gt ;
&lt ; 1 :AddSum  /&gt ;

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
&lt ;%@ tag language = "java" pageEncoding = "UTF-8" %&gt ;
&lt ;%@ attribute name = "sideA" required = "true"  %&gt ;
&lt ;%@ attribute name = "sideB" required = "true"  %&gt ;
&lt ;%@ attribute name = "sideC" required = "true"  %&gt ;

&lt ;%!
public  String getArea ( double a, double b, double c ) {
if (a +&gt ;&amp ;&amp ; a +c &gt ;&amp ;&amp ; c +b &gt ;a )
{
double p = (a +b +c ) / 2.0 ;
double area = Math. sqrt (p * (p -a ) * (p -b ) * (p -c ) ) ;
return  "&lt;BR&gt;三角形的面积:" +area ;
}
else
return  "&lt;BR&gt;" +a + "," +b + "," + "c" + "不能构成三角形,无法计算面积." ;
}
%&gt ;

&lt ;%
out. println ( "&lt;BR&gt;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 ) ) ;
%&gt ;

example3_3.jsp

1
2
3
4
5
6
7
8
9
10
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"% &gt;
&lt;%@ taglib tagdir="/WEB-INF/tags" prefix="computer" % &gt;
&lt;/head &gt;
&lt;body &gt;
&lt;H3 &gt;以下是调用Tag文件的结果: &lt;/H3 &gt;
&lt;computer:Triangle sideA="5" sideB="6" sideC="7" / &gt;

&lt;/body &gt;
&lt;/html &gt;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
&lt ;%@ page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %&gt ;
&lt ;%@ taglib tagdir = "/WEB-INF/tags" prefix = "words"  %&gt ;

&lt ;%  String s = "South Africa World Cup(Espana is champion)" ;  %&gt ;

字符串:
<h3 >&lt ;%=%&gt ;</h3 >
中全部单词
&lt ;%
for ( int i = 0 ;i &lt ;wordList. size ( ) ;i ++ )
out. print ( "
"
+wordList. get (i ) ) ;
%&gt ;

 

GetWord.tag

1
2
3
4
5
6
7
8
9
&lt ;%@tag  import = "java.util.ArrayList" %&gt ;
&lt ;%@ tag language = "java" pageEncoding = "UTF-8" %&gt ;
&lt ;%@ attribute name = "str" required = "true"  %&gt ;
&lt ;%@ variable name -given = "wordList" variable - class = "java.util.ArrayList" scope = "AT_END"  %&gt ;
&lt ;%
ArrayList list = new  ArrayList ( ) ;
String regex = "[\\s\\d\\p{Punct}]+" ;
String  [ ]words =str. split (regex ) ;
for ( int i = 0 ;i &lt ;words. length ;i ++ ) { list. add (words [i ] ) ;  } jspContext. setAttribute ( "wordlist",list ) ;  //将list对象返回给jsp页面 %&gt;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值