日期: 2016-8-15
内容: JSTL和EL表达式的学习总结
一,来自于博文: http://www.cnblogs.com/o-andy-o/archive/2012/10/24/2737530.html
javascript中小脚本遍历list(之前没有转换成json格式)
<script type="text/javascript" charset="UTF-8">
var productinfo= [
<%List<Map<String, Object>> list = (List<Map<String, Object>>) request
.getAttribute("ProductItem");
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
try {
out.print("{code:\"" + list.get(i).get("PRODUCTCODE")
+ "\",name:\"" + list.get(i).get("PRODUCTNAME")
+ "\"}");
if (i != list.size() - 1) {
out.print(",");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}%>
];
jstl+EL遍历list map array
List:
<c:forEach var="student" items="${sessionScope.list}" varStatus="status">
index:${status.index }<br>
ID:${student.id }<br>
Name:${student.name }<br>
Country:${student.address.country }<br>
City:${student.address.city }<br>
Street:${student.address.street } <br>
</c:forEach>
Map:
<c:forEach var="entry" items="${sessionScope.map}" begin="0" end="4" step="1" varStatus="status" >
index:${status.index }<br>
ID:${entry.key }<br>
Name:${entry.value.name }<br>
Country:${entry.value.address.country }<br>
City:${entry.value.address.city }<br>
Street:${entry.value.address.street }<br>
</c:forEach>
Array:
<c:forEach var="color" items="${sessionScope.colors}">
${color}<br>
</c:forEach>
jstl函数库:
函数 | 描述 |
fn:contains(string, substring) | 如果参数string中包含参数substring,返回true |
fn:containsignorecase(string, substring) | 如果参数string中包含参数substring(忽略大小写),返回true |
fn:endswith(string, suffix) | 如果参数 string 以参数suffix结尾,返回true |
fn:escapexml(string) | 将有特殊意义的xml (和html)转换为对应的xml character entity code,并返回 |
fn:indexof(string, substring) | 返回参数substring在参数string中第一次出现的位置 |
fn:join(array, separator) | 将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。 |
fn:length(item) | 返回参数item中包含元素的数量。参数item类型是数组、collection或者string。如果是string类型,返回值是string中的字符数。 |
fn:replace(string, before, after) | 返回一个string对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果 |
fn:split(string, separator) | 返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素 |
fn:startswith(string, prefix) | 如果参数string以参数prefix开头,返回true |
fn:substring(string, begin, end) | 返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符 |
fn:substringafter(string, substring) | 返回参数substring在参数string中后面的那一部分字符串 |
fn:substringbefore(string, substring) | 返回参数substring在参数string中前面的那一部分字符串 |
fn:tolowercase(string) | 将参数string所有的字符变为小写,并将其返回 |
fn:touppercase(string) | 将参数string所有的字符变为大写,并将其返回 |
fn:trim(string) | 去除参数string 首尾的空格,并将其返回 |
//给遍历赋值,相当于 <% int example = 100+1; %>
<c:set var= "example" value="${100+1}" scope="session" />
<s:set name="personName" value="person.name"/>
//打印变量,相当于 <%=example%>
<c:out value="${example}" default="a default value" escapeXml="true"/>
<s:property value="#personName" default="a default value" /> OGNL的#符号相当与EL的$符号
//从session中移除变量 <% session.removeAttribute("example")%>
<c:remove var= "example" scope="session"/>
//test里面是一个boolean的运算, var里面声明的变量则记录test的结果,scope指明这个变量的存在范围,有4个值,博文的第三点(JSP- 内置对象)
<c:if test= "${ 条件运算 }" var= "varName" scope= "page" />
//条件为true时,执行的代码
</c:if>
<s:if test="%{false}"><div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}"><div>Will Be Executed</div>
</s:elseif>
<s:else> <div>Will Not Be Executed</div>
</s:else>
//items中是遍历的集合变量,var里面声明集合中的单个对象名称为currentBook
<c:forEach var="currentBook" items="${sessionScope.titles}">
…//显示书籍信息
</c:forEach>
<s:iterator value="defaultDimensionItemList" status="st" id="infn">
</s>
循环遍历:
1、在jsp中引入标准函数声明
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2、若要判断集合的大小,则需要引入如下声明
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
3、如何使用jstl判断集合是否为空
${user}为集合,user为集合名
<c:if test="${empty user}">无信息!</c:if>为空
<c:if test="${!empty user}">其它</c:if>非空
json集合判断是否为空:
<c:choose>
<c:when test="${'[null]' == coverageinfo}">//调试了好久,之前就写的${ null == coverageinfo} or ${empty coverageinfo}
$(function(){
var coverageinfo= [];
});
</c:when>
<c:otherwise>
$(function(){
var coverageinfo= ${coverageinfo};
});
</c:otherwise>
</c:choose>
4、如何取得集合的大小
${fn:length(sessionScope.键)}
${fn:length(map)}
取得json集合的大小:${covArr}.length;
取得字符串的长度 :${fn:length("hello")}
5、varStatus显示循环变量的状态
例:<c:forEach var="currentFood" items="${sessionScope.foods}" varStatus="status"
<c:if test="${status%2==1}">
.....................
</c:if>
</c:forEach>
其中status这个变量就记录了循环变量的状态
6、如何遍历Map集合
<c:forEach var="foodmap" items="${sessionScope.cart}" varStatus="status">
<c:set var="subtotal" value="${foodmap.value.bean.foodPrice*foodmap.value.quantity}"></c:set>
</c:forEach>
遍历Map集合的值:
foodmap:保存session中的map
foodmap.value:取得map的值,即获取保存在map中的一个对象
要获取对象中的数据,必须用foodmap.value.quantity去点对象的属性(quantity就是对象的属性)
7.遍历数字
<c:if test="${totalPages>=1}">
<a href="javascript:void(0)" οnclick="goback()">上一页</a>
<c:forEach begin="1" end="${totalPages}" var="i">
<c:choose>
<c:when test="${i != num}">
<a href="${path}/PageServlet?page=${i}&branchlevel=${branchlevel}&branchtype=${branchtype}">${i}</a>
</c:when>
<c:otherwise>
<a style="background-color: red" href="${path}/PageServlet?page=${i}&branchlevel=${branchlevel}&branchtype=${branchtype}">${i}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<a href="javascript:void(0)" οnclick="nextpage()">下一页</a>
</c:if>
二、 EL表达式与JSTL(C)标签: http://blog.csdn.net/javaloveiphone/article/details/7956237
一、EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能。脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算
1)语法结构
${expression}
2)[]与.运算符
EL 提供.和[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。
例如:${sessionScope.user[data]}中data 是一个变量
3)变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为 username的变量。
它会依序从Page、Request、Session、Application范围查找(范围从小到大)。
如果找到则停止,并且不显示null,而是不显示值,这也是el表达式的优点,同时也是使用EL表达式取值进行判断时应该注意的
例如:在js中使用s标签并配合EL表达式取值做判断
var username = ${username};
<s:if test="username ==null">这样的判断是错误的,因为EL表达式如果去不出值,是不会显示null的
正确的方式为:<s:if test='username ==""'>(注意单引号和双引号的使用)或者:<s:if test="${username ==null}">
属性范围在EL中的名称 使用方式: 相当于:
Page PageScope ${ pageScope.page_name }
Request RequestScope ${ requestScope.request_name } <%=request.getAttribute("request_name");%>
Session SessionScope ${ sessionScope.session_name } <%=session.getAttribute("session_name");%>
Application ApplicationScope ${ applicationScope.application_name } <%=application.getAttribute("application_name");%>
二、有效表达式
有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。
1)文字:
文字文字的值
Boolean true 和 false 例如:${true}
Integer 与 Java 类似。可以包含任何正数或负数,例如 24、-45、567 例如:${23+45}
Floating Point 与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567
String 任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。
必须注意,如果在字符串两端使用双引号,则单引号不需要转义。
Null null
2)操作符
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
术语定义
算术型 +、-(二元)、*、/、div、%、mod、-(一元)
逻辑型 and、&&、or、||、!、not
关系型 ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
空空操作符是前缀操作,可用于确定值是否为空。例如:${empty user.username} ${not empty user.username}
条件型 A ?B :C。根据 A 赋值的结果来赋值 B 或 C。
3)隐式对象
最常用的隐式对象有${param}和${paramValues}.
param 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。
getParameter (String) 方法返回带有特定名称的参数。表达式 $(param . name) 相当于 < %=request. getParameter(“username”)% >
例如在一个页面地址栏里面传的参数可以在另一个页面中通过这样的方式取出
paramValues 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。
它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name) 相当于 request.getParamterValues(name)。
header 储存用户浏览器和服务端用来沟通的数据(通过调用 ServletRequest.getHeader(String name) 获得)。
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。表达式 ${header. name} 相当于 request.getHeader(name)。
headerValues 有可能同一标头名称拥有不同的值(通过调用 ServletRequest.getHeaders(String) 获得)。
它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。
cookie 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。
表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值。
如果请求包含多个同名的 cookie,则应该使用 ${headerValues. name} 表达式。
initParam 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。
表达式${initParam.userid}相当于application.getInitParameter("userid");
pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串 相当于<%=request.getQueryString()%>
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串 <%=request.getRequestURL()%>
${pageContext.request.contextPath} 服务的web application 的名称 相当于<%=request.getContextPath()%>
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
另外:上面提到的pageScope、requestScope、sessionScope 和 applicationScope也都是EL的隐式对象
例如:<%=user.getAddr( ) %> 等价于 ${user.addr} (user为一个变量,在action或者severlet中存放于指定的作用域中,addr为user的属性)
三、特别强调
1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。
例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。
2、注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
四、JSTL(C)标签:
由于EL表达式不能循环取出集合对象的值,所以可以通过使用jstl标签中的方法解决这个循环取出集合对象的问题
jstl是建立在el表达式基础上的语言,属于jsp外部的一个标准标签,库导入标签格式为:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL部分介绍:
1、 <c:out value="${属性名}"></c:out>:输出标签
2、迭代标签
语法:<c:forEach items="userList" var="user" varStatus=“status” begin=“int“ end=”int” step=“int” >
//循环体
<c:out value="${status.index}"></c:out>
<c:out value="${status.count}"></c:out>
<c:out value="${ user.name }"></c:out>
<c:out value="${ user.age }"></c:out>
</c:forEach>
说明:1)items:是集合,用EL表达式;
2)var:变量名,存放items ,代表集合中每一条数据
3)varStatus: 显示循环状态的变量,有一下几个属性:
①index:从0开始; 显示当前迭代的索引值
②count:元素位置,从1开始; 显示当前迭代显示的行位置,通过配合判断语句,实现给奇、偶行着不同的色,以进行分区
③first:如果是第一个元素则显示true;
④last:如果是最后一个元素则显示true;
4)begin:循环的初始值(整型);
5)end: 循环结束 ;
6)step:步长,循环间隔的数值;
3、 <c:if test="判断语句"></c:if>:若果满足test中的条件,则执行<c:if></if>标签对之间的的语句,相当于if....的结构功能
4、<c:choose>:由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>
结构形式:
<c:choose>
<c:when test="判断语句1">执行语句1</c:when>
<c:when test="判断语句2">执行语句1</c:when>
..........
<c:otherwise>前面都不符合,执行此默认语句
</c:otherwise>
</c:choose>:用于选择标签对之间满足条件的语句,相当于switch语句
5、、<c:redirect>标签
说明:标签将请求重新定向到另外一个页面,它有以下属性
例子: <c:redirect url="http://www.baidu.com/login.jsp"/>
将请求重新定向到http://www.baiddu.com/login.jsp页,相当于response.setRedirect ("http://www.yourname.com/login.jsp");
6、<c:param>标签
说明:<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性
例子: <c:redirect url="http://www.baidu.com/login.jsp">
<c:param name="paramName" value="paramValue"/>
</c:redirect>
这个就在地址栏里面显示的形式为:http://www.baidu.com/login.jsp?paramName=paramValue
五、<fmt:>格式化标签,并显示
说明:需要导入 <%@ taglib prefix="fmt" http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt" %>
1)格式化日期<fmt:formatDate value=“” pattern=“yyyy-MM-dd HH:mm:ss”/>
Value:通过EL表达式或<%new Date() %> 取的日期值;
Pattern:输出的日期格式;诉讼
例如:
<fmt:formatDate value="${date }" pattern="yyyy-MM-dd"/>
<fmt:formatDate value="${date }" pattern="yyyy年MM月dd日"/>
2) 格式化数字<fmt:formatNumber value="${number}" pattern="###,###.##" />