转载自   深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会

自定义标签,顾名思义,就是自己定义的标签。那么我们为什么要自己定义一些标签呢?

我们知道,如果要在JSP中获取数据我们可以采用通过JSP的隐式对象request来获取相应的请求参数或者属性,也可以通过脚本<%  Java  代码%>来进行相应的处理,当然还可以使用EL表达式进行相关数据的操作。

这里,我们主要来谈一下在JSP中使用自定义标签。那么我们为什么要自定义一些标签呢?我们知道,JSP中标签的使用使得Web应用的显示层与业务逻辑层分开。在JSP使用标签,可以移除JSP中的java代码使得JSP页面更加的整洁和便于维护。然而,在JSP中定义的一些标签又是有限的或者是我们所不需要的,这时,我们就可以同过自定义标签的形式将相应的操作封装在标签中,只需在JSP中调用相应的标签即可。这样就简化了我们的JSP页面也便于页面操作人员维护了。下面,我们就来了解一下自定义标签、如何定义自己的标签,以及在JSP中如何引用自己定义的标签。

一、自定义JSP标签概述

自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用。当页面中需要使用类似的显示逻辑时,就可以在页面中插入这个标签,从而完成相应的功能。

使用自定义标签,可以分离程序逻辑和表示逻辑,将Java代码从HTML中剥离,便于美工维护页面;自定义标签也提供了可重用的功能组件,能够提高工程的开发效率。

自定义标签主要用于移除Jsp页面中的java代码。

二、自定义JSP标签的执行过程

当一个含有自定义标签的JSP页面被JSP引擎(Web容器)转译成Servlet时,JSP引擎遇到自定义的标签,会把这个自定义标签转化成对一个称为“标签处理类”的调用。之后,当这个JSP页面被执行时,JSP引擎就会调用这个“标签处理类”对象,并执行其内部定义的相应操作方法,从而完成相应的功能。

三、自定义JSP标签的开发流程

使用Java处理类来开发自定义JSP标签时,主要分为下几个步骤:

创建标签的处理类(Tag Handle Class)。这个类实现Tag接口,用来定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。

创建标签库描述(tld)文件(Tag Library Descriptor File),在tld文件中对标签处理器类进行描述。

在JSP文件中用taglib指令引入标签库,然后使用标签库描述文件中指定的标签名来使用它。

四、创建标签的处理类、创建标签库描述文件、用taglib指令引入标签库

1. 创建标签的处理类

要想定义自己的标签,必须要定义一个实现了Tag接口或是继承实现了改接口的子类的类(这里,我们主要通过继承实现了Tag接口的TagSupport类来介绍),然后把相应的操作封在相应的方法中即可。

例:

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class CustomTagIP extends TagSupport {}

2. 创建标签库描述文件

定义标签库文件其实就是定义一个用于描述标签处理类和JSP文件之间关系的一个扩展名为”.tld”的文件。标签库描述符文件是一个以“.tld”结尾的标准XML文档,用来记录一个标签库内拥有哪些标签、每个标签包含哪些属性等。

注:这个 ”.tld”文件一定要放在WEB-INF文件夹下否则在JSP解析引擎将JSP文件解析成Servlet时会因所要解析的自定义标签找不到对应的标签处理类而导致该处理类无法被加载而产生错误。

例:

<?xml version="1.0" encoding="UTF-8"?>
//XML声明
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
//指明改文件中所使用的标签的名称空间以及其//约束文件所在的具体位置<taglib>为改文件的根标签
<description>A tag library exercising SimpleTag handlers.</description>
//这是<description>:标签库的一个文本描述
<tlib-version>1.0</tlib-version>
//<tlib-version>:指定标签库的版本为1.0
<short-name>lijizh</short-name>
//<short-name>:为标签定义简短的名字,在taglib
//指令中可作为首选的前缀名使用。
<uri>http://www.hbsi.com</uri>
//<uri>:定义一个URI,用于唯一的标识此标签库。(可根据需要自定义)
<tag>
//<tag>:用于指定自定义标签的相关信息。<description>OutputsHello, World</description><name>H</name>//<name>紧跟在前缀明后的标签名<lijizh:H><tag-class>www.hbsi.web.tag.CustomTagIP</tag-class>
//<tag-class>指明创建标签处理类的具体位置<body-content>empty</body-content>
//<body-content>指明自定义标签体的内容的类型具体可/
//为:EMPTY JSP  scriptless  tagdepentend</tag>//结束标签
</taglib>

还有一些其他的标签的介绍:

<display-name>:为标签库指定一个简短的别名。

<small-icon>:为标签库指定大小为16×16的小图标(gif或jpeg格式),该图标可在图形界面工具中显示。

<large-icon>:为标签库指定大小为32×32的大图标(gif或jpeg格式),该图标可在图形界面工具中显示。

<validator>:为标签库提供一个验证器。

<listener>:为标签库提供一个监听器。

<tag-file>:用于描述标签文件。

<function>:用于指定在表达式语言中使用的函数

3. 用taglib指令引入标签库

虽然在上面已经定义好了标签处理类和相应的库描述文件但是要想在JSP中使用自定义标签还需要使用JSP中的指令原素进行引用才可使用。

例:

<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.hbsi.com"prefix="lijizh" %>
<html> <body><lijizh:H>SKIP_PAGEThis is my JSPpage. <br></lijizh:H>aaaaaaaa<br/></body>
</html>

再综合来看一个具体的实例:

使用标签输出客户机IP。

1、标签处理类:

