`
gaozhonghui
  • 浏览: 242081 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古自治区
社区版块
存档分类
最新评论

jsp的tag的详细使用

阅读更多

文章来自:http://mht.iteye.com/blog/165185

 

关键字: tag

最近一直在研究ext,偶然的机会发现了个exttld,它自身原理既是jsp标记,特收集一些资料,希望对兄弟们有所帮助。

 

 标记文件是 JavaServer Pages (JSP) 技术最重要的新增功能之一,它允许 Web 开发人员利用 JSP 语法创建自定义的标记库。JSP 容器自动将 JSP 标记文件转换为 Java 代码,其过程与从 JSP 页透明地生成 Java Servlet 的过程相同。可以说标记文件隐藏了创建自定义 JSP 标记库的复杂性。这种库能够在 Web 应用程序中重用,它们甚至在用于特定应用程序时也会提供显著的效益,因为自定义标记提高了 Web 页的可维护性。在阅读本文后,您将了解如何创建和使用标记文件以及如何将现有的页片段变换为标记文件。

  JSP 2.0 定义了三个新的指示语句(<%@tag%>、<%@attribute%> 和 <%@variable%>)和两个新的标准操作(<jsp:invoke> 和 <jsp:doBody>),它们只能在标记文件中使用。我们将在整篇文章中使用它们,并且您将了解如何利用更加高级的标记文件特性,如“动态属性”、“片段属性”和“根据属性命名的变量”。当标记文件与 JSP 标准标记库 (JSTL) 同时使用时,标记文件可以是一种功能强大的工具,而 JSTL 引入了由 JSP 2.0 和许多 JSP 操作所采用的表达式语言,包括一系列 SQL 标记。我们将使用 JSTL 和高级的 JSP 特性来创建标记文件,用于更新和查询数据库。

  标记文件概述

  JSP 1.x 允许 Web 开发人员创建 Java 组件(称为标记处理程序),这些组件是通过自定义标记从 JSP 页进行调用的。标记处理程序类似于以前的 Java Servlet,因为您使用很多 println() 调用来生成 HTML 内容,然后必须编译您的 Java 代码。JSP 2.0 的标记文件类似于 JSP 页,因为您使用 JSP 语法,然后 JSP 容器获取您的 JSP 标记文件,分析这些标记文件,生成 Java 标记处理程序,并自动编译它们。标记文件是从 JSP 页进行调用的,JSP 页使用与 <prefix:tagFileName> 模式相匹配的自定义标记。

  为了使标记文件能够被 JSP 容器所识别,标记文件必须使用 .tag 文件扩展名进行命名,并且必须被放置在您的 Web 应用程序的 /WEB-INF/tags 目录中或者 /WEB-INF/tags 的子目录中。如果您采用这种部署方法,则不必创建任何标记库描述器 (TLD),因为 JSP 库是利用 Java 标记处理程序所实施的。您也可以将标记文件放置在 .jar 文件的 /META-INF/tags 目录中,其部署更容易,但在这种情况下,您必须创建 TLD,并且必须在每次更改后重新对标记文件进行打包。

  标记文件和 JSP 页使用几乎相同的语法。您会注意到的第一个区别是新的 <%@tag%> 指示语句,它等同于 <%@page%>。这两个指示语句具有相似的属性,但前者用于标记文件,而后者只能用于 JSP 页中。标记文件并不在一个单独的 .tld 文件中声明其属性和变量,而是使用 <%@attribute%> 和 <%@variable%> 指示语句。当从 JSP 页调用标记文件时,自定义标记可以具有主体(在 <prefix:tagFileName> 与 </prefix:tagFileName> 之间),该主体可以由标记文件利用 <jsp:doBody> 操作来执行。您在下一节中将会看到这是如何工作的。

  使用标记文件代替页片段

  为了拥有可维护的 Web 页,许多经过良好设计的 JSP 1.x 应用程序使用了页片段,这些页片段是利用 <jsp:include> 或 <%@include%> 而包含在较大页面中的,而这不是在 Web 应用程序中重用 JSP 片段的理想方法。与页包含解决方案不同,标记文件专用于创建可重用的页片段库。本节比较了过时的 JSP 1.x 方法的语法与 JSP 2.0 标记文件的更好语法。

  将被包含页变换为标记文件。让我们假设您具有一个名为 container.jsp 的页面,它利用 <jsp:include page="part.jsp"/> 包含了另一个名为 part.jsp 的页面。执行以下步骤,将 part.jsp 变换为标记文件。

  第 1 步:移动被包含页。

  在您的应用程序的 WEB-INF 目录中,创建一个名为 tags 的子目录,并将 part.jsp 页移动到 WEB-INF/tags 中。

  第 2 步:重命名被包含页。

  由于标准的标记文件扩展名是 .tag,您必须将 part.jsp 重命名为 part.tag。

  第 3 步:编辑标记文件。

  打开 part.tag 文件进行编辑,将 <%@page%> 指示语句替换为类似的 <%@tag%> 指示语句。如果遇到编译错误,则可能需要进行其他一些小的修改。使用 jspContext 替代 pageContext。

  第 4 步:声明标记库。

  在 container.jsp 的开头插入 <%@taglib prefix="tags" tagdir="/WEB-INF/tags"%>。

  第 5 步:调用标记文件。

  在 container.jsp 中将 <jsp:include page="part.jsp"/> 替换为 <tags:part/>。

  container.jsp(变换前)

  <p> Container Page </p>

  <jsp:include page="part.jsp"/>

  container.jsp(变换后)

  <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>

  <p> Container Page </p>

  <tags:part/>

  part.jsp(变换前)

  <%@ page language="java" %>

  <p> Included Page </p>

  <%= pageContext.getClass().getName() %>

  part.tag(变换后)

  <%@ tag language="java" %>

  <p> Invoked tag </p>

  <%= jspContext.getClass().getName() %>

  基于 <jsp:include> 和 <%@include%> 的示例。本示例的主页 (main.jsp) 使用 <%@include%> 指示语句包含了两个页片段(header.jspf 和 footer.jspf)。主页还通过使用 <jsp:include> 来包含另一个页面 (content.jsp)。main.jsp 页利用 <jsp:param> 标准操作,向被包含页提供了三个参数(a、b 和 c)。被包含的 content.jsp 页利用 ${param.a}、${param.b} 和 ${param.c} 输出三个参数的值。

  main.jsp

  <%@ include file="header.jspf" %>

  <jsp:include page="content.jsp">

  <jsp:param name="a" value="1"/>

  <jsp:param name="b" value="2"/>

  <jsp:param name="c" value="3"/>

  </jsp:include>

  <%@ include file="footer.jspf" %>

  header.jspf

  <p> Header </p>

  footer.jspf

  <p> Footer </p>

  content.jsp

  <p> Included Content </p>

  <p> Parameters - ${param.a}, ${param.b}, ${param.c} </p>

  基于标记文件的示例。本示例的 JSP 页 (main.jsp) 使用 <%@taglib%> 指示语句来声明包含标记文件 (wrapper.tag) 的库,指出其前缀 (tags) 以及创建标记文件的目录 (/WEB-INF/tags)。main.jsp 页使用 <tags:wrapper> 自定义标记来调用 wrapper.tag 文件,该标记具有三个属性(a、b 和 c)和一些主体内容 (<p> Wrapped Content </p>)。注意,您在 JSP 页的 <tags:wrapper> 与 </tags:wrapper> 之间可以不使用任何脚本编制元素。脚本编制元素包括 JSP 1.x 声明 (<%!...%>)、JSP 1.x 表达式 (<%=...%>) 和 scriptlet (<%...%>),而 JSP 2.0 支持所有这些元素。注意,标记文件可以象任何常规 JSP 页一样使用脚本编制元素。实际上,如果您不喜欢基于 Java 标记处理程序来创建 JSP 库,那么将 Java 代码从现有的 JSP 页移到标记文件中会是个不错的办法。这会使您的 Java scriptlet 可以被重用,并使您的 Web 页更易读。JSP 容器为您完成繁重的工作,它自动生成标记处理程序类。

  wrapper.tag 文件是前面示例中三个被包含页(header.jspf、footer.jspf 和 content.jsp)的替代品。标记文件使用 <%@attribute%> 指示语句声明三个属性,并输出一个标题、一个页脚以及属性的值(${a}、${b} 和 ${c})。wrapper.tag 文件利用新的 <jsp:doBody> 标准操作,执行 main.jsp 的 <tags:wrapper> 的主体。标记文件决定是否执行以及何时执行 <tags:wrapper> 的主体。如果 wrapper.tag 不使用 <jsp:doBody>,则忽略 <tags:wrapper> 的主体。标记文件还可以多次使用 <jsp:doBody>,以便多次执行该主体。

  main.jsp

  <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>

  <tags:wrapper a="1" b="2" c="3">

  <p> Wrapped Content </p>

  </tags:wrapper>

  wrapper.tag

  <%@ tag body-content="scriptless" %>

  <%@ attribute name="a" required="true" %>

  <%@ attribute name="b" required="true" %>

  <%@ attribute name="c" required="true" %>

  <p> Header </p>

  <jsp:doBody/>

  <p> Attributes - ${a}, ${b}, ${c} </p>

  <p> Footer </p>

  
  
  标记文件对比于 <jsp:include> 和 <%@include%>。调用标记文件的自定义标记具有比 <jsp:include> 与 <jsp:param> 的组合更紧密的语法。自定义标记还能以自然的方式进行嵌套和缩进,使得代码易于阅读。唯一可能感觉不便的方面是一项限制,不允许您在调用标记文件的自定义标记主体中使用脚本编制元素。考虑到无脚本的 Web 页可能更易于维护,实际上这也许是

分享到:
评论

相关推荐

    基于servlet+jsp+mysql实现的影视管理系统课程设计

    【作品名称】:基于servlet+jsp+mysql实现的影视管理系统【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 Java Web课程设计,基于servlet+jsp+ajax+mysql做的影视管理系统 运行环境: Tomcat 9.0 JDK 1.8 MySQL 8.0 后台管理账号密码均为:root,项目依赖:lib 目录 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    kernel-5.15-ky10-x86.tar.gz

    kernel-5.15-ky10-x86.tar.gz

    基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】

    【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    基于java的法律咨询系统设计与实现.docx

    基于java的法律咨询系统设计与实现.docx

    适用于元营销 API 的 Python SDK.zip

    适用于元营销 API 的 Python SDK适用于 Python 的 Facebook Business SDK 介绍Facebook Business SDK是一站式服务,可帮助我们的合作伙伴更好地服务于他们的业务。合作伙伴正在使用多个 Facebook API 来满足其客户的需求。采用所有这些 API 并在各个平台上保持最新状态可能非常耗时,而且最终会造成高昂的成本。为此,Facebook 开发了 Business SDK,将其许多 API 捆绑到一个 SDK 中,以简化实施和维护。Business SDK 是 Marketing API SDK 的升级版,其中包括 Marketing API 以及来自不同平台(如 Pages、Business Manager、Instagram 等)的许多 Facebook API。快速入门商业SDK入门指南Python 目前是我们第三方开发人员最常用的语言。是一个 Python 包,它提供了您的 Python 应用程序与Business SDK 内的 Facebook APIfacebook_business之间的

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 公交车调度的运作数学模型 共12页.pdf

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 公交车调度的运作数学模型 共12页.pdf

    基于smart-socket实现的轻量级http服务器

    smart-http 是一款可编程的 Http 应用微内核,方便用户根据自身需求进行 Server 或 Client 的应用开发。支持GET、POST的 HTTP 请求。提供了 URL 路由组件,可以快速搭建一套静态服务器。支持部分 RFC2612 规范,后续会逐渐完善。支持 Https 协议,由 smart-socket 为其赋能。具备文件上传的能力。支持 websocket、Cookie支持 Server、Client 开发

    新闻资讯系统 微信小程序+SpringBoot毕业设计 源码+数据库+论文+启动教程.zip

    新闻资讯系统 微信小程序+SpringBoot毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1oiBpYcEBp

    高校师生工作室-JAVA-基于微信小程序的高校师生工作室管理系统的设计与实现

    高校师生工作室-JAVA-基于微信小程序的高校师生工作室管理系统的设计与实现

    基于java的常见小儿疾病中医护理系统设计与实现.docx

    基于java的常见小儿疾病中医护理系统设计与实现.docx

    本教程播放列表涵盖了 Python 中的数据结构和算法 每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习 .zip

    本教程播放列表涵盖了 Python 中的数据结构和算法。每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习。使用 Python 的数据结构和算法本教程涵盖了 Python 中的数据结构和算法。每个教程都包含数据结构或算法背后的理论、BIG O 复杂度分析以及可供练习的练习。要观看视频,您可以访问播放列表https://www.youtube.com/playlist?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12订阅 codebasics youtube 频道https://www.youtube.com/c/codebasics

    数学建模学习资料 蒙特卡罗方法课件教程 第2章.随机数 共29页.pptx

    数学建模学习资料 蒙特卡罗方法课件教程 第2章.随机数 共29页.pptx

    python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业)

    python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业)python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大

    中小学知识产权教育试点学校申报表.doc

    中小学知识产权教育试点学校申报表.doc

    基于django的音乐推荐系统.zip

    基于django的音乐推荐系统.zip

    在建工程涉及专项行动情况检查表.docx

    在建工程涉及专项行动情况检查表.docx

    毕设源码-python-django基于python技术的学生管理系统的设计与开发-期末大作业+说明文档.rar

    本项目是一个基于Python技术的学生管理系统,采用Django框架进行开发,旨在为计算机相关专业的学生提供一个实践性强、功能全面的管理系统,以帮助他们完成毕业设计或进行项目实战练习。 系统实现了对学生信息、课程信息、成绩、考勤等多方面的管理功能。学生信息管理包括学生基本信息的增删改查;课程信息管理允许管理员设置课程信息,包括课程名称、授课老师、学分等;成绩管理功能使学生和教师能够录入、查看和修改成绩;考勤管理则方便教师记录学生的出勤情况。 该项目采用B/S架构,前端使用HTML、CSS、JavaScript等技术,后端使用Python语言和Django框架,数据库采用MySQL。Django框架提供了强大的后台管理功能,使得系统管理更加便捷。 通过开发这个项目,学生不仅能提升自己的编程能力,还能学习到如何构建一个实际应用的系统,对于即将步入职场的学生来说,具有很高的实用价值。

    适用于 Python 的 Splunk 软件开发工具包.zip

    适用于 Python 的 Splunk 软件开发工具包参考文档适用于 Python 的 Splunk Enterprise 软件开发工具包版本 2.1.0适用于 Python 的 Splunk Enterprise 软件开发套件 (SDK) 包含库代码,旨在使开发人员能够使用 Splunk 平台构建应用程序。Splunk 平台是一个搜索引擎和分析环境,它使用分布式 map-reduce 架构来有效地索引、搜索和处理大型时变数据集。Splunk 平台深受系统管理员的欢迎,用于聚合和监控 IT 机器数据、安全性、合规性以及各种其他场景,这些场景都需要有效地从大量时间序列数据中索引、搜索、分析和生成实时通知。Splunk 开发者平台使开发人员能够利用 Splunk 平台所使用的相同技术来构建令人兴奋的新应用程序。开始使用 Python 版 Splunk SDK开始使用 Python 版 Splunk Enterprise SDKSplunk Enterprise SDK for Python 包含库代码,其示例位于splunk-app-examples存储库

    分布式事务练习.zip

    分布式事务练习

    家庭财务管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    家庭财务管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

Global site tag (gtag.js) - Google Analytics