如何在JSP中使用自定义标签

    链接地址:http://www.xx566.com/detail/146.html

    有这样一个需求:在一个订单列表展示的JSP页面中,我们需要显示订单的状态,在数据库中存储的是1234这样的数字,需要显示如“支付完成”这样的状态 说明;当然我们可以在代码逻辑中处理,也可以在数据库sql查询中使用CaseWhen处理,也可以在视图层中通过C标签或Struts标签判断,不过还 有更好的方法,通过自定义标签,本篇我们就来学习如何在JSP中使用自定义标签。

    (来自百度百科)一般我们说自定义标签是指JSP自定义标签。自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码。自定义标签是可重用的组件代码,并且允许开发人员为复杂的操作提供逻辑名称。

    在日常的Java开发中,我们经常需要用到两种标签:C标签和S标签,所以第一步,需要为你的自定义标签想个前缀,如<c:if test="true"/>,这里的C就是前缀;第二步需要为标签定义名称,名称最好简单明了,能直白的标识标签的意义,如if标识判断;第三步需 要为标签设置属性,如value=""或name=""等等,到这里一个简单的标签就可以开始定义了。

 

    这里,我定义这样一个标签:<h:status value="1"/>,表示的意义就是H标签、作用是获取订单的状态说明,不同的value值显示不同的描述信息,很简单,首先我们需要定义一个 实体类,继承TagSupport(由于我们的标签没有正文,继承此类,有正文的标签需要继承BodyTagSupport,两者都是Tag接口的实 现),如下:

package javase.tag;
 
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
 
/**
 * 自定义标签:状态Tag 
 * User: Realfighter 
 * Date: 2014/10/12 
 * Time: 23:38
 */
public class StatusTag extends TagSupport {
 
    private static final long serialVersionUID = 1L;
     
    private Integer value;// 订单状态的真实值
 
    //重写doStartTag和doEndTag方法
    @Override
    public int doStartTag() throws JspException {
        //JSP API中提供的对象输出类
        JspWriter out = this.pageContext.getOut();
        try {
            String str = Status.getStatus(value);
            out.print(str);
        } catch (Exception e) {
            throw new JspException(e.getMessage());
        }
        // 由于我们的标签没有正文部分,直接返回SKIP_BODY即可,更多返回值见下图
        return SKIP_BODY;
    }
 
    @Override
    public int doEndTag() throws JspException {
        return EVAL_PAGE;//更多返回值见下图
    }
 
    public Integer getValue() {
        return value;
    }
    //这里必须有set方法进行赋值
    public void setValue(Integer value) {
        this.value = value;
    }
 
}
 
// 这里简单的模拟一下获取订单状态
final class Status {
    public static final Integer BUILD = 1;// 订单建立
    public static final Integer END = 0;// 订单完成
    public final static Map<Integer, String> statusMap = getStatusMap();
 
    private static Map<Integer, String> getStatusMap() {
        Map<Integer, String> map = new HashMap<Integer, String>() {
             
            private static final long serialVersionUID = 1L;
 
            {
                put(BUILD, "订单建立");
                put(END, "订单完成");
            }
        };
        return map;
    }
 
    //获取订单状态
    public static String getStatus(Integer value) {
        return statusMap.get(value);
    }
 
}

   下图引自(JSP自定义标签开发入门),这里借用说明。

暂无图片

    接下来,我们需要自己编写h-tags.tld文件,建议放入WEB-INF目录下,与web.xml文件同级,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
    <tlib-version>1.0</tlib-version>
    <jsp-version>2.0</jsp-version>
    <short-name>h</short-name>
    <!-- 定义标签的访问地址 -->
    <uri>/h-tags</uri>
    <tag>
        <name>status</name>
        <!--自定义标签类的路径-->
        <tag-class>javase.tag.StatusTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <!--标签属性-->
            <name>value</name>
            <!--标识是否必须 -->
            <required>true</required>
            <!-- 表示是否可以使用JSP表达式  -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

    最后,我们只需要在相应的JSP页面中引入相应的标签库,再根据我们定义的规则传入相应的参数就可以使用了,如下:

<!-- 引入标签库,uri与tld文件中设置的一致即可自动引用 -->
<%@ taglib uri="/h-tags" prefix="h"%> 
<h:status value="1"/>

   总结:目前来看,H标签只是简单的进行字符的输出,相对比较简单,更复杂的做出一个类似于S标签或C标签的,还需要更深入的学习,有时间的话,我也会继续深入研究一下其中的原理,欢迎持续关注。

你可能感兴趣的:(jsp,自定义标签)