目录
一.JSP标签是什么??
JSP是Java Server Pages的缩写,是一种在服务器端使用Java语言编写的动态网页技术。通过JSP,可以在HTML文件中嵌入Java代码和标签,将动态生成的数据合并到HTML页面中,实现动态的内容展示和交互功能。
二.JSP标签语言的特点
2.1 标签的格式:
<开始标签 属性="属性值"> 标签体 </结束标签>
例:<c:if test="true">true</c:if>
2.2 标签的分类
空标签: br hr
控制标签: if foreach
数据标签: out 保存数据
UI标签 : input,table (没有标签体也可以输出内容的标签就是UI标签)
点击c:if 跳转到 c.tld 界面 .tld文件是标签库的描述文件 而且必须放在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>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>y</short-name>
<uri>http://yinzi</uri>
<tag>
<!-- 标签库标签的名字 -->
<name>aa</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.DomeTag1</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>var</name>
<!-- 是否为必填项 -->
<required>false</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签库标签的名字 -->
<name>if</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.IfTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>test</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签库标签的名字 -->
<name>set</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.SetTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>var</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<!-- 属性名称 -->
<name>value</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签库标签的名字 -->
<name>out</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.OutTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>value</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
截取了一部分完整的,标注了其意思
3.1 步骤
1.编写助手类
可以看到第二个是助手类
助手类实现了JSP标签库中定义的标签,并提供了简单的API来处理标签的属性和输出。
助手类将负责处理标签的输出。标签的具体实现可以在助手类中完成,也可以包含在独立的标签处理器类中。
package com.yinzi.jsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 助手类(必须继承BodyTagSupport)
* @author 86131
*
*/
public class DomeTag1 extends BodyTagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("调用了doStartTag方法");
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
System.out.println("调用了doAfterBody方法");
return super.doAfterBody();
}
@Override
public int doEndTag() throws JspException {
System.out.println("调用了doEndTag方法");
return super.doEndTag();
}
}
2.编写.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>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>y</short-name>
<uri>http://yinzi</uri>
<tag>
<!-- 标签库标签的名字 -->
<name>aa</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.DomeTag1</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>var</name>
<!-- 是否为必填项 -->
<required>false</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签库标签的名字 -->
<name>if</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.IfTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>test</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签库标签的名字 -->
<name>set</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.SetTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>var</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<!-- 属性名称 -->
<name>value</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签库标签的名字 -->
<name>out</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.OutTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>value</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3.最后导入就OK了
这个自己定义!!
四.标签的生命周期
1.有标签体的情况下,默认调用doStartTag,doAfterBody,doEndTag方法
2.如果将doStartTag返回值改为skip_body,则doAfterBody不会执行(路线1)
3.如果将doStartTag返回值改为eval_body_include ,则doAfterBody会执行(路线2)
4.如果将doAfterBody返回值改为EVAL_BODY_AGAIN,则会进入循环(路线3)
五.if标签
案例
如果满足条件就输出标签体 返回值为eval_body_include
否则返回值为skip_body
需要获取一个是否满足条件的结果值,则会有一个属性为boolean类型
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;
}
六.set和out标签
Set
package com.yinzi.jsp;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 数据标签(存储数据,存储在作用域中)以键值对的方式
* @author 86131
*
*/
public class SetTag extends BodyTagSupport{
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 super.doStartTag();
}
<tag>
<!-- 标签库标签的名字 -->
<name>set</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.SetTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>var</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<!-- 属性名称 -->
<name>value</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
out
package com.yinzi.jsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* UI类型
* 输出
* @author 86131
*
*/
public class OutTag extends BodyTagSupport{
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.print(value);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.doStartTag();
}
}
<tag>
<!-- 标签库标签的名字 -->
<name>out</name>
<!-- 对应的助手类 -->
<tag-class>com.yinzi.jsp.OutTag</tag-class>
<!-- 代表JSP标签 -->
<body-content>JSP</body-content>
<!-- 属性 -->
<attribute>
<!-- 属性名称 -->
<name>value</name>
<!-- 是否为必填项 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
输出结果: