自定义标签入门
程序员文章站
2022-06-08 22:23:50
...
1-编写一个实现TagSupport接口的实现类
jsp提供了一个方便类 TagSupport 覆盖doStartTag方法
public class IpTag extends TagSupport {
private static final long serialVersionUID = 1L;
@Override
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest) this.pageContext
.getRequest();//得到 pageContext对象 因为所有的值都放在pageContext里面
JspWriter out = this.pageContext.getOut();
String ip = request.getRemoteAddr();
try {
out.write(ip);
} catch (IOException e) {
throw new RuntimeException(e);
}
return super.doStartTag();
}
}
2-在.tld文件中为tab标签进行描述:(位于WEB-INF路径下:WEB-INF/itcast.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>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/itcast</uri> <!-- uri -->
<tag>
<name>ip</name> <!-- 为标签处理器类配一个标签名 -->
<tag-class>com.itcast.tag.IpTag</tag-class>
<body-content>empty</body-content>
empty 空
JSP
scriptless 不能有jsp
</tag>
</taglib>
3-在jsp页面中使用标签
<%@taglib prefix="itcast" uri="/itcast"%>
<itcast:ip>
4-自定义标签执行流程
执行方法流程
setPageContext(PageContext pc)
setParent(Tag t)
doStartTag()
doEndTag()
release()
5-自定义标签的作用
移除jsp代码
提高代码的可读性
6-自定义标签
处理标签 doEndTag返回值控制页面输出
EVAL_BODY_INCLUDE 输出
EVAL_PAGE 输出
SKIP_BODY 不执行标签体
SKIP_PAGE 剩余页面不输出
7-迭代标签 TagSupport也是继承IterationTag
IterationTag 可以对内容进行迭代
Tag.EVAL_BODY_INCLUDE;执行标签
IterationTag.EVAL_BODY_AGAIN;//迭代标签 重复执行
IterationTag.SKIP_BODY;//执行完 标签 跳过
标签内容输出五次:
public class DateTag extends TagSupport {
int n=5;
// 开始标签
@Override
public int doStartTag() throws JspException {
return Tag.EVAL_BODY_INCLUDE;
}
// 标签体执行之后
@Override
public int doAfterBody() throws JspException {
n--;
if(n>0)
return IterationTag.EVAL_BODY_AGAIN;//迭代标签 重复执行
else
return IterationTag.SKIP_BODY;//执行完 标签 跳过
}
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return super.doEndTag();
}
}
7-修改标签 BodyTag
BodyTag.EVAL_BODY_BUFFERED; //把标签体作为对象传递给bodyContent()
BodyTag.EVAL_PAGE;继续计算标签
/**
* 修改标签体
修改标签体内容
* @author admin
*
*/
public class UpdateTagBody extends BodyTagSupport {
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
return BodyTag.EVAL_BODY_BUFFERED; //把标签体作为对象传递给bodyContent()
}
@Override
public int doEndTag() throws JspException {
String text=getBodyContent().getString().toUpperCase();//得到标签体内容
try {
this.pageContext.getOut().write(text);//输出内容
} catch (IOException e) {
throw new RuntimeException(e);
}
return BodyTag.EVAL_PAGE;//继续执行 Continue evaluating the page.继续执行标签
}
}
8-JspContext 继承 pageContext
PageContext pageContext=(PageContext) getJspContext();
9-类 StringWriter 带缓冲的一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
10-简单标签 SimpleTagSupport
1-定义一个类继承SimpleTagSupport
2-重写【覆盖】doTag方法
*得到标签体
JspFragment jf=getJspBody();
String text=writer.toString().toUpperCase();
*得到JspContext 继承自PageContext 可以转
PageContext pageContext=(PageContext) getJspContext();
3-throw new SkipPageException();//不输出 就抛出一个异常
4-在tld文件中配置
###简单标签生命周期
创建一个实例 ---> setJspContext-->setParent--->setJspBody-->doTag()
代码
@Override
public void doTag() throws JspException, IOException {
//得到标签体
JspFragment jf=getJspBody();
//通过缓冲字符流得到缓冲字符
StringWriter writer=new StringWriter();
for (int i = 0; i < 5; i++) {
jf.invoke(writer);//输出标签体
}
String text=writer.toString().toUpperCase();
PageContext pageContext=(PageContext) getJspContext();
pageContext.getOut().write(text);//得到jspContext对象
// throw new SkipPageException();//不输出 就抛出一个异常
}
11带属性的标签
<tag>
<name>text</name>
<tag-class>com.itcast.simpletag.AttributeTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue><!-- 运行时表达式 el 和jsp -->
</attribute>
</tag>
自定义时间格式化标签:
注意:没有内容就不调用不然就会报错
public class DateFormatTag extends SimpleTagSupport {
private String fmt = "yyyy-MM-dd";
private Date date;
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();
SimpleDateFormat format = new SimpleDateFormat(fmt);
getJspContext().getOut().write(format.format(date));
// fragment.invoke(null);没有内容就不调用
}
public void setFmt(String fmt) {
if (fmt != null && !("".equals(fmt)))
this.fmt = fmt;
}
public void setDate(Date date) {
this.date = date;
}
}
配置文件
<tag>
<name>fmt</name>
<tag-class>com.itcast.simpletag.DateFormatTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>fmt</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue><!-- 必须配置支持 el表达式运行时表达式 -->
</attribute>
</tag>
转载于:https://my.oschina.net/*/blog/163234
上一篇: WPF UserControl 的绑定事件、属性、附加属性
下一篇: SSM自定义标签入门