一、JSP的特点:
1、jsp的构成:开始标签、标签主体、结束标签 例如: <z:demo1>demo1</z:demo1>2
2、标签的分类:标签的分类主要是有四种
第一种:空标签 例如:<br>、<hr>
第二种:数据标签 例如:<c:set var="name" value="zs"></c:set>
<c:out value="${ name }"></c:out>
第三种:控制标签:<c:forEach items="" var=""></c:forEach>
<c:if test=""></c:if>
第四种:UI标签:<table><tr></tr></table>、<input>
二、自定义标签的步骤:
第一步:自己创建一个tld类,把跳转的域名改成自己想要跳转的路径。
<tag>
<!-- 标签库的名字 -->
<name>demo1</name>
<!--该标签对应的助手类 -->
<tag-class>com.ycx.tag.DemoTap1</tag-class>
<!--代表是一个jsp标签 -->
<body-content>JSP</body-content>
<!-- <attribute> -->
<!-- 改自定义jsp标签的属性名称 -->
<!-- <name>var</name> -->
<!-- 该属性是否必填 -->
<!-- <required>false</required> -->
<!-- 该属性值是否支持表达式 -->
<!-- <rtexprvalue>false</rtexprvalue> -->
<!-- </attribute> -->
</tag>
第二步:新建一个tld助手类
package com.ycx.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 助手类 必须继承bodytagSupport
* @author 杨总
*
*/
public class DemoTap1 extends BodyTagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("------dostaretag-------");
// return super.doStartTag();
// return SKIP_BODY;
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
System.out.println("------doAfterBody-------");
return super.doAfterBody();
// return EVAL_BODY_AGAIN;
// return SKIP_PAGE;
}
@Override
public int doEndTag() throws JspException {
System.out.println("------doEndTag-------");
return super.doEndTag();
// return SKIP_PAGE;
}
}
第三步:引用自己创建的JSP标签。
<y:demo1>xx</y:demo1>
1、自定义标签库是与tld文件相关
2、标签库中的标签与tld中的tag元素有关,也就是跟tag元素对应的助手类有关
三:JSP生命周期:
JSP标签生命周期一共有三条路线:
1.有标签体的情况下默认会调用助手类的dostarttag,doafterBody,doendtag方法
2.如果将dostarttag的返回值改为skip_body,那么doafterbody就不会调用(路线1)
3.如果将dostarttag的返回值改为eval_body_include,那么就会调用doendtag方法(路线2)
4.如果将afterBody的返回值改为eval_Body_again,那么会一直调用doafterBody,进入循环(路线3)
IfTag类:
package com.ycx.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;
}
public int dostarttag() throws JspException{
// TODO Auto-generated method stub
return test?EVAL_BODY_INCLUDE:SKIP_BODY;
}
}
OutTag类:
package com.ycx.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* servelet中后台代码前台输出内容 out.print
* 将数据输出到前台,首先拿到输出流
* @author 杨总
*
*/
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();
}
}
SetTag类:
package com.ycx.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();
}
}