JavaEE-08 JSTL和EL
学习要点
- EL表达式
- JSTL标签
EL表达式
为什么需要EL表达式
- JavaBean在JSP中的局限
- 在JSP页面中嵌入大量的Java代码
- 获取JavaBean属性必须要实例化
- 强制类型转化
例如,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的更多相关文章
- JS中也可以使用JSTL和EL标签
//往上滑是调用分页 function Ajax(currPage, pageSize) { // ajax后台交互String currPage,String pageSize var el, Pl ...
- JSTL和EL
JSTL和EL 1.EL表达式总是放在大括号里,而且前面有一个美元符前缀. person.name2.相似点:(1).都可以让我们在静态内蓉中插入动态信息.EL:室外温度是{emp}度 JSP:室外温 ...
- JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总
一下纯属个人总结摘抄,总结一起方便查看,解决疑问,有遗漏或错误,还请指出. 1,JSTL标签总结: a).JSTL标签有什么用? JSTL是由JCP(Java Commu ...
- JSTL、EL、ONGL、Struts标签的区别与使用
一.JSTL 来源 我们使用JSP开发信息展现非常方便,也可嵌入java代码用来实现相关逻辑,但同样带来了很多问题: jsp维护难度增加 出事提示不明确,不容易提示 分工不明确等 解决上面的问题可以 ...
- <Chapter 2>2-2-2-1.介绍JSPs,JSTL,和EL(Introducing JSPs, JSTL, and EL)
现在,我们的时钟显示了UTC时区的时间.我们希望我们的应用可以让用户自定义时区,并且为将来的访问记住用户的偏好.为了做到这一点,我们使用Google帐户来识别哪个用户正在使用这个应用. 在我们深入了解 ...
- JSTL与EL之间的千丝万缕
一.关于JSTL和EL: 什么是JSTL? JSTL( JSP Standard Tag Library)是JSP标准 标签库,由apache实现. 什么是EL? EL(Expression Lang ...
- JSTL与EL常用标签(转)
JSTL与EL EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程 ...
- JAVA学习JSTL与EL
一.基础 1.EL(Expression Language):为了使jsp写起来更加简单,提供了在Jsp中简化表达式的方法 2.JSTL:(JSP Standard Tag Library)jstl标 ...
- Java之旅(三)--- JSTL和EL表情
先给大家看一段JSP的代码.看看有什么感受? <% List<UsEL> usELList = pageModel.getList(); for (ItELator<Us ...
随机推荐
- BZOJ3834:Solar Panels (分块)
题意 询问两个区间[smin,smax],[wmin,smax]中是否存在k的倍数,使得k最大 分析 将其转化成\([\frac{smin-1}k,\frac{smax}k],[\frac{wmin- ...
- python __builtins__ complex类 (13)
13.'complex', 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数.如果第一个参数为字符串,则不需要指定第二个参数. class complex(ob ...
- bzoj 2626: JZPFAR【KD-tree】
和3053差不多,把pair first做成负数就可以用大根堆维护了 注意:要开long long:比较的时候因为编号也占权重所以要比较pair:编号不是mid!不是mid!是初始输入的那个编号!搞混 ...
- 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 ...
- YCOJ-DFS
DFS搜索是搜索中的一种,即深度优先搜索(Depth First Search),其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 图示: 如图,这是邻接矩阵,我 ...
- .bashrc等文件中的rc是什么意思
转自: https://blog.csdn.net/u010167269/article/details/52612260 刚刚配置 .bashrc 文件时,突然想,这里面的 rc 是什么意思? 使 ...
- jQuery笔记之工具方法
jQuery 工具方法 $.type()判断数据类型 $.isArray() $.isFunction() $.isWindow()... $.trim()消除空格 $.proxy()改变this指向 ...
- 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 ...
- hdu1811 Rank of Tetris 并查集+拓扑排序
#include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...
- python高级函数
1 函数 1.1 函数即变量 函数定义:把一个函数体作为变量赋值给一个函数名,同时函数体存放到内存中. 函数调用:根据函数名去内存中寻找对用的函数体,找到了就执行. >>> def ...