JSTL和EL 表达式

目录

1、为什么需要EL

JSP脚本的缺点

1、JavaBean在JSP中的局限

2、解决办法

2、EL表达式简介

1、什么是EL

2、EL的功能

3、EL的特点

4、EL表达式语法

1、使用变量名获取值

2、变量属性范围名称

3、获取对象的属性值

3、EL隐式对象

4、为什么使用JSTL

5、什么是JSTL

6、JSTL 的优点

7、JSTL的环境搭建

使用JSTL的步骤

8、 JSTL标准标签库内的标签

1、通用标签

1、out:计算表达式并将结果输出显示

2、set:设置指定范围内的变量值

3、remove:删除指定范围内的变量

2、条件标签与迭代标签

1、if(条件标签):实现Java语言中if语句的功能

2、choose(条件标签):实现Java语言中if-else if-else语句的功能

3、 forEach(迭代标签):实现对集合中对象的遍历

3、使用JSTL构造URL

1、url

2、param

3、import

4、使用JSTL格式化日期显示


1、为什么需要EL

JSP脚本的缺点

1、JavaBean在JSP中的局限

  • 在JSP页面中嵌入大量的Java代码
  • 获取JavaBean属性必须要实例化
  • 强制类型转化
<%	
    Employee employee = (Employee)request.getAttribute("employee");
    Computer comp = employee.getComputer();
    String manufacturer = comp.getManufacturer();
%>

2、解决办法

使用EL表达式简化

${requestScope.employee.computer.manufacturer}

2、EL表达式简介

1、什么是EL

  • Expression Language(表达式语言)

2、EL的功能

  • 替代JSP页面中的复杂代码

3、EL的特点

  • 自动转换类型
  • EL得到某个数据时可以自动转换类型
  • 使用简单

4、EL表达式语法

${ EL exprission }

  • 使用变量名获取值
  • 获取对象的属性值
  • 获取集合

1、使用变量名获取值

使用EL表达式之前,必须先将操作的对象保存到作用域中。

  • ${变量名}
<%  request.setAttribute("username","LiYang"); %>
姓名: ${username}

2、变量属性范围名称

JSP提供了4种作用域,分别是page,request,session,application。为了能够访问这4个作用域内的数据,EL表达式分别提供了4种作用域访问对象,来实现数据的读取。

属性范围

EL中的名称

说明

page

pageScope

与页面作用域(page)中的属性相关联的Map类,主要用于获取页面范围内的属性值

${pageScope.username},表示在page范围内查找username变量,找不到返回Null

request

requstScope

 

session

sessionScope

 

application

applicationScope

 
${requstScope.username}
${requestScope.news["title"]}

 当使用EL表达式访问某个属性值时,应当指定查找的范围。

如果程序中不指定查找的范围,那么系统会自动按照顺序(page→request→session→application)进行查找。

3、获取对象的属性值

<%	
    User user = (User )request.getAttribute("user");
    user.getName();
%>
  • 点操作符,访问对象的属性
${user.name} 
  • [ ]操作符,不仅可以访问对象的属性,还可以用于访问数组和集合
${user["name"]}     //访问user对象的name属性
${newsList[0]}      //访问newsList数组中的第一个元素

使用EL表达式输出姓名

<%
    Map names = new HashMap();
    names.put("one","LiYang");
    names.put("two","WangHua");
    request.setAttribute("names",names);
%>
姓名:${names.one}<br/>
姓名:${names["two"] }<br/>
  • 关系操作符

    关系操作符

    说明

    示例

    结果

    ==(或eq)

    等于

    ${23==5}或${23 eq 5}

    ${"a" =="a"}或${"a" eq "a"}

    false

    true

    !=(或ne)

    不等于

    ${23!=5}或${23 ne 5}

    true

    <(或lt)

    小于

    ${23<5}或${23 lt 5}

    false

    >(或gt)

    大于

    ${23>5}或${23 gt 5}

    true

    <=(或le)

    小于等于

    ${23<=5}或${23 le 5}

    false

    >=(或ge)

    大于等于

    ${23>=5}或${23 ge 5}

    ture

  • 逻辑操作符

    逻辑操作符

    说明

    示例

    结果

    &&(或and)

    逻辑与

    如果A为true,B为false,则A&&B(或A and B)

    false

    ||(或or)

    逻辑或

    如果A为true,B为false,则A||B(或A or B)

    true

    ! (或not)

    逻辑非

    如果A为true,则!A (或not A)

    false

  • Empty操作符

