学习要点

  • EL表达式
  • JSTL标签

EL表达式

为什么需要EL表达式

  • JavaBean在JSP中的局限
  1. 在JSP页面中嵌入大量的Java代码
  2. 获取JavaBean属性必须要实例化
  3. 强制类型转化

例如,Computer类是Employee类中的一个属性,现在要获取员工计算机制作商信息,则需要编写如下代码:

	<%
Employee employee = (Employee) request.getAttribute("employee");
Computer comp = employee.getComputer();
String manufacturer = comp.getManufacturer();
%>

  

  • 解决办法

JSP2.0引入了EL表示式,简化如下:

${requestScope.employee.computer.manufacturer}

  

EL表达式

EL:Expression Language(表达式语言)

EL的功能:替代JSP页面中的复杂代码

EL的特点:能够自动转换类型(EL得到某个数据时可以自动转换类型);使用简单;定义了一系列隐含对象和操作符,方便访问页面的上下文,以及不同作用域的对象。

EL表达式语法结构

语法:

${ EL exprission }

用于:使用变量名获取值、获取对象的属性值、获取集合

  • 使用变量名获取值

${变量名}

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

  

变量属性范围名称

属性范围

EL中的名称

page

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

request

requstScope

session

sessionScope

application

applicationScope

使用EL表达式访问某个属性值时,应该指定查找的范围,例如${requstScope.username},即在request请求域查找属性名为username的属性值。如果不指定查找范围,则系统会按照page -> request -> session -> application作用域的顺序查找。

  • 获取对象的属性值

点操作符:${user.name}

[ ]操作符:${user["name"]}

相当于:

<%
User user = (User )request.getAttribute("user");
user.getName();
%>

  

  • 获取集合

获取List集合

<%
List names = new ArrayList();
names.add(0, "LiYang");
names.add(1,"WangHua");
request.setAttribute("names",names);
%>
姓名:${names[0]}<br/>
姓名:${names[1]}<br/>

  

问题:nams[0]和names[1]两个变量的属性范围名称是?

获取Map集合

	<%
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

EL隐式对象

隐式对象介绍

对象名称

 

pageScope

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

requestScope

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

sessionScope

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

applicationScope

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

param

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

paramValues

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

pageContext

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

EL表达式的综合应用

  • 注册页面代码
 <form id="regFrm" action="regSuccess.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input id="userName" name="userName" type="text"></td>
</tr>
<tr>
<td>密码:</td>
<td><input id="password" name="password" type="password"></td>
</tr>
<tr>
<td>业余爱好:</td>
<td>
<input name="habit" type="checkbox" value="Reading">看书
<input name="habit" type="checkbox" value="Game">玩游戏
<input name="habit" type="checkbox" value="Travelling">旅游
<input name="habit" type="checkbox" value="Swimming">游泳
<input name="habit" type="checkbox" value="TV">看电视
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>

  

  • 注册信息处理页代码
<%
request.setCharacterEncoding("UTF-8");
//从请求参数中取得用户名
String userName = request.getParameter("userName");
//密码
String password = request.getParameter("password");
//业余爱好
String[] habits = request.getParameterValues("habit");
//此处生成一个User对象,以便展示EL访问某个作用域内的对象
User user = new User();
user.setName(userName);
user.setPassword(password);
user.setHabits(habits);
//把此user对象设置为request范围内的一个属性
request.setAttribute("userObj", user);
%>
====使用request作用域内的userObj对象展示注册信息====
<br> 注册成功,您的注册信息是:
<br> 用户名:${requestScope.userObj.name }
<br> 业余爱好: <%
for (int i = 0; i < habits.length; i++) {
if (i > 0) {
out.print("、");
}
out.print(habits[i]);
}
%>
<br>
<br>
<br>
<br> ====使用param对象与paramValues对象展示注册信息====
<br> 用户名:${param.userName }
<br> 业余爱好: <%
for (int i = 0; i < habits.length; i++) {
if (i > 0) {
out.print("、");
}
request.setAttribute("i", i); //将索引放到请求域中
%>
${paramValues.habit[i]}
<%
}
%>

  

  • User类
public class User {
private String name;
private String password;
private String[] habits;
//...
}

  

