前言
我们学习jsp自定义标签之前,首先要知道什么是标签,标签有哪些特点
1.什么是自定义标签
自定义标签是用户定义的JSP语言元素。当包含自定义标签的JSP页面转换为servlet时,这个标签就转换为一个名为tag handler的对象上的操作。之后当JSP页面的servlet执行时,Web容器就调用这些操作。
2.标签的特点组成
<开始标签 属性=“属性值”>标签体</结束标签>
还有一种标签就是空标签,空标签没有标签体没有结束标签。列如:
< br/>< hr/>
<开始标签/>
为什么要学自定义标签
相信大家都用过c标签吧(jstl标签库),那么为什么有c标签了还要学自定义标签呢?举个例子,假如需要修改学生信息,我们可以同过传值给界面单选按钮是否选中
<c:if test="${student.ssex=='男' }">
性别:<input type="radio" name="sex" checked value="男"/>男
<input type="radio" name="sex" value="女"/>女<br/>
</c:if>
<c:if test="${student.ssex=='女' }">
性别:<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" checked value="女"/>女<br/>
</c:if>
但如果是爱好每个学生的爱好不同,做修改回填相对会比较麻烦,所以我们掌握自定义标签开发出适合自己项目的标签,可以减少多余代码
使用自定义标签步骤
1,先建一个.tld文件在WEB-INF目录下
<tag>
<name>out</name>//标签名
<tag-class>com.liuchunming.OutTag</tag-class>//助手类
<body-content>JSP</body-content>
<attribute>
<name>value</name>//属性名
<required>true</required>//是否必填
<rtexprvalue>true</rtexprvalue>//是否支持表达式
</attribute>
</tag>
2,我们在jsp标签使用标签库时,写一行代码引用标签库
<%@taglib prefix="l" uri="/liuchunming" %>
uri是引用地址,prefix是定义的名字,鼠标移入uriCtrl+点击就可以进入到tld中查看
3,每一个标签都必须有一个对于的助手类,继承BodyTagSupport
package com.liuchunming;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class OutTag extends BodyTagSupport{
private static final long serialVersionUID = 1L;
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.println(value);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SKIP_BODY;
}
}
属性需要对应标签里的属性值用于赋值取值(get/set)
自定义标签生命周期图
图中我们可以看出有三个方法体,doStarTag对应了两个返回值,doAfterBody()也要两个,doEndTag也是两个。下面解释一下这些返回值的作用
SKIP_BODY | 跳过主体 |
---|---|
EVAL_BODY_INCLUDE | 计算主体内容并输出 |
EVAL_PAGE | 计算后续内容 |
SKIP_PAGE | 跳过后续内容 |
EVAL_BODY_AGAIN | 再次计算主体 |
自定义标签简单案例
set标签
<tag>
<name>set</name>//标签名
<tag-class>com.liuchunming.SetTag</tag-class>//助手类完整类名
<body-content>JSP</body-content>
<attribute>
<name>var</name>//属性名
<required>true</required>//是必填
<rtexprvalue>false</rtexprvalue>//不支持表达式
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
set助手类
package com.liuchunming;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class SetTag extends BodyTagSupport{
private static final long serialVersionUID = 1L;
private String var;
private Object value;
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
pageContext.setAttribute(var, value);
return SKIP_BODY;
}
}
out标签
<tag>
<name>out</name>
<tag-class>com.liuchunming.OutTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
out助手类
package com.liuchunming;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class OutTag extends BodyTagSupport{
private static final long serialVersionUID = 1L;
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.println(value);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SKIP_BODY;
}
}
jsp界面
效果
if标签
<tag>
<name>if</name>
<tag-class>com.liuchunming.IFTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
if助手类
package com.liuchunming;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IFTag extends BodyTagSupport{
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public int doStartTag() throws JspException {
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
jsp页面
效果图
总结
今天的分享就到这里,如果有什么不对的地方欢迎大家提出来改进。