JSTL 简介
JavaServer Pages Standard Tag Library由JCP(Java Community Process)指定标准
提供给 Java Web 开发人员一个标准通用的标签函数库
和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性
JSTL1.1安装
下载
JSTL 主要由Apache组织的Jakarta Project 实现
http://tomcat.apache.org/taglibs/standard/
容器必须支持Servlet 2.4 且JSP 2.0 以上版本
JavaEE1.4
安装
解压缩后将lib 中的jstl.jar、standard.jar 复制到WEB应用程序的WEB-INF\lib 下
1.核心标签库(core)
<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
<h1>HTML转义输出</h1><hr> <a href="#">xxx</a> <c:out value="<a href=‘#‘>xxx</a>" ></c:out> ${fn:escapeXml(‘<a href="#">xxx</a>‘) } <h1>输出默认值</h1><hr> <% String addr = "西二旗"; //pageContext.setAttribute("addr",addr); %> <c:out value="${addr}" default="北京"></c:out> ${addr == null?"北京" : addr } <h1>输出变量</h1><hr> <% String name = "无双"; pageContext.setAttribute("name",name); %> <c:out value="${name}"></c:out> ${name } <h1>输出常量</h1><hr> <c:out value="阿斯蒂芬"></c:out> ${"啦啦啦啦" }
<c:set>标签用于设置、修改域中的属性和值,默认的域是page
或者设置、修改Web域中的Map的键和值,或JavaBean的属性值。
<h1>修改域中的JavaBean的属性的值</h1><hr> <% Person p = new Person(); pageContext.setAttribute("p",p); %> <c:set target="${p}" property="name" value="克林顿"></c:set> ${p.name } <h1>设置或修改域中的Map的值</h1><hr> <% Map map = new HashMap(); pageContext.setAttribute("map",map); %> <c:set target="${map}" property="cellphone" value="10010"></c:set> <c:set target="${map}" property="cellphone" value="10086"></c:set> ${map.cellphone } <h1>设置或修改域中的属性值</h1><hr> <c:set var="name" value="韦小宝"></c:set> <c:set var="name" value="阿珂"></c:set>
<c:remove>标签用于删除各种Web域中的属性,如果不写域名,则删除4个域中所有的同名的属性。
<c:remove var="name" scope=”request”/>
<c:catch>标签用于捕获嵌套在<c:catch>标签体中的内容,抛出的异常,
其语法格式如下:<c:catch var="e" >nested actions</c:catch> 将捕获的异常对象以e为的名字,存放到page域中,再利用el表达式, ${e.message} ,页面就会显示出异常信息。
<c:catch var="e"> <% int i = 1/0; %> </c:catch> ${e.message }
*<c:if test=“$(2>1)”>标签可以构造简单的“if-then”结构的条件表达式
test后接一个el表达式,el返回值为boolean类型,若为true,则执行标签体中的内容。想达到if-else的目的,只能在写一次c:if,将条件取反。
<c:if test="${2>1}"> 确实是这样的.... </c:if> <c:if test="${2<=1}"> 你确定吗? </c:if>
*<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<c:choose> <c:when test="${count == 0}"> 对不起,没有符合您要求的记录。 </c:when> <c:otherwise> 符合您要求的记录共有${count}条. </c:otherwise>
*<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
<h1>实验:遍历10到100的偶数,如果数字所在的位置是3的倍数,显示成红色</h1><hr> <c:forEach begin="10" end="100" step="2" var="i" varStatus="stat"> <c:if test="${stat.count % 3 == 0}"> //count表示当前数字的总数 index自然数的位置 <font color="red"> ${i } </font> </c:if> <c:if test="${stat.count % 3 != 0}"> <font color="blue"> ${i } </font> </c:if> </c:forEach> <h1>循环执行指定的内容若干次</h1><hr> <c:forEach begin="0" end="10" step="2" var="i" > ${i }, //0,2,4,6,8,10, </c:forEach> <h1>遍历Map中的数据</h1><hr> <% Map map = new LinkedHashMap(); map.put("name","曹操"); map.put("age","59"); map.put("wife","小乔"); map.put("gender","男"); pageContext.setAttribute("map",map); %> <c:forEach items="${map}" var="entry" > //entry存放的是一对键值 ${entry.key } : ${entry.value }<br> </c:forEach> <h1>遍历集合中的数据</h1><hr> <% List list = new ArrayList(); list.add("美国"); list.add("中国"); list.add("俄罗斯"); list.add("印度"); list.add("巴西"); pageContext.setAttribute("list",list); %> <c:forEach items="${list}" var="c"> ${c }<br> </c:forEach> <h1>遍历数组中的数据</h1><hr> <% String city = {"北京","上海","广州","铁岭","葫芦岛"}; pageContext.setAttribute("city",city); %> <c:forEach items="${city}" var="c"> ${c }<br> </c:forEach>
*<c:forTokens>切割字符串,将切好的字符串对象存在数组了,遍历数组的字符串对象。
<c:forTokens items="www.itheima.com" delims="." var="str"> ${str }<br> //str表示数组中的一个字符串对象 </c:forTokens> //wwwitheimacom
<c:import> 标签,实现include操作
<c:import url="/index.jsp" var="p" scope="page"></c:import> //将index.jsp内容,作为对象p 存到当前页面的page域中,方便引用。
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
<% String url = response.encodeURL(request.getContextPath()+"/index.jsp"); %> <a href="<%= url %>">hhhh</a> <c:url value="/index.jsp" context="${pageContext.request.contextPath}" var="url" scope="page"></c:url> <a href="${url }">xxx</a>
<c:redirect>标签用于实现请求重定向
<c:redirect url="/index.jsp" context="${pageContext.request.contextPath}"> <c:param name="name" value="zhang"></c:param> </c:redirect>
<c:param>标签 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
自定义标签技术:
传统标签:
(1)写一个类实现Tag接口 javax.servlet.jsp.tagext.Tag
(2)写一个tld文件,描述写好的类
tld文件放在WEB-INF文件夹下(除classes和lib以外)。tld文件的schemaLocation不对,要修改为,也就是把前面的地址复制一下粘贴到后面的地址再加个/
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
(3)在jsp页面中引入tld文件,就可以在jsp页面中使用自定义标签了
生命周期:
第一次自定义标签被访问的时候产生对象,驻留在内存中,随着web应用的销毁而销毁。
执行过程:
setPageContext getParent dastart doend releast
特点:
分为doStartTag 和 doEndTag方法来分别处理发现开始标签和发现结束标签时的代码,在doStartTag可以通过返回值来控制标签体是否允许执行,在doEndTag方法里可以通过返回值控制标签之后的剩余页面是否允许执行
传统标签的这种开发方式,需要我们分析发现开始标签和发现结束标签时都需要执行什么代码,还需要分析到底要返回什么样的标签体控制程序执行,相对来说相当的繁琐。
简单标签:
(1)写一个类实现SimpleTag接口(继承SimpleTag接口的默认实现类SimpleTagSupport)
(2)写一个tld文件,描述写好的类
(3)在jsp页面中引入tld文件,就可以在jsp页面中使用自定义标签了
生命周期+执行过程
1.当jsp在执行的过程中,每当遇到一个简单标签时,都会创建一个处理类对象.
2.调用setJspContext传入当前jsp页面的PageContext对象.
3.如果当前标签有父标签则调用setParent方法将父标签传入,如果没有父标签则这个方法不会被调用.
4.如果该标签具有属性,调用属性的setXXX方法将属性的值传入
5.如果当前标签具有标签体,则会调用setJspBody将封装了标签体信息的JspFragment传入,如果没有标签体,这个方法不执行
6.最后调用doTag方法,在这个方法里我们可以书写处理标签事件的java代码
7.当自定义标签执行完成后,简单标签对象就销毁掉了.
要实现的功能:
控制标签体是否执行<c:if>
控制标签之后的内容是否执行
控制标签体重复执行<c:foreach>
修改标签体后输出<c:out>
为自定义标签来增加一个属性:
在标签处理类中增加一个javabean属性,这个属性就是要增加的标签的属性,并对外提供setXXX方法。
在tld文件中这个标签的描述中描述一下该属性
*想要开发一个简单标签,
写一个类继承SimpleTagSupport覆盖doTag方法就可以了,可以调用getJspContext/getJspBody来获取需要的内容
*在tld文件中对标签进行描述
<tlib-version>1.0</tlib-version>
<short-name>MyTag</short-name> //标识tld文件
<uri>http://www.itheima.com/MyTag</uri>
<tag>
<name>simpleDemo1</name> //标签的名字
<tag-class>com.itheima.simletag.SimpleDemo1</tag-class> //标签的处理类
<body-content>scriptless</body-content>
//标签体的类型 JSP(简单标签不能写) Scriptless(任意的jsp内容,不包括java代码) empty(空标签) tagdependent(标签体是给后台用的,一般不用这种类型)
<attribute> //声明一个属性,可以声明多个属性
<name>times</name> //属性的名字
<required>true</required> //是否为必须存在的属性
<rtexprvalue>true</rtexprvalue> //是否支持el表达式
<type>int</type> // 属性的java类型
</attribute>
</tag>
自定义标签开发_案例
自定义标签打jar包
1、新建一个java工程,Exec
2、将继承SimpleTagSupport的java类复制到src目录下
3、工程名 - 右键 - build path - configure build path - libraries - add library
- myeclipes library - javaEE 5 libraries
4. 工程名 右键新建文件夹META-INF 文件夹
5. 将tld文件放入WEB-INF文件夹下
6. 工程名 右键-Export - jar - JAR file - 勾选要打包的工程 - 选好保存的路径
IFTag.java
public class IFTag extends SimpleTagSupport { private boolean test; public void setTest(boolean test) { this.test = test; } @Override public void doTag() throws JspException, IOException { if(test){ getJspBody().invoke(null); } } }
Exec.tld
<tlib-version>1.0</tlib-version> <short-name>exec</short-name> <uri>http://www.itheima.com/exec</uri> <tag> <name>if</name> <tag-class>com.itheima.exec.IFTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>boolean</type> </attribute> </tag>
exec.jsp
<exec:if test="${3>2}"> 确实是这样的! </exec:if> <exec:if test="${3<=2}"> 你确定吗? </exec:if> 、