- JSP 基础教程
- JSP - 主页
- JSP - 概述
- JSP - 环境设置
- JSP-架构
- JSP-生命周期
- JSP - 语法
- JSP - 指令
- JSP - 操作
- JSP - 隐式对象
- JSP - 客户请求
- JSP——服务器响应
- JSP - HTTP 状态代码
- JSP - 表单处理
- JSP - 编写过滤器
- JSP - Cookie 处理
- JSP - 会话跟踪
- JSP-文件上传
- JSP - 处理日期
- JSP - 页面重定向
- JSP - 点击计数器
- JSP - 自动刷新
- JSP - 发送电子邮件
- 高级 JSP 教程
- JSP - 标准标签库
- JSP - 数据库访问
- JSP - XML 数据
- JSP-Java Bean
- JSP - 自定义标签
- JSP——表达式语言
- JSP——异常处理
- JSP-调试
- JSP-安全性
- JSP-国际化
- JSP 有用资源
- JSP - 问题与解答
- JSP - 快速指南
- JSP - 有用的资源
- JSP - 讨论
JSP - 自定义标签
在本章中,我们将讨论 JSP 中的自定义标签。自定义标签是用户定义的 JSP 语言元素。当包含自定义标记的 JSP 页面被转换为 servlet 时,该标记将转换为对称为标记处理程序的对象的操作。然后,当执行 JSP 页面的 servlet 时,Web 容器将调用这些操作。
JSP 标记扩展允许您创建可直接插入到 JavaServer Page 中的新标记。JSP 2.0 规范引入了简单标记处理程序来编写这些自定义标记。
要编写自定义标签,您可以简单地扩展SimpleTagSupport类并重写doTag()方法,您可以在其中放置代码来生成标签的内容。
创建“你好”标签
假设您想要定义一个名为 <ex:Hello> 的自定义标签,并且希望按以下方式在没有正文的情况下使用它 -
<ex:Hello />
要创建自定义 JSP 标记,必须首先创建一个充当标记处理程序的 Java 类。现在让我们创建HelloTag类,如下所示 -
package com.tutorialspoint; 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()方法获取当前 JspContext 对象,并使用它发送“Hello Custom Tag!” 到当前的JspWriter对象
让我们编译上面的类并将其复制到环境变量 CLASSPATH 中的可用目录中。最后,创建以下标记库文件:<Tomcat-Installation-Directory>webapps\ROOT\WEB-INF\custom.tld。
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
现在让我们在 JSP 程序中使用上面定义的自定义标签Hello ,如下所示 -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello/> </body> </html>
调用上面的 JSP,这应该会产生以下结果 -
Hello Custom Tag!
访问标签主体
您可以在标签正文中包含一条消息,就像您在标准标签中看到的那样。假设您想要定义一个名为<ex:Hello>的自定义标签,并且希望按照以下方式将其与正文一起使用 -
<ex:Hello> This is message body </ex:Hello>
让我们在上面的标签代码中进行以下更改来处理标签的主体 -
package com.tutorialspoint; 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()); } }
这里,调用产生的输出首先被捕获到StringWriter中,然后写入与标记关联的 JspWriter。我们需要更改 TLD 文件如下 -
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
现在让我们用适当的主体调用上面的标签,如下所示 -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello> This is message body </ex:Hello> </body> </html>
您将收到以下结果 -
This is message body
自定义标签属性
您可以将各种属性与自定义标签一起使用。要接受属性值,自定义标记类需要实现setter方法,与 JavaBean setter 方法相同,如下所示 -
package com.tutorialspoint; 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 文件中添加此属性,如下所示 -
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag> </taglib>
让我们按照 JSP 的消息属性进行操作,如下所示 -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello message = "This is custom tag" /> </body> </html>
这将产生以下结果 -
This is custom tag
考虑为属性包含以下属性 -
编号 | 财产与目的 |
---|---|
1 | 姓名 name 元素定义属性的名称。对于特定标签,每个属性名称必须是唯一的。 |
2 | 必需的 这指定该属性是必需的还是可选的。如果是可选的,则为 false。 |
3 | 表达式表达式值 声明标签属性的运行时表达式值是否有效 |
4 | 类型 定义此属性的 Java 类类型。默认情况下,它被假定为字符串 |
5 | 描述 可以提供信息性描述。 |
6 | 分段 声明是否应将此属性值视为JspFragment。 |
以下是指定与属性相关的属性的示例 -
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
如果您使用两个属性,那么您可以修改您的 TLD,如下所示 -
..... <attribute> <name>attribute_name1</name> <required>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribute> <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute> .....