JSTL标签库

来源:互联网 发布:极光世界辅助软件 编辑:程序博客网 时间:2024/06/17 20:12

一.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的功能

原创粉丝点击