首页 > 学院 > 开发设计 > 正文

JSTL标签和EL表达式学习

2019-11-11 07:22:58
字体:
来源:转载
供稿:网友

JSTL简单介绍

什么是JSTL?

JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与jsp动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已!,JSTL是有tld文件(JSTL1.1含有5个tld文件)和标准处理类组成

如果你使用MyEclipse开发javaWeb,那么在把项目发布到Tomcat时,你会发现,MyEclipse会在lib目录下存放jstl的Jar包!如果你没有使用MyEclipse开发那么需要自己来导入这个JSTL的Jar包:jstl-1.2.jar

JSLT的下载:

下载之后解压导入jstl.jar和standard.jsr包导入lib目录下:

http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

JSTL标签介绍和使用

JSTL标签库:

JSTL一共包含四大标签库:

core:核心标签库,我们学习的重点fmt:格式化标签库,只需要学习两个标签即可sql:数据库标签库,不需要学习了,它过时了xml:xml标签库,不需要学习了,它过时了

使用taglib指令导入标签库:

除了JSP动作标签外,使用其他第三方的标签库都需要:

导包在使用标签的JSP页面中使用taglib指令导入标签库

下面是导入JSTL的core标签库:

<%@ taglib PRefix="c"uri="http://java.sun.com/jstl/core" %>

prefix=”c”:指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c

uri=”http://java.sun.com/jstl/core”:指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件

core标签库常用标签:

out和set标签:

<c:out value=”aaa”/> //输出aaa字符串常量<c:out value=”${aaa}”/> //与${aaa}相同<c:out value=”${aaa}” default=”xxx”/> //当${aaa}不存在时,输出xxx字符串<%request.setAttribute("a","<script>alert('hello');</script>");%><c:out value="${a }" default="xxx" escapeXml="false" />如果为escapeXml="false",则将其中的html、xml解析出来,还可以输出转义字符,所以会输出hello<c:set var=”a” value=”hello”/> //在pageContext中添加name为a,value为hello的数据<c:set var="a" scope="session">hello</c:set> //也是输出hello<c:set var=”a” value=”hello” scope=”session”/> //在session中添加name为a,value为hello的数据

remove标签:

<%pageContext.setAttribute("a","pageContext");request.setAttribute("a","session");session.setAttribute("a","session"); application.setAttribute("a","application");%><c:remove var="a"/> //删除所有域中name为a的数据!<c:out value="${a}" default="none"/><c:remove var="a" scope=”page”/> //删除pageContext中name为a的数据

catch标签:

<c:catch var="error"> <%=10/0></c:catch>//捕获异常,后面的代码继续执行<c:out value="${error}"/> //输出异常信息

if标签:

if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行

<c:set var="a" value="hello"/> <c:if test="${not empty a }" var="result" scope="session"> <c:out value="正确"/> </c:if><c:out value="${result}"></c:out> //输出"正确"

choose,when,otherwise标签:

choose标签对应Java中的if/else,when标签的test为true时,会执行这个when的内容,当所有when标签的test都为false时,才会执行otherwise标签的内容,choose标签可以省略不写

<c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> <c:when test="${score >= 90 }">A级</c:when> <c:when test="${score >= 80 }">B级</c:when> <c:when test="${score >= 70 }">C级</c:when> <c:when test="${score >= 60 }">D级</c:when> <c:otherwise>E级</c:otherwise> </c:choose>

forEach标签:

forEach当前就是循环标签了,forEach标签有多种两种使用方式:

使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {}循环遍历集合,类似for(Object o : 集合)

循环变量:

<c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10"> <c:set var="sum" value="${sum + i}" /> </c:forEach> <c:set var="sum" value="0" /> <c:forEach var="i" begin="1" end="10" step ="2"> <c:set var="sum" value="${sum + i}" /> </c:forEach>

遍历集合或数组方式:

<% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach>

遍历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 }" begin="1" end="3"> <c:out value="name: ${item }"/><br/> </c:forEach>

遍历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>

forEach标签还有一个属性:varStatus,这个属性用来指定接收”循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了

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>

forTokens标签:

通过指定分隔符将字符串分隔为一个数组然后迭代它们,delims:分隔符

<c:forTokens items="google,runoob,taobao" delims="," var="name"> <c:out value="${name}"/><p></c:forTokens> //输出google runoob taobao

c:import 标签:

