核心标签库和自定义标签库的作用:
代替页面中的JSP脚本,HTML页面中插入JSP脚本会使页面非常难以阅读,增加前端人员的难度,所以尽量使用标签代替JSP脚本.
本文仿照JSTL中的一些标签,设计一些功能相同的自定义标签,探究其实现原理
菜鸟一枚,有什么不足的地方多担待,仅供参考
tld文件声明:
<!-- 标签库的版本 -->
<tlib-version>1.1</tlib-version>
<!-- 标签库前缀 -->
<short-name>label</short-name>
<!-- tld文件的唯一标记 -->
<uri>wjj.0611.wl</uri>
1.set标签:<c:set></c:set>
作用:向域对象中保存数据
必须属性:var,value;
非必须属性:scope;
原理:将value对象保存到scope域中,命名为var,如果没有给出scope属性,默认为page域
实现:
tld文件配置:
<tag>
<name>set</name>
<tag-class>com.wjj.label.setLabel</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>var</name>
<required>true</required>
<fragment>false</fragment>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>scope</name>
<required>false</required>
<fragment>false</fragment>
</attribute>
</tag>实现类:
setLabel.java:
public class setLabel extends SimpleTagSupport {
private String var;
private Object value;
private String scope;
public void setVar(String var) {
this.var = var;
}
public void setValue(Object value) {
this.value = value;
}
public void setScope(String scope){
this.scope=scope;
}
public void doTag() throws JspException{
PageContext pagecontext = (PageContext)this.getJspContext();
if(scope == null) pagecontext.setAttribute(var, value);
else if(scope.equals("requestScope")) pagecontext.setAttribute(var, value,PageContext.REQUEST_SCOPE);
else if(scope.equals("sessionScope")) pagecontext.setAttribute(var, value,PageContext.SESSION_SCOPE);
else pagecontext.setAttribute(var, value,PageContext.APPLICATION_SCOPE);
}
}
2.out标签:<c:out value=""></c:out>
作用:获取域对象中数据
必须属性:value;
非必须属性:default
实现原理:通过EL表达式获得value对应的类再输出到页面上
tld文件配置:
<tag>
<name>out</name>
<tag-class>com.wjj.label.outLabel</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>value</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>Default</name>
<required>false</required>
<fragment>true</fragment>
</attribute>
</tag>实现类:
package com.wjj.label;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class outLabel extends SimpleTagSupport {
private String value;
private String Default;
public void setValue(String value) {
this.value = value;
}
public void setDefault(String Default){
this.Default = Default;
}
public void doTag() throws JspException,IOException{
JspWriter out = this.getJspContext().getOut();
if(value == null) out.write(Default);
else out.write(value);
}
}
if标签:<c:if></c:if>
作用:但条件判断
必须属性:test
原理:test为一个boolean类型,如果test为true输出标签体,否则什么也不做
tld文件配置:
<tag>
<name>if</name>
<tag-class>com.wjj.label.ifLabel</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>实现类:
public class ifLabel extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
public void doTag() throws JspException,IOException{
if(test) this.getJspBody().invoke(null);
}
}待续......