链接地址: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标签的,还需要更深入的学习,有时间的话,我也会继续深入研究一下其中的原理,欢迎持续关注。