使用c:import标签可以包含一个FTP服务器中不同的网页内容

<c:import var="data" url="http://www.runoob.com"/><c:out value="${data}"/> //以上程序将会打印http://www.runoob.com"页面的源代码<c:import url="/import.jsp" context="/WebProjext"/> //引入同一个服务器下的另外一个Project

c:redirect>标签:

c:redirect标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签,context:紧接着一个本地网络应用程序的名称

<c:redirect url="if.jsp"> <c:param name="aa" value="123"></c:param>//传参数</c:redirect> //用${param.aa}可以获得

url标签:该标签会在需要重写URL时添加

<c:url value="/"/> //输出上下文路径:/项目名/<c:url value="/" var="a" scope="request"/> //把本该输出的结果赋给变量a,范围为request<c:url value="/AServlet"> <c:param name="username" value="abc"/> <c:param name="passWord" value="123"/></c:url> //输出:/项目名/AServlet?username=abc&password=123,如果参数中包含中文,那么会自动使用URL编码!

fmt标签库常用标签:

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="#.##"/>

JSTL(fn函数):

首先,我们要在页面的最上方引用:

<%@ taglib prefix="fn" uri="http://Java.sun.com/jsp/jstl/functions" %>

基本函数使用:

fn:contains(string, substring)

<c:if test="${fn:contains("你好","你好了吗")}"/> //前面的字符串是否包含后面的fn:containsIgnoreCase(string, substring) //忽略大小写的包含fn:endsWith(string, suffix) //假如参数string以参数suffix结尾,返回truefn:indexOf(string, substring) //返回参数substring在参数string中第一次出现的位置

fn:escapeXml(string)

将有非凡意义的XML (和HTML)转换为对应的XML,character entity code,并返回

<c:out value="${fn:excapeXml('<book>歌曲</book>')}"/> <!--输出&lt;book&gt;歌曲&lt;book&gt;-->

JSP访问JavaBean:

1.导入javaBean类

<%@ page import="com.anllin.bean.Person" %>

2.声明javaBean对象

<jsp:useBean id="person" class="com.anllin.bean.Person"></jsp:useBean>

其实相当于

<% Person person = new Person(); %>

Id表示生成一个类的实例,一般id不能重复,用于表示不同的对象,如果相同则表示同一个对象,这种情况下jsp会报错

3.访问javaBean属性

<jsp:setProperty property="name" name="person" value="jack"/><jsp:getProperty property="name" name="person"/><br>

其实相当于

<% person.setName("jack"); person.getName();%>

也可以使用JSTL:

<c:set target="${person}" property="name" value="jark"/>//相当于:<c:set target="${person}" property="name">jark</c:set><c:out value="${person.name}"/>

具体介绍:http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html

EL表达式介绍

EL(Expression Language)表达式语言:用于计算和输出存储在标志位置(page、request、session、application)的java对象的值

EL是JSP2.0规范的一部分,只要容器支持Servlet2.4/JSP2.0,就可以在JSP2.0网页中直接使用EL

EL表达式的使用

基本格式:${表达式}

所有的EL都是以"${"开始,以"}"结尾表达式与开始符和终结符的空格被忽略表达式的值为null,则在页面中显示为一个空字符串,而不是null

运算符的介绍:

算术运算:+、-、*、/或div、%或mod关系运算:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge逻辑运算:&&或and、||或or、!或not特殊运算:empty(是否为null或空字符串)、?:(三元运算符)转义符:/${变量}

EL 提供”.”和”[ ]”两种运算符来存取数据:

当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用”[ ]”,例如:

${user.My-Name}应当改为${user["My-Name"] }

如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值,例如:

${sessionScope.user[data]}中data 是一个变量

EL常用的隐式对象:

作用域(以下11个EL作用域名称也是EL提供的隐式对象):

EL中存取变量:

EL存取变量数据的方法很简单,例如:${username},它的意思是取出某一范围中名称为username的变量

因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找

假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null

属性范围在EL中的名称:

Page PageScopeRequest RequestScopeSession SessionScopeApplication ApplicationScope

特别强调:

1.注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性,例如:即使现有的pageContext 属性包含某些其他值,${pageContext}也返回 PageContext 对象

2.注意 <%@ page isELIgnored=”true” %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言

基本使用举例:

< %=request.getParameter(“username”)% >等价于${ param.username } //注意EL会进行自动类型转换
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表