• 自定义标签 与 JSTL(JSP Standard Tag Library)


    1.自定义标签 【理解】
        [1]简介   
            > 在JSP2.0以后,在jsp页面中不建议使用脚本片段<% %>和JSP表达式<%= %>
            > 使用EL来替换的JSP表达式
            > 使用标签来替换脚本片段
            > 在JSP中已经为我们提供了很多的诸如:<jsp:forward page=""></jsp:forward>
                这样的JSP动作标签,这些标签最终在被翻译的时候都会被转换为一段Java代码
            > 标签就是以标签的形式去调用Java程序   
            > 但是JSP的动作标签并不能满足我们的全部需求,所以我们还需要去自定义标签
            > 多个自定义标签就组成了一个自定义标签库
            > 每一个自定义标签的背后都有一个标签处理器类去支持他的功能
     
        [2]使用步骤
            1.创建标签处理器类
                - 创建一个标签处理器类,要求我们要实现SimpleTag接口
                    void doTag() --> 标签处理器类中的主要方法,每次标签执行时,doTag()方法都会被调用
                    JspTag getParent() --> 获取当前标签的父标签
                    void setParent(JspTag parent) --> 设置当前标签的父标签,由服务器调用
                    void setJspBody(JspFragment jspBody) --> 设置标签的标签体,该方法由服务器调用,用来设置当前标签的标签体
                    void setJspContext(JspContext pc) --> 设置PageContext,PageContext可以用来获取jsp中的其他隐含对象
     
                - 我们说实现SimpleTag接口时,所有方法我们都需要去实现,而这些实现大部分都是重复,
                    所以我们真实使用时,一般不会直接实现该接口,而是通过继承SimpleTagSupport的方式去创建一个标签处理器类。
                - SimpleTagSupport中已经实现类SimpleTag中的所有方法,我们只需要重写doTag()方法即可,
                    其他的JspContext,标签体,父标签,都可以直接去调用相应的get方法即可
     
            2.在服务器中注册标签处理器类(tld文件)
                - 编写tld文件(标签库的描述文件),实际上它就是一个xml文件,只是他扩展名是tld
                - tld文件需要编写在WEB-INF目录下
                - 标签库的描述信息:
                    <!-- 标签库的配置信息 -->
                    <tlib-version>1.0</tlib-version>
     
                    <!-- 标签的短名,标签的前缀 -->
                    <short-name>a</short-name>
     
                    <!-- 标签库的唯一标识 -->
                    <uri>http://www.bdp.com/taglib/a</uri>
     
                - 自定义标签的描述信息:
                    <!-- 具体标签的配置信息 -->
                    <tag>
                        <!-- 标签的名字,通过标签名来使用标签 -->
                        <name>MyTag</name>
     
                        <!-- 标签的全类名 -->
                        <tag-class>com.bdp.taglib.MyTag</tag-class>
     
                        <!-- 标签体的类型 -->
                        <body-content>empty</body-content>
                    </tag>
     
                - body-content
                    - 用来设置标签体的类型,四个可选值:
                        1.empty 表示标签没有标签体,是一个自结束标签
                        2.scriptless 表示当标签体中的内容是一个EL表达式时,服务器会自动解析EL表达式
                        3.JSP 表示标签体可以是一个JSP脚本片段
                        4.tagdependent 表示当标签体是一个EL表达式时,服务器将不会解析
                    - 结论:
                        一般情况下,如果是一个自结束标签,则使用empty
                            如果有标签体则使用scriptless
     
                - 如果标签中有属性,则在tag标签中还需要做如下的配置:
                    <attribute>
                        <name></name>
                        <required></required>
                        <rtexprvalue></rtexprvalue>
                    </attribute>
     
                    name:属性名
                    required:属性是否是必须的,如果是必须则设置true,否则设置false
                    rtexprvalue:如果属性值是一个EL表达式是否自动解析,两个值true则自动解析,false则不解析
     
            3.在页面引入标签库
                <%@ taglib prefix="a" uri="http://www.bdp.com/taglib/a" %> 
                uri:和标签库uri一致,标签库的唯一标识,通过uri来导入指定的标签库
                prefix:标签的前缀,可以随便写,但是我们习惯和short-name一致
     
     
    2.JSTL(JSP Standard Tag Library)
        [1] JSTL简介
            > JSTL是JSP的标准标签库
            > JSTL为我们提供了一些常用的标签,供我们日常开发使用(if 、 if...else 、遍历 、 日期格式化)
            > 标签库
                - core :核心标签库
                    - 核心标签库是我们JSTL中最常用的一个标签库,它里面封装很多常用的功能
                    - 核心标签库又称为c标签
     
                - fn :函数标签库
                    - 函数标签库中主要定义了一些字符串相关的方法,函数标签库需要结合EL表达式一起使用
     
                - fmt :格式化标签库(国际化标签库)
                    - 对日期和数字进行格式化(国际化)操作
                    - 2016/1/18 1/18/2016   1000  1,000
     
                - sql : 数据库标签库   
                    - 在jsp中操作数据库的标签。已淘汰
     
                - xml : xml标签库   
                    - 在jsp解析xml的标签。已淘汰
     
            > 使用JSTL需要先导入两个jar包:
                - taglibs-standard-impl-1.2.1.jar
                - taglibs-standard-spec-1.2.1.jar
     
        [2] 核心标签库   
            - 在页面中引入核心标签库:
                <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
            - 使用:
                out
                    作用:将一个对象输出的页面中
                    参数:
                        value:要输出的内容,可以是一个EL表达式
                        default:当value属性为空时,要显示的内容(默认值)
                        escapeXml:是否自动转义特殊字符,默认值为true,自动转义
     
                    例子:
                        <c:out value="${code }" default="sunwukong" escapeXml="true" ></c:out>
     
                set
                    作用:向域中设置一个属性
                    参数:
                        var:属性名
                        value:属性值
                        scope:要将属性放入到的域中,可选值:page request session application
                            如果不写,默认是page
                    例子:
                        <c:set var="username" value="sunwukong" scope="request" ></c:set>
     
     
                remove
                    作用:移除域中的指定属性
                    参数:
                        var:要移除的属性的属性名
                        scope:要移除属性的域,可选值:page request session application
                            如果不指定,则移除四个域中属性
                    例子:
                        <c:remove var="username" scope="session"></c:remove>
     
                if
                    作用:可以java中的if类似
                    属性:
                        test:test需要一个布尔值,如果值为true,则执行标签体,否则不执行
                    例子:
                        <c:if test="${empty param.username}">请输出用户名!</c:if>
     
     
                choose when otherwise
                    作用:和if else 类似
                        choose有两个子标签,when otherwise,when和otherwise必须做完choose的子标签出现,不能单独使用。
                        在choose可以指定多个when标签,但是只能指定一个otherwise,
                            多个when标签只会有一个执行,如果when都不满足条件,则执行otherwise。
                    例子:
                        <c:choose>
                            <c:when test="${param.score==100 }">
                                <h3>恭喜您,考了100分!</h3>
                            </c:when>
                            <c:when test="${param.score >= 90 }">
                                <h3>您的分数是A!</h3>
                            </c:when>
                            <c:otherwise>
                                <h3>恭喜你,没及格!</h3>
                            </c:otherwise>
                        </c:choose>
     
     
                forEach
                    作用1:可以遍历一组数
                    属性:
                        begin:遍历的开始位置,注意不能小于0
                        end:遍历的结束位置
                        var:指定一个变量名
                        step(可选):指定遍历时的步长(每次自增的长度)
                    例子:
                        <c:forEach begin="1" end="10" step="1" var="index">
                            ${index}
                        </c:forEach>
     
                    作用2:可以遍历集合
                        属性:
                            items:指定要遍历的集合,需要一个EL表达式
                            var:指定一个变量名
                            varStatus:遍历状态,获取当前元素遍历的状态(index count first last)
                        例子:
                            <c:forEach items="${list }" var="hero">
                                ${hero} <br />
                            </c:forEach>
     
                            <c:forEach items="${list }" var="hero" varStatus="vs">
                                ${vs.last }--${vs.first }-${vs.index }---${vs.count }---${hero} <br />
                            </c:forEach>
          *******************************************************************************
              ${vs.index}      输出行号,从0开始。
              ${vs.count}      输出行号,从1开始。
              ${vs.current}   当前这次迭代的(集合中的)项
              ${vs.first}  判断当前项是否为集合中的第一项,返回值为true或false
              ${vs.last}   判断当前项是否为集合中的最后一项,返回值为true或false
              <c:forEach begin='1' end='5' step='2' items='${list}' var='item'>
              begin、end、step分别表示:起始序号,结束序号,跳跃步伐。
          *********************************************************************************  
     
                            注意:遍历Map时,是获取的map中的一个一个键值对,我们可以通过.key获取键,通过.value来获取值
                            <c:forEach items="${map}" var="stu">
                                ${stu.key} --- ${stu.value} <br />
                            </c:forEach>
     
                url
                    作用:用来为绝对路径加上项目名
                    参数:
                        value:要设置的绝对路径
                        var:变量名,如果不指定var,则路径会直接输出,如果指定var,则路径会放入到page域中
                    例子:
                        <c:url value="/index.jsp" var="url">
                            <c:param name="username" value="sunwukong"></c:param>
                            <c:param name="age" value="18"></c:param>
                            <c:param name="gender" value="男"></c:param>
                        </c:url>
                    补充:
                        我们可以使用c:param标签在地址后附加请求参数,同时参数中的中文会自动进行url编码
     
                redirect
                    作用:请求的重定向
                    参数:
                        url:指定重定向的目标地址,注意会自动加上项目名,就不要写项目名
                    例子:
                        <c:redirect url="/index.jsp">
                            <c:param name="username" value="sunwukong"></c:param>
                            <c:param name="age" value="18"></c:param>
                            <c:param name="gender" value="男"></c:param>
                        </c:redirect>
                    补充:
                        我们可以使用c:param标签在地址后附加请求参数,同时参数中的中文会自动进行url编码   
     
        [3] 函数标签库   
            - 在页面中引入函数标签库   
                <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   
            - 使用:
                函数标签库需要结合EL表达式一起使用,里边都是一些字符串的相关操作。
            - 例子:
                ${fn:xxxx}
                <!-- fn:contains判断一个字符串是否包含另一个 -->
                ${fn:contains('hello','lO') }  <br />
                <!-- fn:containsIgnoreCase判断一个字符串是否包含另一个,忽略大小写 -->
                ${fn:containsIgnoreCase('hello','lO') }<br />
                <!--fn:escapeXml自动转义特殊字符  -->
                ${fn:escapeXml("<html></html>") }<br />
                <!--fn:join用于将一个String数组转换为一个字符串,第二个参数需要指定一个连接符  -->
                ${fn:join(strs,"@") }<br />
                <!-- fn:split将一个字符串根据指定的字符拆分为一个数组,第二个参数需要指定一个拆分的字符 -->
                ${fn:split("a@b@c@d@e","@")[2] }<br />
                <!-- 将一个字符串转换为大写 -->
                ${fn:toUpperCase("abcdefg") }<br />
                - 具体用法参照alt+/
     
     

    转载请注明出处!

    http://www.cnblogs.com/libingbin/

    感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

  • 相关阅读:
    K8S--架构及基本概念
    虚拟化及云原生的一些概念
    JPA事务中的异常最后不也抛出了,为什么没被catch到而导致回滚?
    OpenFaaS实战之六:of-watchdog(为性能而生)
    OpenFaaS实战之五:大话watchdog
    OpenFaaS实战之四:模板操作(template)
    OpenFaaS实战之三:Java函数
    OpenFaaS实战之二:函数入门
    OpenFaaS实战之一:部署
    Python
  • 原文地址:https://www.cnblogs.com/libingbin/p/5978159.html
Copyright © 2020-2023  润新知