jsp中的JSTL与EL表达式用法及区别

2018年01月08日 学习资料 jsp中的JSTL与EL表达式用法及区别已关闭评论 阅读 108 次

对于JSTLEL之间的关系,这个问题对于初学JSP的朋友来说,估计是个问题,下面来详细介绍一下JSTLEL表达式他们之间的关系,以及JSTLEL一些相关概念!

EL相关概念
JSTL
一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段。所以我们先来学习EL表达式

EL主要用于查找作用域中的数据,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。通常与 JSTL 标记一起作用,能用简单而又方便的符号来表示复杂的行为。

EL基本格式
EL
表达式的格式:用美元符号($)定界,内容包括在花括号({})中;
例如: ${loginInfoBean.suser}

此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值;
例如:Hello {loginInfoBean.suser} ${loginInfoBean.spwd}

EL语法组成-标识符
EL
表达式由标识符、存取器、文字和运算符组成。

标识符用来标识存储在作用域中的数据对象。EL  11 个保留标识符,对应于 11EL隐式对象。除了11隐式对象外,假定所有其它标识符都用来标识作用域的变量。

标识符
:
${abc} 
相当于<%=pageContext.findAttribute(“abc”)%>
${og_1} <%=pageContext.findAttribute(“og_1”)%>
等等;就是说{}内的标识符除了11个保留字之外都表示作用域中的数据对应的名.

${requestScope}中的requestScope11EL隐式对象之一,它不再表示作用域中数据,而是表示request作用域;

EL隐藏对象
pageContext PageContext 
实例对应于当前页面的处理
pageScope 
与页面作用域属性的名称和值相关联的Map
requestScope 
与请求作用域属性的名称和值相关联的Map
sessionScope 
与会话作用域属性的名称和值相关联的Map
applicationScope 
与应用程序作用域属性的名称和值相关联的Map
param 
按名称存储请求参数的主要值的 Map 
paramValues 
将请求参数的所有值作为 String 数组存储的 Map 
Header 
按名称存储请求头主要值的 Map 
headerValues 
将请求头的所有值作为 String 数组存储的 Map 
cookie 
按名称存储请求附带的 cookie  Map 
initParam 
按名称存储 Web 应用程序上下文初始化参数的Map

EL存取器
存取器用来检索对象的特性或集合的元素。

存取器通过 “[]”  “.” 符号获取相关数据

:
${userBean.suser} 
 ${userBean[“suser”]}
//
获取输出bean中的suser属性值;
${mcType[“id”]} //
获取mapkeyid对应的值;

EL运算符
运算符允许对数据和文字进行组合以及比较。