上机练习

需求说明

  • 用户输入昵称、所在城市,并且以多选的方式让用户选择所使用的开发语言,然后使用EL表达式显示在页面上
  • 昵称和所在城市使用param对象输出

JSTL

使用JSTL的原因

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

JSTL概念

JSP标准标签库(JavaServerPages Standard Tag Library)。

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

JSTL 的优点:提供一组标准标签;可用于编写各种动态 JSP 页面。

JSTL的环境搭建

  • 在工程中引用JSTL的两个jar包和标签库描述符文件

如果采用myeclipse创建项目,选择了JavaEE 6.0或者JavaEE 5.0,则自动集成了JSTL

  • 在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  • 使用JSTL标签

JSTL标准标签库内的标签

核心标签库

通用标签

  • set标签

说明:设置指定范围内的变量值

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

语法格式:

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

实例代码:

<c:set  var="index"  value=" 110 "  scope="request"/>

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

语法格式:

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

示例代码:

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

  

  • out标签

说明:计算表达式并将结果输出显示

语法格式:

1.不指定默认值:

<c:out value="value" />

2.指定默认值:

<c:out value="value" default="default" />

  

示例代码:

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

  

类似于JSP中的<%=%>,它可以指定默认值,比<%=%>强大。默认值可以方便的处理空值情况。

  • 转义特殊字符
	<p>${"<a href='http://www.baidu.com'>百度</a>"}</p>
<p><c:out escapeXml="false" value="<a href='http://www.baidu.com'>百度</a>"/></p>
<c:out value="<a href='http://www.baidu.com'>百度</a>" />

  输出效果

属性说明

属性

描述

是否必要

默认值

value

要输出的内容

default

输出的默认值

主体中的内容

escapeXml

是否忽略XML特殊字符

true

  • remove标签

说明:删除指定范围内的变量

示例代码:

<!-- 设置之前应该是空值 -->
设置变量之前的值是:msg=
<c:out value="${msg}" default="null" />
<!-- 给变量msg设值 -->
<c:set var="msg" value="Hello JSP!" scope="page"></c:set>
<!-- 此时msg的值应该是上面设置的"已经不是空值了" -->
<br>设置新值以后:msg=
<c:out value="${msg}"></c:out>
<!-- 把 msg变量从page范围内移除-->
<c:remove var="msg" scope="page" />
<!-- 此时msg的值应该显示null -->
<br>移除变量msg以后:msg=
<c:out value="${msg}" default="null"></c:out>

  

条件标签

  • if标签

说明:实现Java语言中if语句的功能

语法格式:

<c:if test="<boolean>"  var="<string>"  scope="<string>">
...
</c:if>

参数说明:

属性

描述

是否必要

默认值

test

条件

var

用于存储条件结果的变量

scope

var属性的作用域

page

示例代码:

User用户实体类:

/**User类*/
public class User {
private String name;
private String password;
private String role;
private String[] habits;
//……
}

  login.jsp页面关键代码:

/**login.jsp*/

	<%
String userName = request.getParameter("userName");//用户名
String password = request.getParameter("passWord");//密码
String cmdStr = request.getParameter("cmdStr");//cmdStr
if ("post".equals(cmdStr)) {
if ("admin".equals(userName) && "admin".equals(password)) {
//登录成功
User user = new User();
user.setName(userName);
user.setPassword(password);
//设置session属性
request.getSession().setAttribute("user", user);
} else {
request.setAttribute("errMsg", "用户名或密码不正确");
}
}
%>
<c:set var="isLogin" value="${empty sessionScope.user}" />
<c:if test="${isLogin}">
<form id="login" method="post" action="login_2.jsp">
<input type="hidden" value="post" name="cmdStr">
<c:if test="${not empty errMsg}">
<div style="color:red;">${errMsg}</div>
<c:remove var="errMsg" />
</c:if>
<table>
<tr>
<td>用户名:</td>
<td><input id="userName" name="userName" type="text"></td>
</tr>
<tr>
<td>密码:</td>
<td><input id="passWord" name="passWord"
type="password"></td>
</tr>
</table>
<input type="submit" value="登录">
</form>
</c:if>
<c:if test="${!isLogin}">
欢迎 ${user.name},您已经登录成功!
<c:remove var="user" scope="session"/>
</c:if>

  

  • choose标签