变量 a不存在,则${empty a}返回的结果为true

${not empty a}或${!empty a}返回的结果为false

3、EL隐式对象

作用域访问对象:pageScope、requestScope、sessionScope、applicationScope

参数访问对象:param、paramValues

JSP隐式对象:pageContext

对象名称

说  明

pageScope

返回页面范围的变量名,这些名称已映射至相应的值

requestScope

返回请求范围的变量名,这些名称已映射至相应的值

sessionScope

返回会话范围的变量名,这些名称已映射至相应的值

applicationScope

返回应用范围内的变量,并将变量名映射至相应的值

param

返回客户端的请求参数的字符串值

paramValues

返回映射至客户端的请求参数的一组值

pageContext

提供对用户请求和页面信息的访问

4、为什么使用JSTL

虽然EL表达式可以访问JavaBean的属性,但是并不能实现在JSP中进行逻辑判断,因而要使用JSTL标签。

5、什么是JSTL

SP标准标签库(JavaServerPages Standard Tag Library),包含了在开发JSP时经常用到的一系列标准标签。这些标签提供了一种不用嵌套Java代码就可以实现复杂JSP开发的途径。JSTL按照不同的用途又可以划分为多个分类,如下:

JSTL通常会与EL表达式合作实现JSP页面的编码

6、JSTL 的优点

  • 提供一组标准标签
  • 可用于编写各种动态 JSP 页面

7、JSTL的环境搭建

使用JSTL的步骤

  • 在工程中引用JSTL的两个jar包和标签库描述符文件
  • 在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

8、 JSTL标准标签库内的标签

核心标签库

通用标签:out、set、remove

条件标签:if、choose

迭代标签:forEach

1、通用标签

1、out:计算表达式并将结果输出显示

<c:out value="value" default="default" escapeXml="true|false"/>

value:需要输出显示的表达式

default:默认输出显示的值,如果value的值为null,则输出default的值

escapeXml:是否对输出的内容进行转义 

提示:使用<c:out> 标签输出显示前,需要先将数据放到作用域内

<%
    User user = new User(); 
    request.setAttribute("user", user);
%>
<c:set target="${user}" property="name" value="defaultName " />
<c:out value="${user.name}" default="noUserName" />

转义特殊字符

<p>${"<a href='http://www.baidu.com'>百度</a>"}</p>
<p>
    <c:out escapeXml="Y" value="<a href='http://www.baidu.com'>百度</a>"/>
</p>
<c:out value="<a href='http://www.baidu.com'>百度</a>"/>

2、set:设置指定范围内的变量值

1、将value值存储到范围为scope的变量variable

<c:set var="variable" value=" v " scope="  scope  "/>

var:变量的名称

value:变量的值

scope:变量存在的作用域范围 

2、将value值设置到对象的属性

<c:set value="value" target="target" property="property" />

value:属性的值

target:对象的名称

property:对象的属性名称 

<%
    User user = new User(); 
    request.setAttribute("user", user);
%>
<c:set target="${user}" property="name" value="defaultName " />

3、remove:删除指定范围内的变量

<c:remove var="name" scope="scope" />

var:变量的名称

scope:变量存在的作用域范围 

<body>
<!-- 设置之前应该是空值 -->
设置变量之前的值是:msg=<c:out value="${msg}" default="null"/>

<!-- 给变量msg设值  使用set属性进行赋值 -->
<c:set var="msg" value="Hello ACCP!" scope="page"></c:set>

<!-- 此时msg的值应该是上面设置的"已经不是空值了" 使用out属性输出显示-->
设置新值以后:msg=<c:out value="${msg}"></c:out><br>

<!-- 把 msg变量从page范围内移除  使用remove属性移除-->
<c:remove var="msg" scope="page"/>

<!-- 此时msg的值应该显示null -->
移除变量msg以后:msg=<c:out value="${msg}“ default="null">
</c:out>
</body>	

通用标签的使用: 

引入使用核心标签的指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 

<body>

set 标签用于给变量设置值和作用范围
scope= "page|request|session|application" 
<c:set var= "example" value="${100+1}" scope="session"  />	

