自定义标签的步骤:
1.创建一个自定义标签处理器类,实现SimpleTag接口
public class HelloSimpleMyTag implements SimpleTag {
2.在WEB-INF文件夹下新建一个.tld(标签库描述文件)为扩展名的xml文件.并拷入固定的部分:并对
description,display-name,tlib-version,short-name,uri做出修改
<?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"> <!-- 描述TLD文件 --> <description>MyTag 1.0 core library</description> <display-name>MyTag core</display-name> <tlib-version>1.0</tlib-version> <!-- 建议在jsp页面上使用的前缀 --> <short-name>test</short-name> <!-- 作为tld文件的id,用来标示当前的tld文件,多个tld文件的uri不能重复,在 JSP页面 通过 taglib 的属性 uri来引入tld文件 --> <uri>http://www.test.com/mytag/core</uri>
</taglib>
3.在tld文件中描述自定义的标签
<tag> <!-- 标签的名字,在jsp页面上使用标签的名字 --> <name>hello</name> <!-- 标签所在的全类名 --> <tag-class>com.java.tag.HelloSimpleMyTag</tag-class> <!-- 标签体类型 --> <body-content>empty</body-content> </tag>
4.在jsp页面使用自定义标签
<%@ taglib uri="http://www.atguigu.com/mytag/core" prefix="test" %>
<test:hello/>
使用自定义标签时,prefix可以自己定义,通常会推荐tld文件中的<short-name>
-------------------------------------------------------------------------------------
通过使用自定义标签,会发现,标签处理器类的 setJspContext(),doTag()会被调用
public class HelloSimpleMyTag implements SimpleTag { @Override public void doTag() throws JspException, IOException { } @Override public JspTag getParent() { return null; } @Override public void setJspBody(JspFragment arg0) { } //JSP引擎调用 @Override public void setJspContext(JspContext arg0) { } @Override public void setParent(JspTag arg0) { } }
在调用setJspContext(JspContext arg0) 时传入JspContext 对象,
通过J2EE API 发现
java.lang.Object
javax.servlet.jsp.JspContext
PageContext 是 JspContext的一个子类,
在setJspContext(JspContext arg0) 是传入一个PageContext对象,
private PageContext pageContext;
//JSP引擎调用,把实际代表PageContext对象传入 @Override public void setJspContext(JspContext arg0) { this.pageContext = (PageContext)arg0; }
其中PageContext为JSP的一个隐含对象,通过PageContext可以获取JSP页面的其他8个隐含对象
即可以在doTag()中对页面进行输出
//执行标签体逻辑实际应该编写到该方法中
@Override public void doTag() throws JspException, IOException { pageContext.getOut().print("HelloWorld!");
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
pageContext.getOut().println("Hello: "+request.getParameter("name"));
}
标签的属性:
<atguigu:hello value="aaa" count="10"/>
在标签上使用属性以下几个步骤
1.需要在tld文件中添加标签属性的描述
<tag> <!-- 标签的名字,在jsp页面上使用标签的名字 --> <name>hello</name> <!-- 标签所在的全类名 --> <tag-class>com.java.tag.HelloSimpleMyTag</tag-class> <!-- 标签体类型 --> <body-content>empty</body-content> <attribute> <!--该属性的名字 --> <name>value</name> <!-- 该属性是否必须 --> <required>true</required> <!--rtexprvalue :runtime expression value 当前属性是否可以接受运行时表达式的动态值 --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>count</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag>
<!--rtexprvalue :runtime expression value 当前属性是否可以接受运行时表达式的动态值 --> <rtexprvalue>true</rtexprvalue>
可以动态赋值
<atguigu:hello value="${param.name }" count="10"/>
2.在标签处理器类中需要出现与上述属性名相同的成员变量
public class HelloSimpleMyTag implements SimpleTag { private String value; private String count; public void setValue(String value) { this.value = value; } public void setCount(String count) { this.count = count; }
当标签属性存在时会默认调用setXxx()
次需求为将value的值打印count次
<atguigu:hello value="${param.name }" count="10"/>
@Override public void doTag() throws JspException, IOException { // pageContext.getOut().println("HelloWorld!<br>"); // HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); // pageContext.getOut().println("Hello: "+request.getParameter("name")); JspWriter out = pageContext.getOut(); int c = Integer.parseInt(count); for(int i = 0;i<c;i++){ out.print(value); out.print("<br>"); } }
原文:http://www.cnblogs.com/wq3435/p/5174237.html