EL运算符:
类别 运算符
算术运算符 +-*/(或 div)和 %(或 mod
关系运算符 ==(eq)!=(ne)<(lt)>(gt)<=(le)  >=(ge)
逻辑运算符 &&( and)||(or) !( not)
验证运算符 empty
验证运算符(empty):对于验证数据特别有用。empty 运算符采用单个表达式作为其变量(也即,${empty input}),并返回一个布尔值,该布尔值表示对表达式求值的结果是不是值。求值结果为 null 的表达式被认为是空,即无元素的集合或数组。如果参数是对长度为零的 String 求值所得的结果,则 empty 运算符也将返回 true

EL文字
文字表示固定的值 — 数字、字符、字符串、布尔型或空值。

 EL 表达式中,数字、字符串、布尔值和 null 都可以被指定为文字值。字符串可以用单引号或双引号定界。布尔值被指定为 true  false

JSTL是什么
JSTL(JSP Standard Tag Library,JSP
标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apachejakarta小组来维护的。JSTL1.0 由四个定制标记库(coreformatxml  sql)和一对通用标记库验证器组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行JSP页面的国际化。xml 库包含一些标记,这些标记用来操作通过XML表示的数据,而 sql 库定义了用来查询关系数据库的操作。 两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。

如果要使用JSTL,则必须引用jstl.jar standard.jar两个包。
为什么要用JSTL
我们JSP用于开发信息展现页非常方便;也可以嵌入java代码(scriptlet、表达式和声明)代码用来实现相关逻辑控制。看下面程序。但这样做会带来如下问题:
jsp
维护难度增加;
出错提示不明确,不容易调试;
分工不明确;(jsp开发者是美工,也是程序员);
最终增加程序的开发成本;
解决上面的问题可以使用定制标记库,JSTL使JSP开发者可以减少对脚本元素的需求,甚至可以不需要它们,从而避免了相关的维护成本。使分工更明确。

<% if (session.getAttribute(“user”).equals(“member”)) { %>
<p>Welcome, member!</p>
<% } else { %>
<p>Welcome, guest!</p>
<% } %>
JSTL
一般配合EL一起使用,因此先看看EL.

 JSTL部署
EE应用程序中部署JSTL有两种方式:
已存在的工程上部署
jstl.jarstandard.jar两个包考到现有工程
WebRoot / WEB-INF / lib 
目录下
将相关的 .tld文件考到现有工程 WebRoot / WEB-INF 目录下;

也可通过eclipse在已存在
工程上部署
新建工程的时候直接部署
JSP使用JSTL-core标签库
core
jsp中的使用:
 web.xml 中添加
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
</jsp-config>
jsp文件中添加
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
使用<c:out value=“HelloWorld” />

Core的操作作用域变量标签
获取输出作用域中变量.
<c:out > 
属性: value [default] [escapeXml]
定义作用域中变量
<c:set > 
属性: value var [scope]
删除作用域中变量
<c:remove > 
属性: var [scope]

Core的条件控制标签
单分支条件
<c:if > 
属性:test [var] [scope]
多分支条件
<c:choose >
<c:when > 
属性: test
<c:otherwise >

Core的其它标签
输出转换成的URL:
<c:url > 
属性:value [context] [var] [scope]
<jsp:include >相似用于包含其它页面的内容:
<c:import >
属性:url [context] [charEncoding] [var] [scope]
重定向
<c:redirect >
属性: url [context]
<c:url><c:import><c:redirect>配合使用,用于传参
<c:param >
属性: name value

Core的循环控制标签
实现简单循环
<c:forEach > var='item' begin='5' end='10' step='2‘ varStatus=‘’
实现迭代(遍历)
<c:forEach > items='' var='item‘ varStatus=‘’

属性varStatusvar相似设置一个作用域变量;只是varStatus作用域变量中存的是包括运行状态的对象;此对象包含如下属性:
current index count first last begin end step

简单循环
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>testjstl1</title>
</head>
<body>
<c:forEach var="i" step="1" begin="1" end="100">
${i} <br>
</c:forEach>
</body>
</html>

循环迭代
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="c" uri="/WEB-INF/c.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>testjstl1</title>
</head>
<body>
<c:forEach var="mcBean" items="${mcList}" varStatus="mcStatus">
当前遍历索引:${mcStatus.index} ; 商品名:${mcBean.sname} ; .... <br>
</c:forEach>
</body>
</html>

JSP使用JSTL-format标签库
format
jsp中的使用:
 web.xml 中添加
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
</jsp-config>
jsp文件中添加
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
使用
<fmt:formatDate value=“” pattern=“yyyy-MM-dd” />

Format常用标签
格式化输出日期:
<fmt:formatDate > value type var pattern
type
取值:
short: 10/19/00 6:07 PM
medium: Oct 19, 2000 6:07:01 PM
long: October 19, 2000 6:07:01 PM MDT
full: Thursday, October 19, 2000 6:07:01 PM MDT
: <fmt:formatDate value=“” pattern=“yyyy/MM/dd” />
格式化输出数字:
<fmt:formatNumber> value var pattern
:<fmt:formatNumber value=“” pattern=“###.##” />

format实例
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>testjstl1</title>
</head>
<body>
<jsp:useBean id="curDate" class="java.util.Date" scope="page"/>
<fmt:formatDate value="${curDate}" pattern="yyyy-MM-dd HH:mm:ss"/><br>

<fmt:formatNumber value="10.32898432" pattern="#.##"/><br>
<% request.setAttribute("var1",3.1415926); %>
<fmt:formatNumber value="${var1}" pattern="#.##"/><br>
</body>
</html>

到这里我们对JSTLEL之间的关系有了一定的认识,只要我们经常使用这些技术相信能很快的认识到这些技术的优缺点,比起死记硬背来说,理解才是真正的理解了.