JSTL标签库

一.Apache Tomcat安装JSTL 库步骤如下:

从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下载jakarta-taglibs-standard-1.1.2.zip 包并解压,将jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。

二.JSTL的使用

1.首先需要在JSP页面导入JSTL标签库

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

这个就是JSTL的标签库,每次写页面功能的时候,只需要导入这个包就可以了
2.常用JSTL标签
(1).foreach

<c:forEach var="j" begin="0" end="10" step="2">

        <c:out value="${j}"/>

    </c:forEach>

这里使用foreach来循环遍历,”j”为相当于Java代码里的int j,begin=“0”说明起始位置是0,end=“0”,相当于j<=10,step=“2”相当于循环增量,也就是每一次自加2,如果用Java代码呈现
相当于

for (int j = 0; j <=10 ; j+=2) {
            System.out.println(j);
}

利用foreach标签,我们可以直接在JSP页面进行循环遍历,而且不会出现java代码

<%
        String[] names = {"老大","老二","老三","老四"};
        pageContext.setAttribute("names",names);
%>

    <br/>
    <%--就是增强for循环--%>
    <c:forEach var="name" items="${names}">
        <c:out value="${name}"/>
        <br/>
    </c:forEach>
    <br/>
    <%--演示varStatus属性--%>
<%
        List data = new ArrayList();
        data.add("一");
        data.add("二");
        data.add("三");
        data.add("四");
        pageContext.setAttribute("data",data);
%>
    <%--varStatus:也是变量表示循环的状态,变量状态变量--%>
    <%--var:是一个变量,表示当次循环的元素--%>
    <c:forEach var="d" items="${data}" varStatus="vs">
        <br/>
        <%--第几次--%>
        <c:out value="${vs.count}"/>
        <%--元素的角标--%>
        <c:out value="${vs.index}"/>
        <%--当前元素的值--%>
        <c:out value="${vs.current}"/>
    </c:forEach>
    <br/>

(2).if标签

 <c:set var="a" value="我并不是null"/>
    <%--test是必须的条件required--%>
    <%--test就是if语句中的(),表示要判断的条件--%>
    <c:if test="${not empty a}">
        <c:out value="${a}"/>
    </c:if>
    <c:choose>
        <c:when test="${a eq 'a'}">aaaa</c:when>
        <c:when test="${a eq 'b'}">bbbb</c:when>
        <c:otherwise>cccc</c:otherwise>
    </c:choose>

如果只需要一个if判断,那么就写一个<c:if></c:if>标签就可以了

<c:choose>标签和<c:otherwise>标签表示的是if else
比如上面写的,第一个是:定义一个a=“我并不是null”
判断的是如果a不为空 那么输出a
转换成Java代码就是

String a = "我并不是null";
if (a!=null){
  return a;
}

上面代码的第二个写的是判断a,
如果a的值是a,那么返回aaaa;
如果a的值是b,那么返回bbbb;
如果都不满足,那么返回cccc;
转换成Java代码就是

  if (a.equals("a")){
       return "aaaa";
  }else if (a.equals("b")){
       return "bbbb";
  }else {
       return "cccc";
  }

使用判断时,标签中的test代表的就是判断条件,必须要写.判断不为空的写法是${not empty a}
(3).set/out标签

    <c:set var="user" value="张三"/>

向域中设置属性,这里没写scope属性,默认设置到pageContext中

    <c:set var="user" value="request" scope="request"/>
    <c:set var="user" value="session" scope="session"/>
    <c:set var="user" value="application" scope="applicatio    

value属性,表示要输出到浏览器的内容
如果直接写user,会将user作为字符串直接输出

<c:out value="user"/>
<%--使用el表达式,找到域中的变量uesr--%>
<%--EL表达式会得到变量user的值--%>
<%--将user的值作为内容输出--%>
<c:out value="${user}"/>
<%--找不到value中的EL表达式要找的属性的时候,输出default中的内容--%>
<%--如果default中也找不到的话,输出空的字符串--%>
<c:out value="${u}" default="找不到u"/>

<c:set var="code" value="<script>alert('弄啥嘞????');</script>"/>
<%--删除所有域中的user变量--%>
<%--<c:remove var="user"/>--%>
<%--删除pageContext中的user变量--%>
<c:remove var="user" scope="page"/>

<c:out value="${user}" default="我是remove"/>

<%--escapeXML属性,表示是否将<.等字符转义--%>
<%--在out标签中,默认为escapXML为true--%>
<%--<c:out value="${code}" escapeXml="false"/>--%>

(4).url

    <a href="/setout.jsp">普通url</a>

url的value属性接受一个路径
url标签会在这个路径前拼接上contextPath,也就是项目名称

    <a href=" <c:url value="/setout.jsp"/>">标签url</a>

url的标签var value两个属性一起用是将value作为值,保存到var这个变量中
将var变量存进scope域中

    <c:url var="url" value="/setout.jsp" scope="page"/>
    <br/>
    <c:out value="${url}"/>

