JSP中的自定义标签

  今天我们来说一说在JSP中如何自定义标签。

  1.为何会存在标签

  我们知道,标签是为完成某种功能而存在的,但其实,Java脚本代码也可以在JSP中完成相同的功能,但是代码量看起来比标签多,所以,我们为了降低JSP开发的复杂度和维护量才需要自定义标签。自定义标签同时还可以让软件开发人员和页面设计人员工作分开,在不同的项目使用自定义标签,还可以提高软件的重用性。

  2.自定义标签是什么

  是用户定义的一种JSP标记。当含标签的JSP被Servlet引擎编译成Servlet时,tag标签被转化为一个称为标签处理器类的对象,来对其操作。

  3.开发自定义标签的步骤

  ① 编写自定义标签的处理类,实现SimpleTag接口即其中的五个抽象方法

  需要注意的是:Servlet引擎在JSP被翻译成Servlet时,会自动的去先调用getJspContext()方法,将代表当前JSP页面的pageContext对象传入,再调用doTag()方法去编写标签的逻辑业务。

  为何没有调用getJspBody()???????????????????????????

  ② 编写描述文件tld,实际上就是一个tld文件对应一个标签库

  ③ 在JSP使用taglib指令引入自定义标签库并使用

  4.带属性的标签

  需要在标签处理器类中定义属性,然后在tld文件中描述这个属性(需要注意其中的rtexprvalue属性,他决定了当前属性是否可以接受表达式的值,如EL表达式,若为false,则只可以写死在属性中的值,而不可以接受表达式的值),然后在JSP中引用即可。

   需要注意的是:它背后的原理是,Servlet引擎自动的去调用每个属性对应的setXxx()方法来将JSP标签当中的属性值放入当处理器对象的属性中。

  5.。带标签体的标签

   JSP引擎自动的将标签体的内容在处理器中被封住成一个JSPFragement的对象,且在其中通过getJspBody()方法来获取。获取到这个对象之后,我们可以通过调用这个对象的invoke(Writer out)方法,来将这个对象当中的值输出到指定的Writer对象当中,如果这个对象是null的话,那么就会将标签体的内容输出到隐含对象out中,并自动输出到页面。

  在描述文件tld中,我们需要指明标签体的类型,empty/scriptless/tagdependent,其中常用scriptless。

  需要注意的是:我们可以通过StringWriter对象,来先在标签处理器中获取标签体的内容。

  6.带父标签的标签

  标签之间的父子关系是在JSP页面上书写的方式决定的,而在标签处理器类和tld描述文件中,并没有对两个标签的父子关系进行描述。

  子标签作为父标签的标签体的形式存在,所以父标签的tld中的bodycontent要填scriptless。

  子标签的标签处理器类中可以通过getParent()获得父标签处理器类的父接口JspTag的引用,然后将其强转为父标签处理器类型,从而可以获得父标签的一切内容。

  需要注意的是:当一个父标签有多个子标签时,子标签中的getParent()方法获取的是同一个父标签的实例。

                              子标签作为父标签的标签体存在,必须在父标签中调用getJspBody().invoke(null)方法之后,程序才会去调用子标签的doTag()方法,否则子标签不执行。

  7. EL自定义函数(用的很少)

  ① EL函数

  使用前需要导入..../JSTL/function标签库

  ② EL自定义函数是在EL当中使用public类当中的public static 方法,完成Java代码所能完成的功能。

  开发步骤是public 类中定义public static方法,然后在tld描述文件中使用function节点对其进行描述,name/function-class/function-signature(方法格式),在JSP中导入标签库,即可使用

  ③ JSTL的fn函数

  为了简化在JSP页面操作字符串而提供的一套EL自定义函数。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值