📅  最后修改于: 2020-11-13 05:29:18             🧑  作者: Mango
在本章中,我们将讨论JSP中的自定义标签。定制标记是用户定义的JSP语言元素。将包含定制标记的JSP页面转换为servlet时,该标记将转换为对称为标记处理程序的对象的操作。然后,当执行JSP页面的servlet时,Web容器将调用这些操作。
JSP标记扩展允许您创建可以直接插入JavaServer Page中的新标记。 JSP 2.0规范引入了用于编写这些定制标记的简单标记处理程序。
要编写自定义标签,只需扩展SimpleTagSupport类并覆盖doTag()方法,即可在其中放置代码以生成标签内容。
考虑您要定义一个名为
要创建自定义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中可用的目录中。最后,创建以下标记库文件:
1.0
2.0
Example TLD
Hello
com.tutorialspoint.HelloTag
empty
现在让我们在JSP程序中使用上面定义的自定义标记Hello ,如下所示:
A sample custom tag
调用上述JSP,这将产生以下结果-
Hello Custom Tag!
您可以像在标准标签中看到的那样在标签正文中包含一条消息。考虑您要定义一个名为
This is message body
让我们在上面的标记代码中进行以下更改,以处理标记的主体-
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文件-
1.0
2.0
Example TLD with Body
Hello
com.tutorialspoint.HelloTag
scriptless
现在让我们用适当的身体来称呼上面的标签,如下所示:
A sample custom tag
This is message body
您将收到以下结果-
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() 。现在让我们使用
1.0
2.0
Example TLD with Body
Hello
com.tutorialspoint.HelloTag
scriptless
message
让我们遵循JSP的message属性,如下所示:
A sample custom tag
这将产生以下结果-
This is custom tag
考虑为属性包括以下属性-
S.No. | Property & Purpose |
---|---|
1 |
name The name element defines the name of an attribute. Each attribute name must be unique for a particular tag. |
2 |
required This specifies if this attribute is required or is an optional one. It would be false for optional. |
3 |
rtexprvalue Declares if a runtime expression value for a tag attribute is valid |
4 |
type Defines the Java class-type of this attribute. By default it is assumed as String |
5 |
description Informational description can be provided. |
6 |
fragment Declares if this attribute value should be treated as a JspFragment. |
以下是指定与属性相关的属性的示例-
.....
attribute_name
false
java.util.Date
false
.....
如果您使用两个属性,则可以按以下方式修改TLD-
.....
attribute_name1
false
java.util.Boolean
false
attribute_name2
true
java.util.Date
.....