(5).自定义标签
首先需要在WEB-INF路径下创建一个文件夹,名字为tlds,在tlds文件夹下创建后缀名为tld的配置文件,也就是xml->JSP tag
配置文件路径
创建好之后需要配置一下,在uri的下面打出<tag> 之后会自动生成底下的标签,只需要将值填好即可

<tlib-version>1.0</tlib-version>
    <short-name>ts</short-name>
    <uri>http://mytag.com</uri>
    <tag>
        <name>tag</name>
        <tag-class>jstl.TestTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>
    <tag>
        <name>skipTag</name>
        <tag-class>jstl.SkipTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>skip</name>
        </attribute>
    </tag>

<short-name>里面需要写一个简写,使用的时候就是标签头里面的名字这里设置为ts,<tag-class> 里面需要调用方法的java文件
body-content的值有下面4种:

<xsd:enumeration value="tagdependent"/>
<xsd:enumeration value="JSP"/>
<xsd:enumeration value="empty"/>
<xsd:enumeration value="scriptless"/>

tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释,
如下:

<test:myList>
select name,age from users
</test:myList>

JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。如:

<my:test>
    <%=request.getProtocol()%>      // ②
</my:test>

具体可参考后面附源码。

empty:空标记,即起始标记和结束标记之间没有内容。
下面几种写法都是有效的,

<test:mytag />
<test:mytag uname="Tom" />
<test:mytag></test:mytag>

scriptless:接受文本、EL和JSP动作。如上述②使用<body-content> scriptless </body-content>则报错,具体可参考后面附源码。

配置好属性之后,我们就可以使用自定义标签了
通过taglib导入

<%@ taglib prefix="ts" uri="http://mytag.com" %>

并且在下面调用的时候只要写<ts:/>就可以了

<c:forEach var="j" begin="0" end="3">
    <c:if test="${j==2}">
       <ts:skipTag skip="true"/>
    </c:if>
       <ts:tag>
        ${"你好自定义标签"}
       </ts:tag>
 </c:forEach>

这里调用了ts自定义标签,配置文件里jstl.SkipTag所指向的位于src文件夹下的jstl文件夹下面的SkipTag这个java文件里面的doTag方法
现在展示SkipTag.java

public class SkipTag extends SimpleTagSupport{
    /**
     * 如果未设置该属性为必要属性
     * 当用户未使用这个属性时,这个属性的值为null
     * 在doTage()中使用时,容易空指针异常
     */
    private boolean skip = false;

    public void setSkip(boolean skip) {
        this.skip = skip;
    }

    @Override
    public void doTag() throws JspException, IOException {
        if (skip){
            throw new SkipPageException();
        }
    }
}

后面又调用了ts自定义标签,配置文件里jstl.TestTag所指向的位于src文件夹下的jstl文件夹下面的TestTag这个java文件里面的doTag方法
现在展示TestTag.java

public class TestTag implements SimpleTag{
    private PageContext pageContext;
    //声明一个标签体对象
    private JspFragment jspFragment;
    /**
     * doTag方法,是这个标签真正要做什么事,要干什么都写在这个标签里
     * @throws JspException
     * @throws IOException
     */
    @Override
    public void doTag() throws JspException, IOException {
        JspWriter out = this.pageContext.getOut();

        //jspFragment对象,封装了标签体的内容
        //如果标签有标签体
        //那么在执行doTag()前,服务器会先调用setJSPFragment方法
        //将标签体传到当前这个TestTag中来
        //我们建立了一个成员变量,接收传进来的标签体对象
        //然后在doTag()方法中,使用这个标签体对象JSPFragment

        //invoke方法:标签体调用invoke方法,传入一个输出流
        //这个输出流真实身份就是jsp页面的内置out对象
        //也就是说这个输出流,会将内容输出到jsp页面中
        //JSPFragment调用invoke,就是使用out输出流
        //将JSPFragment标签体中的内容输出到浏览器jsp页面
        this.jspFragment.invoke(out);
        System.out.println("doTag----");

        //抛出SkipPageException
//        throw new SkipPageException();
    }

    /**
     * 如果有父标签,那么会执行这个方法,将父标签传进来
     * @param jspTag
     */
    @Override
    public void setParent(JspTag jspTag) {
        System.out.println("setParent----");
    }

    /**
     * 获得父标签
     * @return
     */
    @Override
    public JspTag getParent() {
        return null;
    }

    /**
     * 服务器会调用这个方法,将PageContext传进来
     * @param jspContext
     */
    @Override
    public void setJspContext(JspContext jspContext) {
        this.pageContext = (PageContext)jspContext;
        System.out.println("setJspContext----");
    }

    /**
     * 如果标签有标签体,服务器会调用这个方法
     * 将标签体传进来
     * @param jspFragment
     */
    @Override
    public void setJspBody(JspFragment jspFragment) {
        this.jspFragment = jspFragment;
        System.out.println("setJspBody----");


    }
}

我们一共在test.tld中配置了两个java文件,调用的时候是tld里面的short-name配合下面tag标签下的name使用,比如<ts:skipTag skip="true"/> 就是使用skiptag的功能,<ts:tag> 就是使用tag的功能

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值