JSTL标签详解以及应用实例
JSTL
Apache提供的标签库,jar包:jstl-1.2.jar,如果用MyEclipse,它会自动导入,无需自己导入,如果没有使用MyEclipse那么需要自行导入。
------------------
导入JSTL核心标签库
<%taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<c:set>
* <c:set var="a" value="hello"/> 创建名为a,值为hello的域属性,范围:page
* <c:set var="a" value="hello" scope="session"/> 范围为session
<c:out>
* <c:out value="aaa"/> 输出字符串aaa
* <c:out value="${aaa"/> 输出域属性aaa,其中与${aaa}相同
* <c:out value="${aaa}" default="xxx"/>如果${aaa}不存在,那么输出xxx字符串
* <c:out value="${aaa}" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击
<c:remove>
* <c:remove var="a"/> 删除名为a的域属性
* <c:remove var="a" scope="page"/> 删除page域中名为a的域属性
<c:url>
* <c:url value="/AServlet"/> 输出URL:/项目名/AServlet
* <c:url value="/AServlet" var="url" scope="page"/> 把生成的url保存到page域中,而不会输出
* <c:url value="/AServlet">:输出URL:/项目名/AServlet?username=%xx%xx%xx%xx%xx%xx,其中张三会被URL编码
<c:param name="username" value="张三"/>
</c:url/>
<c:if>
* <c:if test="${条件}"> 当条件为true时执行标签体内容
hello
</c:if>
<c:choose>
* <c:choose>
<c:when test="${条件1}">a</c:when>
<c:when test="${条件2}">b</c:when>
<c:when test="${条件3}">c</c:when>
<c:otherwise>d</c:otherwise>
</c:choose>
等同与:
if() {
} esle if() {
} esle if() {
} else if() {
} else {
}
<c:forEach>
可以用来遍历数组、List、Map、
1. 计数循环
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
等同于
for(int i = 1; i <= 10; i++) {
out.println(i);
}
<c:forEach begin="1" end="10" var="i" step="2">
${i}
</c:forEach>
等同于
for(int i = 1; i <= 10; i+=2) {
out.println(i);
}
2. 遍历数组
<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item " items="${ns } ">
<c:out value="name: ${item } "/><br/>
</c:forEach>
3. 遍历List
<%
List<String> names = new ArrayList<String>();
names.add("zhangSan");
names.add("liSi");
names.add("wangWu");
names.add("zhaoLiu");
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
<c:out value="name: ${item }"/><br/>
</c:forEach>
4. 遍历Map
<%
Map<String,String> stu = new LinkedHashMap<String,String>();
stu.put("number", "N_1001");
stu.put("name", "zhangSan");
stu.put("age", "23");
stu.put("sex", "male");
pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item " items="${stu }">
<c:out value="${item.key }: ${item.value } "/><br/>
</c:forEach>
5. 循环状态对象
循环状态对象是用来说明循环的状态的,属性如下:
count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前项目。
<c:forEach var="item" items="${ns }" varStatus="vs" >
<c:if test="${vs.first } ">第一行:</c:if>
<c:if test="${vs.last } ">最后一行:</c:if>
<c:out value="第${vs.count } 行: "/>
<c:out value="[${vs.index } ]: "/>
<c:out value="name: ${vs.current } "/><br/>
</c:forEach>
导入JSTL格式化标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
Date date = new Date();
pageContext.setAttribute("d", date);
%>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss "/>
<%
double d1 = 3.5;
double d2 = 4.4;
pageContext.setAttribute("d1", d1);
pageContext.setAttribute("d2", d2);
%>
<fmt:formatNumber value="${d1 }" pattern="0.00 "/><br/>
<fmt:formatNumber value="${d2 }" pattern="#.## "/>
* pattern:0.00,表示小数不足两位时,使用0补足两位
* pattern:#.##,表示小数不足两位时,有几位显示几位,不会补足
示例代码:
<%@ page language="java" import="java.util.*,cn.yzu.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<!-- JSTL标签以及EL表达式的使用与区别 -->
<!-- 输出标签 -->
<%
request.setAttribute("a", "<font color='red'>aaaaa</font>");
request.setAttribute("b", null);
%>
${a}
<c:out value="a"/>
<c:out value="${a}"/><br>
<c:out value="b" default="bbbbb"></c:out><br> <!-- 如果b为空,输出default内容 -->
<c:out value="${a}" escapeXml="false"/><hr> <!-- 转义,默认的true --> <!-- 在域中设置值,默认是pageScope -->
<c:set var="c" value="ccccc"/>
<c:set var="d" value="ddddd" scope="request"/>
<c:out value="${pageScope.c}"/>
<c:out value="${d}"/><hr> <!-- 删除域中的值,默认是删除所有域中的值,如下例是删除所有域中的键为e的元素 -->
<c:remove var="e"/>
<c:remove var="c" scope="page"/>
<c:out value="${pageScope.c}"/><hr> <!-- URL标签 -->
<c:url value="/"/> <!-- 输出项目名,加/ -->
${pageContext.request.contextPath }<br><!-- 输出项目名,不加/ -->
<!-- 下面两个可以达到一样的效果 -->
<c:url value="/AServlet"/>
${pageContext.request.contextPath }/AServlet<br>
<c:url value="/AServlet">
<c:param name="username">张三</c:param><!-- 可以为URL增加参数 -->
</c:url>
<c:url value="/AServlet" var="f" scope="page"/><br> <!-- 将地址赋给page域的f -->
<c:out value="${f}"/>
<!-- 下例相当于<a href="/webBegin/index.jsp">重新请求本页面</a> -->
<a href="<c:url value='/index.jsp'/>">重新请求本页面</a><hr> <!-- if,choose选择标签 -->
<c:set var="g" value="87"/>
<c:if test="${g>=0&&g<=100 }">
你得了${g }分
</c:if>
<c:choose>
<c:when test="${g>=85}">成绩优秀</c:when>
<c:when test="${g>=60}">成绩及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose><hr> <!-- 循环遍历标签 -->
<c:forEach begin="1" end="10" step="2" var="h">
${h }
</c:forEach><br>
<%
String str[]={"one","two","three"};
request.setAttribute("str", str);
%>
<c:forEach items="${str}" var="nstr"> <!-- 注意,items="${str}"千万不可写成items="${str} ",后面不可有空格 -->
${nstr }
</c:forEach><br>
<c:forEach items="${str}" var="nstr" varStatus="vs">
${vs.count }:${nstr }
</c:forEach><hr> <!-- 格式化标签 -->
<%
request.setAttribute("date", new Date());
request.setAttribute("m", 3.1415);
%>
<fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/><br>
<fmt:formatNumber value="${m }" pattern="0.000"/><br>
<fmt:formatNumber value="${m }" pattern="0.00000"/><br><!-- 四舍五入保留五位小数,小数不足时,使用0补足两位 -->
<fmt:formatNumber value="${m }" pattern="#.#####"/><br><!-- 四舍五入保留五位小数,小数不足时,不补足 -->
</body>
</html>
index.jsp
运行结果:

