1转自:https://blog.csdn.net/yusimiao/article/details/46835617

Jsp自定义tag标签

自定义tag标签的好处
程序员可以自定一些特定功能的标记, 用来封装代码, 达到分工, 重用性等多种好处.
如何存放tag标签
通常在web工程WEB-INF文件夹下创建tags文件夹来存放自定义的tag,如/WEB-INF/tags
tag标签的语法
要知道怎样定义tag标签就需要知道tag标签的基本属性,例如:

<%@ tag body-content="empty" trimDirectiveWhitespaces="true" pageEncoding="UTF-8"%>

通常我们在*.tag文件的开头加上以上的代码来告诉jsp容器这是一个tag标记文件。

body-content有以下三种属性:
1. empty:这个是一个空标记.
2. scriptless:标记主体可以有内容, 并且jsp容器会去处理里面的jsp元素, 这些内容可以是文本, EL表达式, 标准动作甚至另一个自定义标记.
3. tagdependent:标记主体可以有内容, 而jsp容器会把它们当作纯文件处理

trimDirectiveWhitespaces=“true”表示删除多余的空行
pageEncoding=”UTF-8” 表示page的编码格式

标记中也可以定义attribute,例如:

<%@ attribute name="x" required="true" rtexprvalue="true" %>
<%@ attribute name="y" required="true" rtexprvalue="true" %>

attribute的属性介绍如下:
1. name :这个attribute的名称.
2. required : true/false, 是否必须的.
3. rtexprvalue : true/false, 这个attribute可否使用EL表达式, 否则为纯文本.
4. type : 设定这个attribute的类型, jsp容器会把结果自动转换成这个类.

单纯的说以上的定义是不是有点糊涂呢?农夫选豆种——举例(粒)为证:
先展示出自定义的tag在web工程下的目录结构,

我们看一下index.jsp的代码:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib tagdir="/WEB-INF/tags/" prefix="yu" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>define tag</title>
</head>
<body>
<!-- test tag [body-content="empty"] -->
<yu:add x="1" y="2"/> </body>
</html>
 

该index.jsp中引用了add.tag文件,看一下add.tag文件的定义:

 <%@ tag body-content="empty" trimDirectiveWhitespaces="true" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="x" required="true" rtexprvalue="true" %>
<%@ attribute name="y" required="true" rtexprvalue="true" %>
<div>
<h4>The result of x+y is</h4>
result = ${x+y}
</div>

运行起来程序我们看看运行结果:

至此,基本上已经理解了tag文件的使用了吧,那我们做进一步的学习。
继续编写index.jsp代码,来验证body-content=”scriptless”的tag文件:

 <!-- test tag [body-content="scriptless"] -->
<yu:scriptless_tag>
This tag's body-content is [scriptless], let's have a test, i'm here.<br/>
<label>contextPath:<label/> ${pageContext.request.contextPath}
</yu:scriptless_tag>
 

那我们来看一下scriptless_tag.tag文件的定义:

 <%@ tag body-content="scriptless" trimDirectiveWhitespaces="true"  pageEncoding="UTF-8"%>
<div style="background-color: red; width=auto">my backgroud color is red</div>
<jsp:doBody></jsp:doBody>
<div style="background-color: blue; width=70px;">my backgroud color is blue</div>

细心的朋友发现这里面多了一个\<\jsp:doBody>标签,该标签的作用就是讲index.jsp中该标记文件标记的主体显示在该处,来看一下程序运行结果吧,一目了然:

在index.jsp文件中scriptless_tag标签标记的主体显示在了红色背景和蓝色背景之间,并且将代码${pageContext.request.contextPath}解析成了 /yuTestTag

继续编写index.jsp代码,来验证body-content=”tagindependent”的tag文件:

 <!-- test tag [body-content="tagindependent"] -->
<yu:tagdependent_tag>
This tag's body-content is [tagindependent], let's have a test, i'm here.
<label>contextPath:<label/> ${pageContext.request.contextPath}
</yu:tagdependent_tag>

scriptless_tag.tag文件的定义和scriptless_tag.tag的内容基本一样:

 <%@ tag body-content="tagdependent" trimDirectiveWhitespaces="true" language="java" pageEncoding="UTF-8"%>
<div style="background-color: red; width=auto">my backgroud color is red</div>
<jsp:doBody></jsp:doBody>
<div style="background-color: blue; width=70px;">my backgroud color is blue</div>

继续看看运行结果:

代码${pageContext.request.contextPath}没有被解析,只是当做纯文本文件