说明:实现Java语言中if-else if-else语句的功能。

语法结构:

<c:choose >
<c:when test="<boolean>"/>
...
</c:when>
<c:when test="<boolean>"/>
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>

  

示例代码1:简单判断

<c:set var="salary" scope="session" value="${2000*2}" />
<p>
你的工资为 :
<c:out value="${salary}" />
</p>
<c:choose>
<c:when test="${salary <= 0}">
太惨了。
</c:when>
<c:when test="${salary > 1000}">
不错的薪水,还能生活。
</c:when>
<c:otherwise>
什么都没有。
</c:otherwise>
</c:choose>

  

示例代码2:角色页面

<%
//用户名
String userName = request.getParameter("userName");
//密码
String password = request.getParameter("passWord");
//cmdStr
String cmdStr = request.getParameter("cmdStr"); if ("post".equals(cmdStr)) {
if ("accp_user".equals(userName) && "accp_pass".equals(password)) {
//登录成功
User user = new User();
user.setName(userName);
user.setPassword(password);
user.setRole("部门经理");
//设置session属性
request.getSession().setAttribute("user", user);
} else {
request.setAttribute("errMsg", "用户名或密码不正确");
}
}
%>
<c:choose>
<c:when test="${empty user}">
<form id="login" method="post" action="login_3.jsp">
<input type="hidden" value="post" name="cmdStr">
<c:if test="${not empty errMsg}">
<div style="color:red;">${errMsg}</div>
<c:remove var="errMsg" />
</c:if>
<table>
<tr>
<td>用户名:</td>
<td><input id="userName" name="userName"
type="text"></td>
</tr>
<tr>
<td>密码:</td>
<td><input id="passWord" name="passWord"
type="password"></td>
</tr>
</table>
<input type="submit" value="登录">
</form>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${user.role eq '总监'}">
总监页面
</c:when>
<c:when test="${user.role eq '部门经理'}">
部门经理页面
</c:when>
<c:otherwise>
员工页面
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>

  

迭代标签

forEach标签:实现对集合中对象的遍历

语法结构:

	<c:forEach items="<object>" begin="<int>" end="<int>" step="<int>"
var="<string>" varStatus="<string>">
//循环体
</c:forEach>

  

参数说明:

属性

描述

是否必要

默认值

items

要被循环的信息

begin

开始的元素(0=第一个元素,1=第二个元素)

0

end

最后一个元素(0=第一个元素,1=第二个元素)

Last element

step

每一次迭代的步长

1

var

代表当前条目的变量名称

varStatus

代表循环状态的变量名称

使用方法:

forEach是for循环语句的变体,实现集合对象(可以是list、数组等)的处理。

示例代码1:输出循环变量

	<c:forEach var="i" begin="1" end="5">
Item<c:out value="${i}"/><p>
</c:forEach>

  

示例代码2:按照指定步长输出信息

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

  

示例代码3:遍历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>

  

示例代码4:遍历List集合

<%
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>

  

上机练习

需求描述

  • 使用EL表达式和JSTL标签简化新闻发布系统页面

总结

  • EL表达式的语法有两个要素:$ 和 {}
  • EL表达式可以使用“.”或者“[]”操作符在相应的作用域中取得某个属性值
  • JSTL核心标签库中常用的标签有如下三类。

通用标签;<c:set>、<c:out>、<c:remove>

条件标签;<c:if>、<c:choose>、<c:when>、<c:otherwise>

迭代标签:<c:forEach>

  • EL表达式与JSTL标签结合使用,可以减少JSP中嵌入的Java代码,有利于程序的维护和扩展

