博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSP自定义标签
阅读量:6572 次
发布时间:2019-06-24

本文共 4188 字,大约阅读时间需要 13 分钟。

以下内容引用自:

自定义标签是一种用户定义的JSP 语言元素。当一个包含自定义标签的JSP页面翻译成一个Servlet时,该标签转换为在一个对象上的操作称为标签处理程序。然后当执行JSP页面的Servlet时,Web容器调用这些操作。

扩展的JSP标签允许创建新标签,可以直接插入到一个JavaServer Page(JSP)中,就像内置标签。为了编写这些自定义标签,JSP 2.0规范引入了简单的标签处理程序。

要编写一个自定义标签,可以简单地扩展SimpleTagSupport类,并且重写doTag( )方法,其中可以添加代码来生成标签的内容。

一、创建“Hello”标签

假如想定义一个自定义标签名为<ex:Hello>,想要在以下没有标签体的方式中使用,如下所示:

要创建一个自定义JSP标签,必须首先创建一个Java类作为标记处理程序。因此,创建HelloTag类如下:

import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;public class HelloTag extends SimpleTagSupport {  public void doTag() throws JspException, IOException {    JspWriter out = getJspContext().getOut();    out.println("Hello Custom Tag!");  }}

上面的代码是简单的编码,其中doTag()方法使用getJspContext()产生的当前JspWriter对象,并使用它发送“Hello Custom Tag!”给当前的JspWriter对象。

编译上面的类,并将其复制到CLASSPATH环境变量的有效目录中。最后创建以下标签库文件:webapps\ROOT\WEB-INF\custom.tld。

1.0
2.0
Example TLD
Hello
com.jsoft.HelloTag
empty

在JSP程序中,使用上面定义的自定义标签Hello,如下所示:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>      A sample custom tag        

尝试调用上述JSP,显示结果如下所示:

二、访问标签体

可以标签体中引用在标准标签体中所见的消息。假如想定义一个自定义标签名为<ex:Hello>,想要在以下含有标签体的方式中使用,如下所示:

This is message body

在上面标签的代码中进行如下修改来处理标签的主体:

import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;public class HelloTag extends SimpleTagSupport {   StringWriter sw = new StringWriter();   public void doTag() throws JspException, IOException    {       getJspBody().invoke(sw);       getJspContext().getOut().println(sw.toString());    }}

在这种情况下,在调用中产生的输出是在写入与标签相关的JspWriter对象之前第一个捕获到的StringWriter。因此需要改变TLD文件,如下所示:

1.0
2.0
Example TLD with Body
Hello
com.jsoft.HelloTag
scriptless

现在调用上述带有标签体的标签,如下所示:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>      A sample custom tag        
This is message body

显示结果如下所示:

三、自定义标签属性

可以使用自定义标签的各种属性。要得到一个属性值,一个自定义标签类需要实现setter方法,和JavaBean相同的setter方法如下所示:

import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;public class HelloTag extends SimpleTagSupport {   private String message;   public void setMessage(String msg) {      this.message = msg;   }   StringWriter sw = new StringWriter();   public void doTag() throws JspException, IOException    {       if (message != null) {          /* Use message from attribute */          JspWriter out = getJspContext().getOut();          out.println( message );       }       else {          /* use message from the body */          getJspBody().invoke(sw);          getJspContext().getOut().println(sw.toString());       }   }}

属性的名称是“message”,因此setter方法是setMessage( )。现在用<attribute>元素添加该属性到TLD文件中,如下所示:

1.0
2.0
Example TLD with Body
Hello
com.jsoft.HelloTag
scriptless
message

现在尝试下面的带有消息属性的 JSP 页面,如下所示:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>      A sample custom tag        

显示结果如下所示:

值得注意的是,一个属性可以包含下列属性:

属性 目的
name 名称元素定义了一个属性的名称。对于一个特定的标签,每个属性名称必须是唯一。
required 这指定如果这个属性是必需的或可选的,则指定它。对于可选的,默认为false。
rtexprvalue 如果对于一个标签属性,运行时间表达式的值是有效的,则声明它。
type 定义了该属性的Java类类型。默认情况下它是假设为字符串
description 可以提供信息的描述。
fragment 如果这个属性值应该被视做一个JspFragment,则声明它。

下面是指定一个属性的相关属性的例子:

.....    
attribute_name
false
java.util.Date
false
.....

如果使用的是两个属性,那么可以修改TLD如下所示:

.....    
attribute_name1
false
java.util.Boolean
false
attribute_name2
true
java.util.Date
.....

 

测试工程:

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

转载地址:http://rjmjo.baihongyu.com/

你可能感兴趣的文章
Optimizing Oracle RAC
查看>>
[Javascript] Add a browser build to an npm module
查看>>
线程安全的atomic wrapper classes例子
查看>>
[摘录]调动员工积极性的七个关键
查看>>
Linux getcwd()的实现【转】
查看>>
Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
转: maven进阶:一个多模块项目
查看>>
Android控件之HorizontalScrollView 去掉滚动条
查看>>
linux 查看系统信息命令
查看>>
手工加载DLL
查看>>
[C#]System.Timers.Timer
查看>>
picker.js源码
查看>>
UVM中的class--2
查看>>
关于异常的合理处理方式
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
javascript ES3小测试
查看>>
Android - Animation(二)
查看>>
Android6.0指纹识别开发
查看>>
Lucene简介
查看>>