最后附上index.jsp的完整代码:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib tagdir="/WEB-INF/tags/" prefix="yu" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>define tag</title>
</head>
<body>
<!-- test tag [body-content="empty"] -->
<yu:add x="1" y="2"/> <hr> <!-- test tag [body-content="scriptless"] -->
<yu:scriptless_tag>
This tag's body-content is [scriptless], let's have a test, i'm here.<br/>
<label>contextPath:<label/> ${pageContext.request.contextPath}
</yu:scriptless_tag> <hr> <!-- test tag [body-content="tagindependent"] -->
<yu:tagdependent_tag>
This tag's body-content is [tagindependent], let's have a test, i'm here.
<label>contextPath:<label/> ${pageContext.request.contextPath}
</yu:tagdependent_tag>
</body>
</html>

到此我相信这三种类型的tag的区别已经显而易见了,先简单的写到这,如有不妥请留言补充说明。

Jsp 自定义tag标签的更多相关文章

  1. 自定义tag标签-实现long类型转换成Date类型

    数据库里存储的是bigint型的时间,entity实体中存放的是long类型的标签,现在想输出到jsp页面,由于使用的是jstl标签,而要显示的是可读的时间类型,找来找去有个 fmt:formatDa ...

  2. JSP自定义简单标签入门之带有属性

    上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限"写死了",这是非常不好的行为,因为其灵活性太差.所以下面就介绍一种使用属性来控制标签内容输出次数的方法. 准 ...

  3. JSP自定义业务标签

    自定义标签: package cn.hv.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; ...

  4. 自定义tag标签的方法

    JSP1.0中可以通过继承TagSupport或者BodyTagSupport来实现自定义的tag处理方法. JSP2.0中也支持另外一种更为简单的自定tag的方法,那就是直接讲JSP代码保存成*.t ...

  5. JSP自定义tag控件标签

    JSP支持自定tag的方法,那就是直接讲JSP代码保存成*.tag或者*.tagx的标签定义文件.tag和tagx文件不仅支持经典jsp代码,各种标签模版代码,还支持xml样式的jsp指令代码. 按照 ...

  6. struts2 自定义tag标签

    在项目中可能有很多相同的jsp页面表示功能,这时可以使用自定义的tag进行定义,渐少重复的工作量便于日后维护! 下面就基于struts2进行自定义标签的定义与实现: 首先:自定义类MyTag继承str ...

  7. ylz框架外网之JSP 自定义TAG

    首先用到了ServletContext,全局容器的概念,之前不知道哪里有用,现在用到,这里解析的是一个sysCode的TAG,用于下拉框等选项的时候自动显示要选的内容.大致思路是,利用前一篇所说到的E ...

  8. JSP自定义tag

    前端需要调用后端的配置,想起velocity-tools.然而jsp的话,目前只能想到tag和EL表达式了. Tag相当好写,jsp2.0提供了简化写法: 编写一个java类: public clas ...

  9. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

随机推荐

  1. kafka broker

    在server.properties文件中配置: 1.broker.id kafka集群是由多个节点组成的,每个节点称为一个broker,中文翻译是代理.每个broker都有一个不同的brokerId ...

  2. ASP.NET上传一个文件夹

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  3. 01-pandas基础-Series与DataFrame

    一.Series: 1,介绍:Series是以中类似于一维数组的对象,由一维数组以及与之相关的标签组成 特点:索引在左边,值在右边.在创建时,若我们未给数据指定索引,Series会自动创建一个0到N- ...

  4. 小程序中css3实现优惠券

    效果如下: css3实现优惠券 知识储备 颜色渐变 linear-gradient() css伪类 :before :after index.wxss .app { /* padding: 20rpx ...

  5. 大数据笔记(六)——HDFS的底层原理:JAVA动态代理和RPC

    一.Java的动态代理对象 实现代码如下: 1.接口类MyService package hdfs.proxy; public interface MyService { public void me ...

  6. DAY 5 下午

    每个点一定属于一个重链 重链条数和轻边边数是logn级别 证明和启发式合并差不多 因为轻子树的大小至少是重子树大小-1 树链剖分:两遍dfs 第一次:统计子树大小,确定重儿子 第二次:把重链剖出来 每 ...

  7. 十、补充数据类型set

    set:无顺序的不重复的集合 list---允许重复,修改tuple--允许重复,不能修改 set----不允许重复的集合例子: s=set()print s l1=[11,22,33,22,11]l ...

  8. springboot定时任务出错 Unexpected use of scheduler.

    java.lang.IllegalStateException: Unexpected use of scheduler. 在启动类加: @Bean public ThreadPoolTaskSche ...

  9. numpy多维数组

    1 多维数组的切片用法 c = np.array([[[0,1,2],[4,5,6],[8,7,5],[10,11,12]],[[6,2,3],[9,8,34],[100,101,102],[110, ...

  10. 【vim】vim的收藏集

    [vim]vim的收藏集 刚接触vim,还木有时间专门研究一下自己的配置,所以暂时贴下网上分享的配置 2019-07-13 14:22:08 无插件的版本 https://my.oschina.net ...