JSP自定义标签示例教程
今天,我们将研究JSP定制标记。
前面我们了解了JSP Action Elements,JSP EL和JSTL,以避免在JSP页面中编写脚本元素。
但是有时甚至这些还不够,我们可能会倾向于编写Java代码以在JSP页面中执行一些操作。
幸运的是,JSP是可扩展的,我们可以创建自己的自定义标签来执行某些操作。
JSP中的自定义标签
假设我们要显示一个带有逗号和空格格式的数字。
当号码真的很长时,这对用户非常有用。
因此,我们需要一些自定义标签,如下所示:
<mytags:formatNumber number =" 100050.574" format ="#,###。 00"
根据传递的数字和格式,它应该在JSP页面中写入格式化的数字,例如,在上面的示例中,它应该显示" 100,050.57"。
我们知道JSTL没有提供任何内置标签来实现此目的,因此我们将创建自己的自定义标签实现并在JSP页面中使用它。
下面是示例项目的最终结构。
JSP定制标记处理程序
这是在JSP中创建自定义标签的第一步。
我们需要做的就是扩展javax.servlet.jsp.tagext.SimpleTagSupport 类并重写doTag()方法。
需要注意的重要一点是,我们应该为标记所需的属性提供设置方法。
因此,我们将定义两个设置器方法-setFormat(字符串格式)和setNumber(字符串编号)。
SimpleTagSupport
提供了一些方法,通过这些方法,我们可以获取JspWriter对象并将数据写入响应。
我们将使用DecimalFormat类生成格式化的字符串,然后将其写入响应。
最终实现如下。
NumberFormatterTag.java
package com.theitroad.jsp.customtags; import java.io.IOException; import java.text.DecimalFormat; import javax.servlet.jsp.JspException; import javax.servlet.jsp.SkipPageException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class NumberFormatterTag extends SimpleTagSupport { private String format; private String number; public NumberFormatterTag() { } public void setFormat(String format) { this.format = format; } public void setNumber(String number) { this.number = number; } @Override public void doTag() throws JspException, IOException { System.out.println("Number is:" + number); System.out.println("Format is:" + format); try { double amount = Double.parseDouble(number); DecimalFormat formatter = new DecimalFormat(format); String formattedNumber = formatter.format(amount); getJspContext().getOut().write(formattedNumber); } catch (Exception e) { e.printStackTrace(); //stop page from loading further by throwing SkipPageException throw new SkipPageException("Exception in formatting " + number + " with format " + format); } } }
请注意,我正在捕获format()方法引发的异常,然后引发SkipPageException以防止进一步加载JSP页面。
创建JSP定制标记库描述符(TLD)文件
标记处理程序类准备就绪后,我们需要在WEB-INF目录中定义一个TLD文件,以便容器在部署应用程序时将其加载。
numberformatter.com
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="https://java.sun.com/xml/ns/j2ee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>Number Formatter Custom Tag</description> <tlib-version>2.1</tlib-version> <short-name>mytags</short-name> <uri>https://theitroad.local/jsp/tlds/mytags</uri> <tag> <name>formatNumber</name> <tag-class>com.theitroad.jsp.customtags.NumberFormatterTag</tag-class> <body-content>empty</body-content> <attribute> <name>format</name> <required>true</required> </attribute> <attribute> <name>number</name> <required>true</required> </attribute> </tag> </taglib>
注意URI元素,我们将必须在我们的部署描述符文件中对其进行定义。
还请注意所需的属性格式和编号。
body-content为空表示标签将没有任何正文。
JSP定制标记部署描述符配置
我们将使用如下所示的jsp-config
和taglib
元素在Web应用程序中包含jsp自定义标签库。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>JSPCustomTags</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <jsp-config> <taglib> <taglib-uri>https://theitroad.local/jsp/tlds/mytags</taglib-uri> <taglib-location>/WEB-INF/numberformatter.com</taglib-location> </taglib> </jsp-config> </web-app>
taglib-uri值应与TLD文件中定义的值相同。
现在已完成所有配置,我们可以在JSP页面中使用它。
使用JSP自定义标签的页面
这是一个示例JSP页面,我其中使用我们的数字格式器jsp自定义标记。
index.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Custom Tag Example</title> <%@ taglib uri="https://theitroad.local/jsp/tlds/mytags" prefix="mytags"%> </head> <body> <h2>Number Formatting Example</h2> <mytags:formatNumber number="100050.574" format="#,###.00"<br> <mytags:formatNumber number="1234.567" format="$# ###.00"<br> <p>Thanks You!!</p> </body> </html>
现在,当我们运行我们的Web应用程序时,我们将获得下图所示的JSP页面。
JSP响应页面显示了格式化的数字,类似地,我们可以创建更多的jsp自定义标记处理程序类。
我们可以在标签库中定义多个标签。
如果您有很多自定义标记处理程序类,或者希望将其作为JAR文件提供给他人使用,则需要在JAR文件的META-INF目录中包含TLD文件,并将其包含在Web应用程序lib目录中。
在这种情况下,我们也不需要在web.xml中对其进行配置,因为JSP容器可以解决这些问题。
因此,当我们使用JSP标准标记时,无需在web.xml中进行配置,而可以在JSP中声明它们并使用它们。
如果您不确定,请解压缩JSTL Tomcat standard.jar并在META-INF目录中找到许多TLD文件。