out 标签在页面上显示信息或变量值 
<c:out value="${example}"/>

remove 标签用于删除作用域内的变量
<c:remove var= "example" scope="session"/>
</body>	

set标签与remove 标签中的var属性和property属性不接受动态的值

2、条件标签与迭代标签

1、if(条件标签):实现Java语言中if语句的功能

<c:if   test="codition"    var="name"    scope="applicationArea" >
	…
</c:if>	

判断登录:

<body>
<c:set var="isLogin" value="${empty sessionScope.user}"/>
<c:if test="${isLogin}">
…登录表单
</c:if>
<c:if test="${! isLogin}">
已经登录!
</c:if>
</body>

2、choose(条件标签):实现Java语言中if-else if-else语句的功能

<c:choose var="varName" scope="scope">
	<c:when test="condition1">
		主体内容
 	</c:when>
	<c:when test="condition2">
		主体内容
 	</c:when>
	<c:otherwise>
		主体内容
	</c:otherwise>
</c:choose >

3、 forEach(迭代标签):实现对集合中对象的遍历

通过迭代标签显示商品列表:

<%
	List products = GoodsDao.getAllProducts();
	request.setAttribute("products", products);
%>
…
<!-- 循环输出商品信息 -->
<c:forEach var="product" items="${requestScope.products}" varStatus="status">
<!-- 如果是偶数行,为该行换背景颜色 -->
    <tr <c:if test="${status.index % 2 == 1 }">style="background-color:rgb(219,241,212);"</c:if>>
        <td>${product.name }</td>
        <td>${product.area }</td>
        <td>${product.price }</td>
    </tr>
</c:forEach>

通过迭代标签遍历Map:

<%
    Map<String,String> map=new HashMap<String,String>();
    map.put("tom", "美国");
    map.put("lily", "英国");
    map.put("jack","中国");
    request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${map}">
     ${entry.key}
     ${entry.value}<p>
</c:forEach>

 forEach:指定迭代的次数

<c:forEach  begin="start"   end="end"  step="count">

		…循环体代码…
</c:forEach>

<c:forEach  begin="1"   end="5"  step= "2">
	<c:out value="*"></c:out>
</c:forEach>

3、使用JSTL构造URL

超链接是Web应用中最常用的功能,在JSTL中也提供了相应的标签来完成超链接的功能,

这些标签包括<c : url />、<c : param />、<c : import />

1、url

根据URL规则创建一个URL

<c : url />

<c:url value="value" >
<-- 
    value:需要构造的URL,可以是相对路径,也可以是绝对路径
-->

2、param

用来为URL附加参数

<c : param/>

在Web应用中,超链接在实现页面跳转的同时有时候还需要进行数据的传递、JSTL同样也提供了相应的标签来支持超链接的参数设置,这个标签就是<c : param/>

<c:param name="name" value="value" />
<--
   name:参数的名称
   value:参数的值
-->
<c:url var="bookUrl" value="bookListServlet.do">
	<c:param name="typeId" value="${fy.query.typeId }"></c:param>
	<c:param name="bookName" value="${fy.query.bookName }"></c:param>
	<c:param name="birDateStart">
		<fmt:formatDate value="${fy.query.birDateStart }" pattern="yyyy-MM-dd" />
	</c:param>
	<c:param name="birDateEnd">
		<fmt:formatDate value="${fy.query.birDateEnd }" pattern="yyyy-MM-dd" />
	</c:param>
</c:url>


<a href="${bookUrl }&page=1">首页</a>

 3、import

<c : import />

在页面中导入一个基于URL的资源,这个标签的资源与<jsp : include >动作元素类似,区别在于使用<c : import />标签不仅可以导入同一个Web应用程序下的资源,还可以导入不同Web应用程序下的资源。

<c : import url="URL" />
<--
    url:导入资源的URL路径
-->

4、使用JSTL格式化日期显示

<fmt : format />

Java中日期格式化可以用SimpleDateFormat来实现

new SimpleDateFormat("yyyy-MM-dd").parse(new Date());

JSTL中可以使用格式化标签<fmt : format />标签来完成

<--
    首先添加国际化格式标签
-->

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

 

<fmt:formatDate value="${fy.query.birDateEnd }" pattern="yyyy-MM-dd HH:mm:ss" />
<--
    value:时间对象
    pattern:显示格式
-->

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值