目录
一、jsp的语言特点
1.构成形式
jsp是由开始标签、标签体、结束标签构成 举个例子:
<z:if test="true"> true </z:if>
2.分类:标签的分类主要是有四种
第一种:控制标签 例如:
<c:forEach items="" var=""></c:forEach>
<c:if test=""></c:if>
第二种:数据标签 例如:
<c:set var="name" value="zs"></c:set>
<c:out value="${ name }"></c:out>
第三种:ui标签 没有标签体也能在网页中输出内容的标签称为ui标签 例如:
<table><tr></tr></table>、<input>
第四种:空标签 例如:
<br>、<hr>
二、自定义标签的开发及使用步骤
1.首先建一个tld类,把跳转的域名改成自己建立的助手类的全路径名
如截图所示:tld类中的代码
2、建立一个自己的助手类
要与tld类中所跳转的域名保持一致
3、引用自己定义的标签
首先导入自己定义的标签库
<%@ taglib uri="http://jsp.zhujiayin.zjy" prefix="z" %>
引用自己定义的标签
<z:demo1>小朱</z:demo1>
三、标签的生命周期
我们用一个思维导图来帮助我们更好地了解
JSP标签生命周期一共有三条路线:
1、 路线一:doStartTag--->返回值是(SkipBody)--->doEndTag
2、 路线二:路线二:doStartTag--->返回值是(EAVL_BODY_INCLUDE)--- >doAfterBody--->返回值是(EAVL_PAGE)--->doEndTag
3、路线三:doStartTag--->返回值是(EAVL_BODY_INCLUDE)--->doAfterbody--->返回值(EAVL_Body_Again)--->doAfterBody(循环)--->doEndTag
验证第一条:开始标签中返回的是Skip_body跳过标签体
当控制台界面打印出了开始标签和结尾标签没有打印打印标签体时就说明路线一的正确性
验证第二条:只要控制台打印了这三条语句时就能验证第二条的正确性
验证第三条:只要一直循环打印开始标签和标签体就说明第三条线路是正确的
四、 实践:自定义if、set、out标签
1.if标签助手类
package com.zjy.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* if标签
* 如果满足条件:就打印标签体--->dostarttag的返回值eval-body_include
* 如果不满足条件,就不输出标签体--->dostarttag的返回值skip_body
*
* 需要获取到是否满足条件的结果值,那么该标签就有一个属性,属性值是boolean
* @author 朱佳音
*
*/
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 {
// TODO Auto-generated method stub
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
tld类代码展示
<!-- 标签库的名字 -->
<name>if</name>
<tag-class>com.zjy.tag.IfTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
2、set标签助手类
package com.zjy.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 数据标签:存储数据的
* 作用域pagecontext,request,session,application(ServletContext)
*
*
*
*
* @author 朱佳音
*
*/
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 {
// 要存储数据,以键值对的方式进行存储,分析得来该标签有2个属性
pageContext.setAttribute(var, value);
return super.doStartTag();
}
}
tld代码展示
<tag>
<!-- 标签库的名字 -->
<name>set</name>
<tag-class>com.zjy.tag.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>
3、out助手类
package com.zjy.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* servelet中后台代码前台输出内容 out.print
* 将数据输出到前台,首先拿到输出流
* @author Administrator
*
*/
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 (Exception e) {
e.printStackTrace();
}
return super.doStartTag();
}
}
引用标签,这里我就放在一起展示了
<z:demo1>小朱</z:demo1>
<z:if test="true">true</z:if>
<z:if test="flase">false</z:if>
<z:set var="name" value="小邓"></z:set>
<z:out value="${name }"></z:out>