zoukankan      html  css  js  c++  java
  • JSP自定义标签

    JSP自定义标签


    1. JSP自定义标签

    尽管JSP中内置了许多标签,但有时还是需要根据需求自定义标签。如用逗号和空格格式化数字:
    <mytags:formatNumber number="100050.574" format="#,###.00"/>
    根据传入的number和format,在JSP页面上格式化这个数字,上面的数字应该被输出为100,050.57
    JSTL中没有提供内置的标签,所以只能自定义标签实现。

    1.1 JSP自定义标签处理器

    首先创建一个类,它继承自javax.servlet.jsp.tagext.SimpleTagSupport,并重写doTag()方法。重点是需要为标签的属性设置setter方法。所以定义两个setter方法–setFormat(String format)和setNumber(String number)。
    SimpleTagSupport类提供方法使我们能获取JspWriter对象并输出数据到response。我们使用DecimalFormat类来生成格式化的字符串并输出到response。

    package com.zkzong.format;
    
    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);
            }
        }
    
    }
    

    1.2 创建TLD(Tag Library Descriptor)文件

    一旦标签处理器创建完成,就需要在WEB-INF文件中定义一个TLD文件。当应用部署后容器就会加载它。

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://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>http://zkzong.com/jsp/tlds/mytags</uri>
        <tag>
            <name>formatNumber</name>
            <tag-class>com.zkzong.format.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必须在tld文件中定义,而且format和number属性也使必需的。

    1.3 描述符配置

    在web.xml文件中配置如下内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <display-name></display-name>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    
        <jsp-config>
            <taglib>
                <taglib-uri>http://zkzong.com/jsp/tlds/mytags</taglib-uri>
                <taglib-location>/WEB-INF/numberformatter.tld</taglib-location>
            </taglib>
        </jsp-config>
    </web-app>

    taglib-uri的值要和TLD文件中定义的一样。

    1.4 在JSP页面中使用自定义标签

    JSP页面如下:

    <%@ page language="java" contentType="text/html; charset=US-ASCII"
        pageEncoding="US-ASCII"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://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="http://zkzong.com/jsp/tlds/mytags" prefix="mytags"%>
    </head>
    <body>
    
        <h2>Number Formatting Example</h2>
    
        <mytags:formatNumber number="100050.574" format="#,###.00" />
        <br>
        <br>
    
        <mytags:formatNumber number="1234.567" format="$# ###.00" />
        <br>
        <br>
    
        <p>
            <strong>Thanks You!!</strong>
        </p>
    </body>
    </html>

    如果有多个标签处理器类可以提供JAR文件供使用。只需在JAR文件的META-INF目录下包含TLD文件就可以了,然后把它放在web应用的lib目录下。这样就不用再web.xml中配置了,因为JSP容器会自动处理。这也是为什么我们使用JSP内置标签时不需要再web.xml中配置。
    源码下载

    参考文章:http://www.journaldev.com/2099/jsp-custom-tags-example-tutorial
    http://www.codeproject.com/Articles/31614/JSP-JSTL-Custom-Tag-Library

    2. 如何创建JSTL自定义函数

    2.1 在/WEB-INF文件夹下创建a.tld文件

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
        <tlib-version>1.0</tlib-version>
        <short-name>mytlds</short-name>
        <uri>http://www.zkzong.com/myTlds</uri>
        <function>
            <name>charAt</name>
            <function-class>com.zkzong.jstl.Functions</function-class>
            <function-signature>char charAt(java.lang.String, int)</function-signature>
        </function>
    </taglib>

    2.2 创建类文件

    package com.zkzong.jstl;
    
    public class Functions {
        public static char charAt(String input, int index) {
            return input.charAt(index);
        }
    }

    2.3 在jsp页面中使用

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@taglib uri="http://www.zkzong.com/myTlds" prefix="mt" %>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>
        </head>
        <body>
                ${mt:charAt("AB",0)} <!-- It will give you A-->
        </body>
    </html>

    源码下载

    参考文章:http://www.noppanit.com/how-to-create-a-custom-function-for-jstl/
    http://findnerd.com/list/view/How-to-create-a-custom-Function-for-JSTL/2869/

    tld文件中的uri可以不用配置。如果没有配置,在jsp页面中引入标签时,uri的值就是tld文件的路径,如<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>

    如果觉得本文对您有帮助,请“打赏”,谢谢。
    您的鼓励,我的动力。
    微信 支付宝
  • 相关阅读:
    Fleury算法
    2012 MultiUniversity Training Contest 2
    高斯若尔当消元法(线性代数)
    hdu4307(最小割)
    hdu4305(生成树计数)
    hdu4318(最短路)
    hdu4309(网络流)
    hdu4313(生成树)
    生成树计数
    MYSQL 远程登录及常用命令
  • 原文地址:https://www.cnblogs.com/zongzhankui/p/5875317.html
Copyright © 2011-2022 走看看