自定义jstl标签

JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。

JSTL 核心标签库标签共有13个,功能上分为4类:

1.表达式控制标签:out、set、remove、catch

2.流程控制标签:if、choose、when、otherwise

3.循环标签:forEach、forTokens

4.URL操作标签:import、url、redirect

使用时需要在项目中加入jstl-1.2.jar,同时在jsp中加入以下代码来使用

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

只使用 核心标签库标签中的标签是不能满足需求的,常常会需要自定义标签。

一、新建.tld文件

.tld文件需要放在WEB-INF的tld文件夹下,没有则需要新建。否则tomcat读不到

<?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.2</jsp-version>
    <!-- <short-name>这个标签是指定我们定义标签的简称,这个作用不大 -->
    <short-name>t</short-name>
    <!-- <uri>是给这个标签文件指定一个访问路径,这个路径我们在Jsp页面中引入这个标签的时候需要用到 ,如:<%@ taglib prefix="t"
        uri="/mytags"%> -->
    <uri>/mytags</uri>
    <display-name>"自定义标签"</display-name>

    <!-- 菜单生成控件 -->
    <tag>
        <name>menu</name>
        <!-- <tag-class>这个标签就是指定我们自定义的标签类的全称 -->
        <tag-class>com.zhs.tag.MenuTag</tag-class>
        <!-- <body-content>这个标签表明自定义标签是否有标签体内容(empty:没有,JSP:有) -->
        <body-content>JSP</body-content>
        <display-name>左侧菜单生成控件</display-name>
        <small-icon>111</small-icon>
        <description>左侧菜单生成控件可选样式easyui,bootstrap,json</description>
<!--         参数,后台可根据name属性取出值 -->
        <attribute>
            <name>menuFun</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <description>菜单信息</description>
        </attribute>
        <attribute>
            <name>style</name>
            <rtexprvalue>true</rtexprvalue>
            <description>菜单样式</description>
        </attribute>
    </tag>

</taglib>

二、新建java类处理标签中的数据(可将数据装换成任何需要的样式)

import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import com.zhs.model.TSFunction;
/**
 *
 * 类描述:菜单标签*/
public class MenuTag extends TagSupport {
    private static final long serialVersionUID = 1L;
    protected String style = "easyui";// 菜单样式
    protected List<Map> menuFun;// 一级菜单
    // 1、public void setPageContext(PageContext pc),
    // JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
    // 2、public void setParent(Tag
    // t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
    // 3、public int
    // doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
    // 4、public int
    // doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
    // 5、public void
    // release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。

    @Override
    public int doStartTag() throws JspTagException {
//        返回值类型:
//        SKIP_BODY(=0) :跳过了开始和结束标签之间的代码。
//        EVAL_BODY_INCLUDE(=1):将body的内容输出到存在的输出流中
//        SKIP_PAGE(=5) : 忽略剩下的页面。
//        EVAL_PAGE(=6):继续执行下面的页
        return EVAL_PAGE;
    }