补充:自定义标签
1. 步骤
* 标签处理类(标签也是一个对象,那么就需要先有类!)
* tld文件,它是一个xml
* 页面中使用<%@taglib%>来指定tld文件的位置
2. 标签处理类
SimpleTag接口:
* void doTag():每次执行标签时都会调用这个方法;
* JspTag getParent():返回父标签(非生命周期方法)
* void setParent(JspTag):设置父标签
* void setJspBody(JspFragment):设置标签体
* void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext
其中doTag()会在其他三个方法之后被tomcat调用。
3. 配置tld文件
tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!
<tag>
<name>myTag1</name> 指定当前标签的名称
<tag-class>cn.itcast.tag.MyTag1</tag-class> 指定当前标签的标签处理类!
<body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签!
</tag>
4. 页面中指定tld文件位置
<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
导标签库,就是为页面指定tld文件的位置!
标签体内容
* empty:无标签体!
* JSP:jsp2.0已经不在支持这个类型了!表示标签体内容可以是:java脚本,可以是标签,可以是el表达式
* scriptless:只能是EL表达式,也可以是其他的标签!
* tagdependent:标签体内容不会被执行,而是直接赋值标签处理类!
不在执行标签下面内容的标签!
在标签处理类中的doTag()中使用SkipPageException来结束!
Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!
标签属性
步骤:
1. 给你的标签处理类添加属性!
为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。
2. 在tld文件中对属性进行配置
<attribute>
<name>test</name> 指定属性名
<required>true</required> 指定属性是否为必需的
<rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL
</attribute>
JSTL标签详解以及应用实例的更多相关文章
- jsp页面中jstl标签详解
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- 【转】jsp页面中jstl标签详解
原文地址: JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实 ...
- jstl标签详解 (转载)
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- jsp页面中jstl标签详解[转]
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- Java jsp页面中jstl标签详解
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- 引用 struts2标签详解 - wo的的日志 - 网易博客
引用 元元 的 struts2标签详解 引用 COLD 的 struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@t ...
- Mybatis批量insert 返回主键值和foreach标签详解
Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...
- route命令详解与使用实例 ,同时访问内外网
route命令详解与使用实例 2011-10-18 12:19:41| 分类: 其他 | 标签:route |字号 订阅 1. 使用背景 需要接入两个网络,一个是部署环境所在内 ...
- 官网实例详解-目录和实例简介-keras学习笔记四
官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras 版权声明: ...
随机推荐
- DNS基础及域名系统架构
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- Linux下安装Scala
Linux下安装Scala和Windows下安装类似,步骤如下: 首先访问下载链接:http://www.scala-lang.org/download/默认这里下载的是Windows版本,这时点击上 ...
- SolrCloud环境配置
Solr是一个企业级搜索服务器,对外提供Web-Service接口,用户可以通过http请求,向搜索引擎提交xml或者json格式的数据,生成索引:然后可以通过http get请求查找,获取返回的xm ...
- Django~automated tests
def xx(): 冒号下一行要缩进 ATD http://blog.csdn.net/doupei2006/article/details/7657547 http://www.jb51.net/a ...
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- Mybatis 学习笔记1
---恢复内容开始--- 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...
- eclipse maven新建springMVC项目(原创)
1.配置eclipse maven 2.新建maven项目 3.新建src/main/java,更新pom <project xmlns="http://maven.apache.or ...
- poj 3461Oulipo
题目链接:http://poj.org/problem?id=3461 统计字符串出现的次数 #include<cstdio> #include<iostream> #incl ...
- hdu 5108 Alexandra and Prime Numbers
数论题,本质是求出n的最大质因子 #include<time.h> #include <cstdio> #include <iostream> #include&l ...
- 四、优化及调试--网站优化--SEO在网页制作中的应用
SEO分类:白帽SEO.黑帽SEO 白帽SEO: 内容上的SEO: 网站标题.关键字.描述 网站内容优化 Robot.txt文件 网站地图 增加外链引用 前端SEO: 网站结构布局优化 扁平化结构(一 ...