JSP自定义标签示例教程

时间:2020-02-23 14:33:52  来源:igfitidea点击:

今天,我们将研究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-configtaglib元素在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文件。