JSTL 简介 JavaServer Pages Standard Tag Library由JCP(Java Community Process)指定标准 提供给 Java Web 开发人员一个标准通用的标签函数库 和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性
JSTL1.1安装 下载 JSTL 主要由Apache组织的Jakarta Project 实现 http://tomcat./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”对象中。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | < 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的属性值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | < 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个域中所有的同名的属性。 1 | < c:remove var = "name" scope=”request”/>
|
<c:catch>标签用于捕获嵌套在<c:catch>标签体中的内容,抛出的异常, 其语法格式如下:<c:catch var="e" >nested actions</c:catch> 将捕获的异常对象以e为的名字,存放到page域中,再利用el表达式, ${e.message} ,页面就会显示出异常信息。 1 2 3 4 5 6 | < 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,将条件取反。 1 2 3 4 5 6 | < 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” 的复杂条件判断结构。 1 2 3 4 5 6 7 | < c:choose >
< c:when test = "${count == 0}" >
对不起,没有符合您要求的记录。
</ c:when >
< c:otherwise >
符合您要求的记录共有${count}条.
</ c:otherwise >
|
*<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | < 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>切割字符串,将切好的字符串对象存在数组了,遍历数组的字符串对象。 1 2 3 | < c:forTokens items = "www." delims = "." var = "str" >
${str }< br > //str表示数组中的一个字符串对象
</ c:forTokens > //wwwitheimacom
|
<c:import> 标签,实现include操作 1 2 | < c:import url = "/index.jsp" var = "p" scope = "page" ></ c:import >
//将index.jsp内容,作为对象p 存到当前页面的page域中,方便引用。
|
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面 1 2 3 4 5 6 | <%
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>标签用于实现请求重定向 1 2 3 | < 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./xml/ns/j2ee http://java./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./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 1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < tlib-version >1.0</ tlib-version >
< short-name >exec</ short-name >
< uri >http://www./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 1 2 3 4 5 6 7 | < exec:if test="${3>2}">
确实是这样的!
</ exec:if >
< exec:if test = "${3<=2}" >
你确定吗?
</ exec:if >
、
|
|