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 版权声明: ...
随机推荐
- SAP系统更改小数点显示问题
在SAP系统中会出现小数点显示的问题,比如123.12,正常情况下是这样显示,但SAP系统是德国的出的系统,德国的书写数字的习惯是将小数点“.”写成“,”逗号,显示为:123,12 这个问题可以使用事 ...
- Python 开发轻量级爬虫04
Python 开发轻量级爬虫 (imooc总结04--url管理器) 介绍抓取URL管理器 url管理器用来管理待抓取url集合和已抓取url集合. 这里有一个问题,遇到一个url,我们就抓取它的内容 ...
- diff & pattch 命令
基础知识 该命令的功能为逐行比较两个文本文件,列出其不同之处.它比comm命令完成更复杂的检查.它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序. 语法:diff ...
- EF-实体更新
1.数据库表增加字段,EF更新视图后,对应的实体对象没有新增的字段原因:edmx文件右键属性设置了 保存时转换相关的文本模板-false...正确的应该是rue 2. 更改视图后(或者更改字段类型?) ...
- 【leetcode】Reverse Linked List(easy)
Reverse a singly linked list. 思路:没啥好说的.秒... ListNode* reverseList(ListNode* head) { ListNode * rList ...
- windows server 2008 配置安装AD 域控制器
工作需要,搞起AD域来,具体配置如下: 配置环境 Windows版本:Windows Server 2008 R2 Enterprise Service Pack 1 系统类型: 64 位操作系统 配 ...
- Split()的简单的用法
1.Split分割一些简答的字符串事例: string str="aaa|bbb|ccc"; string[] list = str.Split('|'); 这是一个字符的切割,但 ...
- osgearth 配置mapNode TerrainOptions
设置瓦片PagedLOD节点最小可视距离因子,默认是6.0 minTileRangeFactor() Map *map = new Map();WWOptions wwImgGlobe;map-> ...
- Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)
,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, , ...
- chaper3_exercise_Uva1585_score
#include<iostream> #include<string> using namespace std; int main(void) { , j = ; string ...