首页 > 其他分享 >制作tld文件及应用详解

制作tld文件及应用详解

时间:2023-04-23 17:03:33浏览次数:35  
标签:BODY 标签 详解 jsp EVAL tld import 制作 public


制作tld文件及应用详解
1、开个环境:myeclipse6.5+tomcat6.0.23
所需组件jree5.0
2、index.jsp
顶部添加:<%@ taglib uri="/cmszxm" prefix="cms" %>
<table width="800" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td align="center">测试信息</td>
  </tr>
<cms:module_list>
  <tr>
    <td align="center"><%=module_info.getModuleName() %></td>
  </tr>
</cms:module_list>
</table>
3、web.xml中指定你的tld文件
 <jsp-config>
  <taglib>
   <taglib-uri>/cmszxm</taglib-uri>
   <!-- 置自定义标签的uri(不一定存在,但是一定要唯一),为页面的部署做好准备 -->
   <taglib-location>/WEB-INF/tlds/cms.tld</taglib-location>
   <!--定位你的tld文件的相对路径 -->
  </taglib>
 </jsp-config>

4、写自定义Tag的tld文件
<?xml version="1.0" encoding="UTF-8" ?>
<taglib>
    <tlib-version>1.0</tlib-version> <!-- 你自定义标签的版本数 -->
    <jsp-version>2.0</jsp-version> <!-- 标签库依赖的JSP版本 -->
    <short-name>cmsTablib</short-name> <!-- 标签的简写 -->
    <uri></uri> <!-- 指定这个标签库的uri信息 -->
    <small-icon></small-icon> <!-- 被工具使用的小图标 -->
    <description>cms</description> <!-- 本标签的描述 -->

    <tag>

      <name>module_list</name> <!-- 标签名字 -->
      <tag-class>com.ModuleListTag</tag-class> <!-- 指定你的标签的类 -->
      <body-content>JSP</body-content> <!-- 标签主体的内容 -->
      <description>module_list</description> <!-- 标签描述 -->

      <variable>
        <name-given>module_info</name-given>
        <variable-class>com.ModuleVO</variable-class>
        <declare>true</declare>
        <scope>cccc</scope>
      </variable>

    </tag>

</taglib>

5、ModuleListTag.java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import tools.ConnSqlSer;
public class ModuleListTag extends BodyTagSupport {
 private static final long serialVersionUID = 1670679946944899701L;
 ServletRequest request = null;
 private Iterator it;
 ModuleVO vo = new ModuleVO();
 //遇到开始标签执行  
 public int doStartTag() throws JspException {
  request = pageContext.getRequest();
  Collection coll = (Collection) getModule_List();
  // 表示如果未找到指定集合,则不用处理标签体,直接调用doEndTag()方法。  
  if (coll == null || coll.isEmpty())
   return 0;
  it = coll.iterator();
  if (it.hasNext()) {
   vo = (ModuleVO) it.next();
   pageContext.setAttribute("module_info", vo);
   return 1;
  }
  return 0;
 }
 //遇到标签体执行
 public int doAfterBody() {
  if (it.hasNext()) {
   vo = ((ModuleVO) it.next());
   pageContext.setAttribute("module_info", vo);
   return 2;
  }
  return 0;
 }
 //遇到结束标签执行  
 public int doEndTag() throws JspException {
  System.out.println("doEndTag...");
  return EVAL_PAGE;
 }

 public ArrayList getModule_List() {
  Connection conn = ConnSqlSer.init();
  PreparedStatement pstm = null;
  ResultSet rs = null;
  ArrayList<ModuleVO> list = new ArrayList<ModuleVO>();
  String sql = "SELECT ModuleID,ModuleCode,ModuleName,ModuleLinkUrl FROM PermissionControl_Module ORDER BY ModuleCode";
  try {
   pstm = conn.prepareStatement(sql);
   rs = pstm.executeQuery();
   while (rs.next()) {
    ModuleVO module = new ModuleVO();
    module.setModuleID(rs.getString("ModuleID"));
    module.setModuleCode(rs.getString("ModuleCode"));
    module.setModuleName(rs.getString("ModuleName"));
    list.add(module);
   }
  } catch (SQLException e) {
   System.out.println("查询系统模块信息");
  } finally {
   ConnSqlSer.ConnClose(rs, pstm, conn);
  }
  return list;
 }

6、ModuleVO.java
import javax.servlet.jsp.tagext.TagSupport;
public class ModuleVO extends TagSupport {

 String ModuleID;  
 String ModuleCode;
 String ModuleName;

