JSTL自定义
-
函数 ${fn:xxxx}
-
自己描述一个类
-
类中描述自己的方法(方法必须是静态的 因为不需要创建对象才能调用)
方法通常有返回值 -
描述【配置】一个"说明书" ----> xxx.tld 文件 用来作为说明书
---在当前工程的web文件夹中的WEB-INF文件夹下 创建一个XML Configure File 的JSP Tag Library Descriptor 的后缀为 .tld 的文件 用来描述我们自己写的标签库类 -
如何描述呢
其中 <short-name> 表示前缀 ,<uri> 表示路径 且这两个必须描述
这是最简单的自定义JSTL函数 可以在 此基础上扩展
在JSP头部声明头信息
<%@ taglib prefix="mf" uri="http://wmnb.com" %>
然后使用这个函数 ${ mf:add(12,13) }
-
标签 <c:xxxx>
自定义标签 每一个标签都是一个单独的类
-
创建一个类(用来描述 一个标签)
需要遵循规则 实现一个Tag接口 重写里面的方法
最重要的两个方法 doStartTag doEndTag -
两组对应的 get/set 方法 自己补全 并添加相应的私有属性
还有一个 单独的方法 release方法 回收对象
doStartTag doEndTag
在 doStartTag doEndTag 方法内添加自己的逻辑
返回Tag接口的常量 用来指示JSTL框架下一步怎么做
常量:
Tag.EVAL_BODY_INCLUDE;
Tag.SKIP_BODY;
Tag.EVAL_PAGE;
Tag.SKIP_PAGE
可以根据某些条件决定是否包含标签主体内容,可以使用
Tag.EVAL_BODY_INCLUDE --包含
或 Tag.SKIP_BODY。---跳过
如果需要继续处理页面的后续内容,可以返回 Tag.EVAL_PAGE。
如果要立即停止页面的处理,可以返回 Tag.SKIP_PAGE
给标签写说明书
先描述shortname 和 uri
public class MyOut implements Tag {
private PageContext pageContext;
public void setPageContext(PageContext pageContext) { this.pageContext = pageContext; }
public PageContext getPageContext(){ return this.pageContext; }
private Tag parent ;
public void setParent(Tag tag) { this.parent = tag; }
public Tag getParent() { return this.parent; }
//======================================
// <c:out value="val"> doStartTag表示加载完这句头标签后 做的事
// </c:out> doEndTag 表示加载尾标签做的事
private String value;
public void setValue(String value){this.value=value;}
public String getValue(){return this.value;}
public int doStartTag() throws JspException {
return 0;
}
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.write(value);
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
public void release() { }//释放 相当于servlet的destory方法
}