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的功能
- 【JSTL】JSTL 标签库
- 【JSTL】标准标签库JSTL
- JSTL&EL JSTL标签库
- JSTL 核心标签库标签
- JSTL 核心标签库标签
- JSTL标签库,自定义标签
- JSTL标签库 fn标签
- JSTL标签库 fmt标签
- jstl库标签核心标签
- JSTL标签库:out标签
- JSTL 标签 ------ 核心标签库
- JSTL 标签库介绍
- JSTL标签库
- JSTL标准标签库
- JSTL标准标签库
- JSTL核心标签库
- jstl 函数标签库
- JSTL标签库
- GNS3+SecureCRT使用方法
- 编译及eclipse问题,舞步学院自己的见解
- 在Android studio安装Generate GsonFormat插件
- cf C. Hacker, pack your bags!
- poj2398-Toy Storage 玩具放入纸盒升级版
- JSTL标签库
- CSS3知识点总结
- Springboot的定时器使用
- Storm1.1.0<消息的可靠性机制>
- 前端页面弹框遮罩禁止页面滚动
- 【android】使用部分模拟器出现兼容问题Error inflating class EditText
- Info.plist 权限设置
- POJ 2398 Toy Storage(二分加折线拐向)
- 黑莓,还有多少情怀尚存?