package www.hbsi.web.tag;import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;publicclass CustomTagIP extends TagSupport {@Overridepublicint doStartTag() throwsJspException {HttpServletRequest request =(HttpServletRequest) this.pageContext.getRequest();//同过this.pageContext获取一个PageContext类型的对象//通过该对象可以调用其他八大隐式对象JspWriter out = this.pageContext.getOut();try {out.println(request.getRemoteAddr());} catch(IOException e) {throw new RuntimeException(e);}return  this.EVAL_BODY_INCLUDE;// doStartTag()根据这个返回值来进一步确定是否显示//标签体中的内容。其中,returnthis.SKIP_BODY;忽略标签体中的内容不执行;returnthis.EVAL_BODY_INCLUDE;显示标签体中的内容。}}

2.定义标签描述库

<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><description>A taglibrary exercising SimpleTag handlers.</description><tlib-version>1.0</tlib-version><short-name>lijizh</short-name><uri>http://www.hbsi.com</uri><tag><description>index.jsp</description><name>H</name><tag-class>www.hbsi.web.tag.CustomTagIP</tag-class><body-content>empty</body-content></tag></taglib>

3.JSP文件中引用自定义标签

<%@ pagelanguage="java" import="java.util.*"pageEncoding="UTF-8"%><%@ taglib uri="http://www.hbsi.com"prefix="lijizh" %><html><body>您当前的IP地址是<br><lijizh:H/></body></html>

效果如图:

这样你就可以在JSP中使用自定义标签来封装自己的Java代码了。自己试一试吧!

深入体验JavaWeb开发内幕——简述JSP中的自定义标签叫你快速学会相关推荐

  1. 自定义标签的使用jsp实例_JSP自定义标签示例教程

    自定义标签的使用jsp实例 Today we will look into JSP custom tags. Earlier we learned about JSP Action Elements, ...

  2. JSP中的taglib标签如何让JSP页面使用标签

    taglib指令的作用是在JSP页面中,将标签库描述符文件引入到该页面中,并设置前缀,而去利用标签的前缀去使用标签库表述文件中的标签. 就用个例子具体说一下步骤. 例如要创建一个自定义标签: < ...

  3. JavaWeb学习总结(十七)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  4. JavaWeb学习总结(二)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  5. 自定义JSP中的Taglib标签之四自定义标签中的Function函数

    转自http://www.cnblogs.com/edwardlauxh/archive/2010/05/19/1918589.html 之前例子已经写好了,由于时间关系一直没有发布,这次带来的是关于 ...

  6. jsp中(s标签)各种基本的表达

    1. 执行action中的某一放方法时,在action的name后面加叹号,action后面加问号,表示传值. userAction!add.action?user.userId="admi ...

  7. JSP GridView --使用自定义标签实现ASP.NET的控件

    JSP用自定义标签实现ASP.net的gridview.datasource组件 第一部分:使用说明 使用过ASP.NET的人都知道,gridview控件功能很强大,使用很方便,提高了开发效率.而且表 ...

  8. java ee jsp_EE JSP:使用自定义标签库生成动态内容

    java ee jsp 在Web应用程序中开发View层时,您希望尽量不要重复JSP文件中的内容. JSP spec API允许您通过使用标记库来减少这种重复. 定制JSP标记是用户定义的xml标记元 ...

  9. EE JSP:使用自定义标签库生成动态内容

    在Web应用程序中开发View层时,您希望尽量不要重复JSP文件中的内容. JSP spec API允许您通过使用标记库来减少这种重复. 定制JSP标记是用户定义的xml标记元素,您可以将其插入JSP ...

最新文章

  1. 线程安全的集合类、CopyOnWrite机制介绍(转)
  2. Android混淆打包
  3. Android应用开发:动画和Fragment
  4. 12- APP接口测试以及接口文档的分析
  5. [BuildRelease Management]Team City
  6. Direct ByteBuffer学习
  7. 如何在 C# 循环中捕获局部变量?
  8. 如何从过滤器中排除URL
  9. Java适配器的设计模式
  10. 【Kafka】Kafka BrokerEndPointNotAvailableException: End point with security protocol PLAINTEXT not
  11. Gson源码解析之InstanceCreator简单说明
  12. sublime text3怎么运行python代码_怎么用sublime text 3搭建python 的ide?
  13. [NOIP2013]表达式求值
  14. JavaScript嗅探执行神器-sniffer.js,你值得拥有!
  15. Android 10 Settings应用二级菜单关于设备-Android版本中基带版本添加点击事件
  16. Filter过滤器基本内容
  17. 光敏传感器实验报告_光敏传感器光电特性测量实验分析报告.ppt
  18. validation list嵌套对象校验
  19. POJ3069 萨鲁曼的大军(重庆一中高2018级信息学竞赛测验3) 解题报告
  20. openlayes调用arcgis wms服务跨域问题(arcgis server10.2)

热门文章

  1. 7-21 求前缀表达式的值 (25 分)(思路详解)
  2. DEBUG org.springframework.web.servlet.DispatcherServlet - Error rendering view [org.thymeleaf.spring
  3. 二叉树先序,中序,后序,层次遍历(数据结构)
  4. ubuntu分解压缩包
  5. 2019-03-09-算法-进化(买卖股票的最佳时机 II)
  6. 2019-02-26-算法-进化(字符串转换成整数)
  7. Trie:hdu 4825、1251、1247、Poj 3764
  8. CF436F Banners(分块/凸包/单调队列)
  9. Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型
  10. P1989 无向图三元环计数 思维 + 建图