    @Override
    public int doEndTag() throws JspTagException {
        try {
            JspWriter out = this.pageContext.getOut();
            String menu = (String) this.pageContext.getSession().getAttribute(
                    "leftMenuCache" + style);
            if (menu != null) {
                //向页面转发数据(本例中为列表)
                out.print(menu);
            } else {
                menu = end().toString();
                this.pageContext.getSession().setAttribute(
                        "leftMenuCache" + style, menu);
                out.print(menu);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return EVAL_PAGE;
    }
    public StringBuffer end() {
        StringBuffer sb = new StringBuffer();
        sb.append(getAceMultistageTree(menuFun));
        return sb;
    }
    //获取til文件中的值
    public void setStyle(String style) {
        this.style = style;
    }
    public void setMenuFun(List<Map> menuFun) {
        this.menuFun = menuFun;
    }
    //处理数据
    public static String getAceMultistageTree(List<Map> list) {
        StringBuffer menuString = new StringBuffer();
        int curIndex = 0;
        for (Map map : list) {
            TSFunction parent=(TSFunction)map.get("parentfunction");
            List<TSFunction> childList=(List<TSFunction>)map.get("childfunction");
            if(childList==null){
                menuString.append("<li class=‘active‘>"
                        +"<a href=‘index.html‘>"
                        +"<i class=‘menu-icon fa fa-tachometer‘></i>"
                        +"<span class=‘menu-text‘> "
                        +parent.getFunctionName()
                        +" </span>"
                        +"</a>"
                        +"<b class=‘arrow‘></b>"
                        +"</li>");
            }else{
                menuString.append("<li class=‘‘>"
                        +"<a href=‘#‘ class=‘dropdown-toggle‘>"
                        +"<i class=‘menu-icon fa fa-leaf green‘></i>"
                        +"<span class=‘menu-text‘> "
                        +parent.getFunctionName()
                        +" </span>"
                        +"<b class=‘arrow fa fa-angle-down‘></b>"
                        +"</a>"
                        +"<b class=‘arrow‘></b>"
                        +"<ul class=‘submenu‘>");
                for(TSFunction child:childList){
                    menuString.append("<li class=‘‘>"
                            +"<a  href=\"javascript:loadModule(‘"
                            +child.getFunctionName()
                            +"‘,‘/cssiot"
                            +child.getFunctionUrl()
                            +"‘)\">"
                            +"<i class=‘menu-icon fa fa-caret-right‘></i>"
                            +child.getFunctionName()
                            +"</a>"
                            +"<b class=‘arrow‘></b>"
                            +"</li>");
                }
                menuString.append("</ul></li>");
            }
        }
        return menuString.toString();
    }
}

注:

TagSupport 对象可以引用tomcat中的jsp-api.jar与servlet-api.jar

三、在jsp页面中使用

<t:menu menuFun="${menuMap}"  style="ace" ></t:menu>

使用时可向后台传递参数,整个过程(tld文件,jsp文件,java文件)中参数名要保持一致

附录:

程序用的实体类

import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * 菜单权限表
 *
 */
@Entity
@Table(name = "t_s_function")
@org.hibernate.annotations.Proxy(lazy = false)
public class TSFunction extends BaseEntity {
    private TSFunction TSFunction;// 父菜单
    private String functionName;// 菜单名称
    private Short functionLevel;// 菜单等级
    private String functionUrl;// 菜单地址
    private String functionOrder;// 菜单排序
    private String iconId;// 图标id

    public boolean hasSubFunction(Map<Integer, List<TSFunction>> map) {
        if (map.containsKey(this.getFunctionLevel() + 1)) {
            return hasSubFunction(map.get(this.getFunctionLevel() + 1));
        }
        return false;
    }

    public boolean hasSubFunction(List<TSFunction> functions) {
        for (TSFunction f : functions) {
            if (f.getTSFunction().getId().equals(this.getId())) {
                return true;
            }
        }
        return false;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parentfunctionid")
    public TSFunction getTSFunction() {
        return this.TSFunction;
    }

    public void setTSFunction(TSFunction TSFunction) {
        this.TSFunction = TSFunction;
    }

    @Column(name = "functionname", nullable = false, length = 50)
    public String getFunctionName() {
        return this.functionName;
    }

    public void setFunctionName(String functionName) {
        this.functionName = functionName;
    }

    @Column(name = "functionlevel")
    public Short getFunctionLevel() {
        return this.functionLevel;
    }

    public void setFunctionLevel(Short functionLevel) {
        this.functionLevel = functionLevel;
    }

    @Column(name = "functionurl", length = 100)
    public String getFunctionUrl() {
        return this.functionUrl;
    }

    public void setFunctionUrl(String functionUrl) {
        this.functionUrl = functionUrl;
    }

    @Column(name = "functionorder")
    public String getFunctionOrder() {
        return functionOrder;
    }

    public void setFunctionOrder(String functionOrder) {
        this.functionOrder = functionOrder;
    }

    public String getIconId() {
        return iconId;
    }

    public void setIconId(String iconId) {
        this.iconId = iconId;
    }
}
时间: 2024-10-07 19:01:56

自定义jstl标签的相关文章

自定义JSTL标签和函数库

一.自定义JSTL标签 1.编写标签处理类: (1)实现 SimpleTag 接口,通过 setJspContext()方法可以获取到 jspContext 对象,实际上也是 pageContext 对象. 在 doTag() 方法中完成逻辑,通过 JspWriter out = jspContext.getOut(); 获取到的 out 对象,可以输出到页面.如: /** * MyTag2 * * @author solverpeng * @create 2016-07-03-10:20 */

自定义JSTl标签-----满足自身需求(JSTL标签库无法满足需求时)

一.JSTL是: apache开发的一套jsp标签,后来捐献给了sun,sun将其命名为jstl 二.JSTL的使用(ideal中) 1.导入jar包到pom文件中: <!--jstl的jar--><dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope

自定义jstl标签库

自定义函数库: 1.定义类和方法(方法必须是public static)  2.编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下 3.在jsp中采用taglib指令引入自定义函数库 4.采用 前缀+冒号(:)+函数名 调用即可 MyFunctions.java 代码: [java] view plain copy public class MyFunctions { public static String sayHello(String name) { retu

自定义jstl标签开发

从jsp1.1开始就可以在jsp页面中使用自定义标签了,使用自定义标签不但可以实现代码重用,而且可以使jsp代码更简洁.Jsp2.0的标签扩展API中又增加了SimpleTag接口和其实现类SimpleTagSupport. 标签扩展API层次结构: TLD文件元素详解: 每个自定义标签都必须在TLD文件中声明,TLD文件只不过是一个XML文件.根元素是<taglib>,它包含一个或者多个<tag>标签,该元素用来声明定制标签.<taglib>元素中只有<tlib

学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签. jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签 1.内置标签(动作标签): <jsp:forward />转发标签: 语法:<jsp:forward page="

12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service(ServletRequest,ServletResponse) destory() 1.2回话技术 cookie:浏览器端 (服务器需要浏览器保存少量的数据) 服务器创建对象:new Cookie(name,value) cookie.setMaxage(秒);  有效时间 cookie.setMaxage(0)  删除cookie cookie.setP

javaEE(6)_自定义标签&amp;JSTL标签(JSP Standard Tag Library)

一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现Tag接口的Java类(标签处理器类). •编写标签库描述符(tld)文件,在tld文件中对标签处理器类进行描述. 3.快速入门:使用标签输出客户机IP //java类 public class ViewPortTag extends TagSupport{ @Override public int

自定义JSTL函数标签(一)

jstl标签库的配置 * 将jstl.jar和standard.jar拷贝到WEB-INF/lib下(如果使用el表达式,不用拷贝这两个jar) 注意:jstl必须在能够支持j2ee1.4/servlet2.4/jsp2.0版本上的容器才能运行,这个环境       是目前较为常用的环境 标签库的使用 * 采用taglib指令引入 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

18、EL表达式、JSP标签、JSTL标签、自定义标签

EL表达式 jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>. 以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码. 使用EL表达式替换掉jsp表达式 EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!! 语法: ${变量或表达式} EL语法 1 输出基本数据类型变量 从四个域获取 ${name} 指定域获取 ${pageScope.name} 域范围: pageScoep / requestScope / sessionSco