 public String getModuleID() {
  return ModuleID;
 }
 public void setModuleID(String moduleID) {
  ModuleID = moduleID;
 }
 public String getModuleCode() {
  return ModuleCode;
 }
 public void setModuleCode(String moduleCode) {
  ModuleCode = moduleCode;
 }
 public String getModuleName() {
  return ModuleName;
 }
 public void setModuleName(String moduleName) {
  ModuleName = moduleName;
 }



TLD自定义标签 

TLD配置说明

rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否可以使用JSP表达式.

当在<attribute>标签里指定<rtexprvalue>true</rtexprvalue>时, 表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定,  example as follow:

<sql:query var="result" >
    select * from mytable order by nameid
</sql:query>
<%request.setAttribute("nameid", "2"); %>
<myTag:cupSize cupSize="1" cupSizes="${result}"></myTag:cupSize>
<myTag:cupSize cupSize="${nameid}" cupSizes="${result}"></myTag:cupSize>


当在<attribute>标签里指定<rtexprvalue>false</rtexprvalue>时, 表示该自定义标签的某属性的值只能直接指定,  example as follow:
<myTag:cupSize cupSize="1" cupSizes="${result}"></myTag:cupSize>

...................................................................................................................................................................................................................

TLD文件配置详解(jsp自定义标签)

<tag>
<name>write</name>
<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>bundle</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>其中:
<name>write</name>:这个Tag的名字
<tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>:这个Tag是由那个类实现的(这个class可以在struts.jar包中找到)
<bodycontent>empty</bodycontent>:这个Tag可以直接结尾,不需要填写内容
   这里bodycontent有三个可选值
       jsp        标签体由其他jsp元素组成   
         如果其有jsp元素,那么标签会先解释,然后将元素的实际值传入。比如标签体里含有<%=attributeName%>这样子的jsp元素,此时标签会按attributeName的实际值是什么就传入什么。这个是最常用的一个。
       empty 标签体必须为空   
         在引用这个Tag的时候,可以<bean:write bundle="attributeName" />,而不必<bean:write bundle="attributeName" ></bean:write> 
       tagdependent 由标签解释,不带jsp转换 
<attribute> </attribute>这里标识的是这个Tag的一个参数
<name>bundle</name>这个参数的名字
<required>false</required>这个参数是否是必填相
      如果为true则必须写这个参数,否则会报错
<rtexprvalue>true</rtexprvalue>是说这个标签的值可以写入
       rtexprvalue:"RUN-TIME EXPRESSION VALUE",是否可以动态赋值,在jsp中如value="<%=attributeName%>"

...................................................................................................................................................................................................................

重载BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();


他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()


doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY, 
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。

标签中静态常量:

EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

标签:BODY,标签,详解,jsp,EVAL,tld,import,制作,public
From: https://blog.51cto.com/u_16085348/6218292

相关文章

  • 条码打印软件怎样制作弧形标签
    在使用条码打印软件制作标签的时候,不同的客户对于标签上文字的排版要求是不一样的。常见的方形标签,对于文字的排版可能不是那么多要求。如果是圆形标签,可能需要文字呈扇形排版或者是弧形排版(如下图),那么这种需要怎么做呢?今天小编就给大家演示一下弧形文字的制作过程。打开条码打......
  • cpu居然不下,排查诊断详解
    客户端登录服务器,使用非常卡顿,查看服务器使用情况有进程占用cpu非常严重查看进程所在目录[root@176-18-0-10~]#pwdx12681268:/usr/local/games/.cache查看病毒目录和执行文件内容[root@176-10-0-10~]#ls/usr/local/games/.cacheah32h64runss32stak3stakce......
  • MAC地址详解
    MAC地址MAC地址(MediaAccessControl),即媒体访问控制地址,在不同的使用场景下有不同的别名,比如局域网地址(LANAddress),以太网地址(EthernetAddress),物理地址(PhysicalAddress),硬件地址(HardwareAddress)等。MAC地址作用于数据链路层,用来在局域网中唯一标识一个网络设备接口。网络设备制......
  • 基于SuperMap iDesktop制作栅格和矢量瓦片
    栅格瓦片的制作与使用 栅格瓦片的生产瓦片地图缓存可以提升客户端地图呈现的显示效率,但是生成瓦片地图缓存也是一项耗费时间的工作。桌面产品生成缓存iServer分布式切图SuperMapUGC缓存SuperMapUGCV5缓存MongoDB分布式存储缓存MongoDB栅格瓦片的制作(一)......
  • 在线甘特图制作教程
    很多的甘特图工具都是需要下载到本地,并且做好了之后也不方便分享给别人。给大家分享一个在线的甘特图制作工具不需要登录注册知竹甘特图打开工作台打开知竹甘特图知竹甘特图在线甘特图添加任务点击任务标题进入编辑状态按`回车键`即可在当前任务下添加一个任务设置任......
  • rails的接口查询详解
    RetrievingObjectsfromtheDatabasefind"find"是一种常用的数据库查询方法,在Rails中被用于从数据库中查找单个记录。它可以接收一个主键作为参数,也可以接收一组条件参数。以下是"find"方法的使用方式:#使用主键查找单个记录Model.find(1)#使用条件参数查找单个记录Mod......
  • Openharmony应用NAPI详解--基础篇
    NAPI是什么?​ 简单点理解就是在Openharmony里,实现上层js或ets应用与底层C/C++之间交互的框架。​ Openharmony里的官方解释:NAPI(NativeAPI)组件是一套对外接口基于Node.jsN-API规范开发的原生模块扩展开发框架。还有NAPI适合封装IO、CPU密集型、OS底层等能力并对外暴露JS接口,通过......
  • Openharmony应用NAPI详解--进阶篇1
    NAPI面向C++的异步接口3.C++实现NAPI异步接口需要做到三步同步返回结果给js/ets调用者另起线程完成异步操作通过回调(callback)或Promise将异步操作结果返回4.异步接口//foundation/filemanagement/dfs_service/frameworks/js/napi/src/sendfile_napi.cpp...DECLARE......
  • Openharmony应用NAPI详解--进阶篇2
    NAPI面向C++的异步接口(promise)promise方式的处理方式承接上文,与callback方式不同的是,promise对象由C++侧创建以返回值的方式传递回js/ets侧,promise对象存储异步执行的结果。//foundation/filemanagement/file_api/interfaces/kits/js/src/common/napi/n_async/n_async_work_p......
  • Hibernate HQL详解
    1.  HibernateHQL详解1.1. hql简介Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。看个示例,看看sql和HQL的相同与不同:Sql:select*......