JavaEE-08 JSTL和EL的更多相关文章

  1. JS中也可以使用JSTL和EL标签

    //往上滑是调用分页 function Ajax(currPage, pageSize) { // ajax后台交互String currPage,String pageSize var el, Pl ...

  2. JSTL和EL

    JSTL和EL 1.EL表达式总是放在大括号里,而且前面有一个美元符前缀. person.name2.相似点:(1).都可以让我们在静态内蓉中插入动态信息.EL:室外温度是{emp}度 JSP:室外温 ...

  3. JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总

    一下纯属个人总结摘抄,总结一起方便查看,解决疑问,有遗漏或错误,还请指出.       1,JSTL标签总结: a).JSTL标签有什么用?          JSTL是由JCP(Java Commu ...

  4. JSTL、EL、ONGL、Struts标签的区别与使用

     一.JSTL 来源 我们使用JSP开发信息展现非常方便,也可嵌入java代码用来实现相关逻辑,但同样带来了很多问题: jsp维护难度增加 出事提示不明确,不容易提示 分工不明确等 解决上面的问题可以 ...

  5. <Chapter 2>2-2-2-1.介绍JSPs,JSTL,和EL(Introducing JSPs, JSTL, and EL)

    现在,我们的时钟显示了UTC时区的时间.我们希望我们的应用可以让用户自定义时区,并且为将来的访问记住用户的偏好.为了做到这一点,我们使用Google帐户来识别哪个用户正在使用这个应用. 在我们深入了解 ...

  6. JSTL与EL之间的千丝万缕

    一.关于JSTL和EL: 什么是JSTL? JSTL( JSP Standard Tag Library)是JSP标准 标签库,由apache实现. 什么是EL? EL(Expression Lang ...

  7. JSTL与EL常用标签(转)

    JSTL与EL EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程 ...

  8. JAVA学习JSTL与EL

    一.基础 1.EL(Expression Language):为了使jsp写起来更加简单,提供了在Jsp中简化表达式的方法 2.JSTL:(JSP Standard Tag Library)jstl标 ...

  9. Java之旅(三)--- JSTL和EL表情

     先给大家看一段JSP的代码.看看有什么感受? <% List<UsEL> usELList = pageModel.getList(); for (ItELator<Us ...

随机推荐

  1. BZOJ3834:Solar Panels (分块)

    题意 询问两个区间[smin,smax],[wmin,smax]中是否存在k的倍数,使得k最大 分析 将其转化成\([\frac{smin-1}k,\frac{smax}k],[\frac{wmin- ...

  2. python __builtins__ complex类 (13)

    13.'complex', 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数.如果第一个参数为字符串,则不需要指定第二个参数. class complex(ob ...

  3. bzoj 2626: JZPFAR【KD-tree】

    和3053差不多,把pair first做成负数就可以用大根堆维护了 注意:要开long long:比较的时候因为编号也占权重所以要比较pair:编号不是mid!不是mid!是初始输入的那个编号!搞混 ...

  4. bzoj 4557: [JLoi2016]侦察守卫【树形dp】

    设f[u][i]为u点向下覆盖至少i层并且处理完u的子树的最小代价,f[u][i]为u点向上覆盖至少i层并且处理完u的子树的最小代价 转移的话显然f[u][i]+=f[v][i-1],但是f[u][0 ...

  5. YCOJ-DFS

    DFS搜索是搜索中的一种,即深度优先搜索(Depth First Search),其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 图示: 如图,这是邻接矩阵,我 ...

  6. .bashrc等文件中的rc是什么意思

    转自:  https://blog.csdn.net/u010167269/article/details/52612260 刚刚配置 .bashrc 文件时,突然想,这里面的 rc 是什么意思? 使 ...

  7. jQuery笔记之工具方法

    jQuery 工具方法 $.type()判断数据类型 $.isArray() $.isFunction() $.isWindow()... $.trim()消除空格 $.proxy()改变this指向 ...

  8. mycat启动报错UnknownHostException(Temporary failure in name resolution)解决方法

    重启命令 ./mycat restart 查看日志 cd logs tail -f wrapper.log 报错信息 INFO | jvm 2 | 2018/05/09 11:28:28 | Erro ...

  9. hdu1811 Rank of Tetris 并查集+拓扑排序

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...

  10. python高级函数

    1 函数 1.1 函数即变量 函数定义:把一个函数体作为变量赋值给一个函数名,同时函数体存放到内存中. 函数调用:根据函数名去内存中寻找对用的函数体,找到了就执行. >>> def ...