JSP自定义标签

一.不需要用到Spring中的bean

1.创建标签逻辑处理类继承javax.servlet.jsp.tagext.TagSupport类,类中根据需要定义需要从页面标签中传入的变量,可选择重写下列三种方法。

/**
 * 循环标签
 *
 * @author FuShaoxing xinyu2010@126.com
 * @version 1.0   2015-8-14 23:17:14
 */
public class ForTag extends TagSupport {
 private int i = 0;
 private int count;
 private String var;

 /**
 * 遇到标签开始时会呼叫的方法
 * 其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY
 * 前者表示将显示标签间的文字,后者表示不显示标签间的文字
 */
 @Override
 public int doStartTag() throws JspException {
 if (count == 0 || var == null) return SKIP_BODY;
 if (i < count) {
 pageContext.setAttribute(var, ++i);
 }
 return EVAL_BODY_INCLUDE;
 }

 /**
 * 这个方法是在显示完标签间文字之后呼叫的
 * 其返回值有EVAL_BODY_AGAIN与SKIP_BODY
 * 前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步
 */
 @Override
 public int doAfterBody() throws JspException {
 if (i < count) {
 pageContext.setAttribute(var, ++i);
 return EVAL_BODY_AGAIN;
 }
 return SKIP_BODY;
 }

 /**
 * 遇到标签结束时呼叫的方法
 * 其合法的返回值是EVAL_PAGE与SKIP_PAGE
 * 前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
 */
 @Override
 public int doEndTag() throws JspException {
 release();
 return EVAL_PAGE;
 }

 @Override
 public void release() {
 i = 0;
 count = 0;
 var = null;
 }

 public void setCount(int count) {
 this.count = count;
 }

 /**
  * 用来接收页面传值
  */
 public void setVar(String var) {
 this.var = var;
 }
}

2.创建tld后缀的标签定义xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.0</jsp-version>
    <short-name>spoon</short-name>
    <description>Spoon tag</description>
    <tag>
        <name>for</name>
        <tag-class>com.spoon.utils.tag.ForTag</tag-class>
        <body-content>JSP</body-content>
        <description>简单循环</description>
        <attribute>
            <name>count</name>
            <!--是否必填-->
            <required>true</required>
            <!--是否接受el表达式-->
            <rtexprvalue>true</rtexprvalue>
            <description>循环次数</description>
        </attribute>
        <attribute>
            <name>var</name>
            <required>true</required>
            <description>参数名</description>
        </attribute>
    </tag>
</taglib>

3.在web.xml中引入tld文件

<jsp-config>
    <taglib>
        <taglib-uri>/tags/spoon</taglib-uri>
        <taglib-location>/WEB-INF/tld/spoon-tags.tld</taglib-location>
    </taglib>
</jsp-config>

4.在jsp页面中加入以下声明来引入自定义标签

<%@ taglib prefix="spoon" uri="/tags/spoon"%>

5.在jsp页面中使用标签

<spoon:for count="5" var="x" />

二、需要用到Spring中的bean

将上一节中的第一步继承的类改为org.springframework.web.servlet.tags.RequestContextAwareTag。此类为抽象类,必须实现doStartTagInternal()方法,相当于上一节中的doStartTag()。

继承此类就可以使用getRequestContext().getWebApplicationContext().getBean(“dictionary”);的方法来获取上下文中的bean。

 

 


转载请注明来源:http://www.foospoon.com/?p=86

暂无评论

发表评论

邮箱地址不会被公开。 必填项已用*标注