EL和JSTL

简介: EL和JSTL

1.为什么需要EL

在JSP中使用Java脚本的局限

               在JSP页面中嵌入大量的Java代码 访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换              

<%Employeeemployee= (Employee) request.getAttribute("employee");
Computercomp=employee.getComputer();
Stringmanufacturer=comp.getManufacturer();
%>

EL表达式使JSP的开发变得更加简单

               ${requestScope.employee.computer.manufacturer}    

2.EL表达式简介

(1)什么是EL

                Expression Language(表达式语言)

2)EL的功能

                替代JSP页面中数据访问时的复杂编码              

(3)EL的特点

               自动转换类型  EL得到某个数据时可以自动转换类型                

(4)使用简单

3.EL表达式语法

(1)通过变量名取值

               ${变量名} 按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null ${ EL expression }              

(2)获取对象的属性值

<%=  ( (User) request.getAttribute("user") ) .getName()  %>点操作符${user.name}
[ ]
操作符${user["name"]}

3)获取集合元素

// 在Servlet或JSP中保存数据Listnames=newArrayList();
names.add(0, "LiYang");
names.add(1,"WangHua");
request.setAttribute("names",names);
// 在JSP中访问数据姓名:${ names[0] }<br/>//使用[ ]指定元素下标姓名:${ names[1] }<br/>// 在Servlet或JSP中保存数据Mapnames=newHashMap();
names.put("one", "LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
// 在JSP中访问数据姓名:${ names.one }<br/>姓名:${ names["two"] }<br/>

属性范围

EL中的名称

page

pageScope,例如${pageScope.username}表示在page作用域查找变量username,找不到返回null

request

requestScope

session

sessionScope

application

applicationScope

4.application作用于案例实现网站访问数量

<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>application统计网站访问次数</title></head><body><%Integercount= (Integer)application.getAttribute("count");
if(count!=null){
count+=1;
}else{
count=1;
}
application.setAttribute("count", count);
%><!--页面显示--><%Integeri= (Integer) application.getAttribute("count");
out.println("您好,你是第"+i+"位访问本网站的用户!!" );
%></body></html>

4.EL隐式对象

image.png

EL隐式对象介绍

对象名称

说  明

pageScope

与page作用域相关联的Map对象(只在当前页面使用)

requestScope

与request作用域相关联的Map对象

sessionScope

与session作用域相关联的Map对象

applicationScope

与application作用域相关联的Map对象

param

按照请求参数名称返回单一值的Map对象

paramValues

按照请求参数名称返回String数组的Map对象

pageContext

提供对页面信息和JSP内置对象的访问

5.案例:问卷调查

<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>问卷调查</title></head><body><formaction="investigationEl.jsp"method="POST">昵称:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<inputname="username"><br>所在城市:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<inputname="city"><br>你所使用的开发语言:<inputtype="checkbox"name="language"value="JAVA">Java<inputtype="checkbox"name="language"value="C">C<inputtype="checkbox"name="language"value="C++">C++<inputtype="checkbox"name="language"value="PHP">PHP<inputtype="checkbox"name="language"value="ASP">ASP<br><br><inputtype="submit"value="提交"></form></body></html>
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>使用EL展示问卷调查</title></head><body><%//设置字符集编码request.setCharacterEncoding("utf-8");
//获得语言集合String[] languages=request.getParameterValues("language");
%>你所填写的内容是:<br/>昵称:${param.username }
<br>所在城市:${param.city }
<br>使用的开发语言有:<%if(languages!=null){
for (inti=0; i<languages.length; i++) {
if (i>0) {
out.println("、");
    }
//将索引放到请求域中 request.setAttribute("i", i);
%>${paramValues.language[i]}
<%    }
}
%></body></html>

6.什么是JSTL

               JSP标准标签库(JSP Standard Tag Library) JSTL通常会与EL表达式合作实现JSP页面的编码              

(1)JSTL的优点:

               提供一组标准标签 可用于编写各种动态 功能              

(2)使用JSTL的步骤

               引入JSTL的jar文件和标签库描述符文件 在JSP页面添加taglib指令 使用JSTL标签              

引入方式:(固定模式)<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>

7.JSTL标准标签库中的常用标签

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

8.通用标签

(1)set:设置指定范围内的变量值

语法:

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

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

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

<c:settarget="target"property="property"value="value"/>// 在Servlet或JSP中设置JavaBeanUseruser=newUser(); 
request.setAttribute("user",  user);
// 在JSP中修改JavaBean的属性值<c:settarget="${user}"property="name"value="defaultName"/>

(2)out:计算表达式并将结果输出显示

语法:

不指定默认值

               <c:out  value="value" />              

指定默认值

<c:outvalue="value"default="default"/>// 在Servlet或JSP中设置JavaBeanUseruser=newUser();
request.setAttribute("user",  user);
// 在JSP中输出JavaBean的属性值<c:outvalue="${user.name}"default="No UserName"/>

(3)out:计算表达式并将结果输出显示

语法:

转义特殊字符

<p>${ "<a href='http://www.baidu.com'>百度</a>" }</p><p><c:outescapeXml="false"value="<a href='http://www.baidu.com'>百度</a>"/></p><c:outvalue="<a href='http://www.baidu.com'>百度</a>"/>

image.png

(4)remove:删除指定范围内的变量

语法:

<!--设置之前应该是空值--><c:removevar="variable"scope="scope"/>设置变量之前的值是:msg=<c:outvalue="${msg}"default="null"/><br/><!--给变量msg设值--><c:setvar="msg"value="Hello  World!"scope="page"></c:set>--->使用set标签设置属性<!--此时msg的值应该是上面设置的“HelloWorld!-->设置新值以后:msg=<c:outvalue="${msg}"></c:out><br/>--->使用out输出属性显示<!--msg变量从page范围内移除--><c:removevar="msg"scope="page"/>--->使用remove移除属性<!--此时msg的值应该显示null-->移除变量msg以后:msg=<c:outvalue="${msg}"default="null"></c:out>

image.png

(5)通用标签的使用

image.png

9.条件标签

(1)if:实现Java语言中if语句的功能

语法:

网络异常,图片无法展示
|

(2)使用if标签判断是否登录

<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!--引入标准标签库--><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Inserttitlehere</title></head><body><%session.setAttribute("user", "admin");
%><%--使用set设置一个boolean来区分是否登录--%><c:setvar="isLogin"value="${empty user}"></c:set><c:iftest="${isLogin }"><c:outvalue="对象不为空!"></c:out></c:if><c:iftest="${!isLogin }"><c:outvalue="对象为空!!"></c:out></c:if></body></html>

(3)choose:实现if - else if - else语句的功能

<c:choose><c:whentest="condition1">内容1</c:when><c:whentest="condition2">内容2</c:when>……<c:otherwise>内容n</c:otherwise></c:choose>

(4)forEach:实现对集合对象的遍历

image.png

(5)forEach:指定迭代的次数

语法:

               <c:forEach  begin="start"  end="end"  step= "stepSize"> …循环体代码… </c:forEach>              

示例:

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

(6)使用foreach迭代循环生成表格,并实现表格隔行变色效果

<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"import="java.util.*,entity.*"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>使用foreach进行表格的隔行变色效果</title></head><body><%List<User>list=newArrayList();
list.add(newUser(1, "张三", "123456"));
list.add(newUser(2, "张四", "123456"));
list.add(newUser(3, "张五", "123456"));
list.add(newUser(4, "张六", "123456"));
request.setAttribute("list", list);
%><tableborder="1"width="800px" ; align="center"><tr><th>编号</th><th>id</th><th>姓名</th><th>密码</th></tr><c:forEachitems="${list}"var="user"varStatus="s"><c:iftest="${s.count %2 ==0 }"><trstyle="background-color: red"><%--<td>${s.count}</td><td>${user.id }</td><td>${user.username }</td><td>${user.password }</td>--%></c:if><c:iftest="${s.count % 2 !=0 }"><trstyle="background-color: green"></c:if><td>${s.count}</td><td>${user.id }</td><td>${user.username }</td><td>${user.password }</td></c:forEach></table></body></html>

image.png

10.日期格式获取案例

<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>Inserttitlehere</title></head><body><%Map<String, String>map=newHashMap<String, String>(16);
map.put("tom", "张三");
map.put("lili", "李四");
map.put("jack", "王五");
request.setAttribute("map", map);
request.setAttribute("date", newDate());
%><c:forEachitems="${requestScope.map }"var="name">${name.key}
${name.value}<br></c:forEach><br><fmt:formatDatevalue="${requestScope.date}"pattern="yyyy年MM月dd日 HH:mm:ss"></fmt:formatDate></body></html>

image.png

11.总结:

image.png

相关文章
|
达摩院 Java 大数据
达摩院FunASR实时语音转写服务软件包发布
达摩院FunASR实时语音转写服务软件包发布
1543 0
达摩院FunASR实时语音转写服务软件包发布
|
6月前
|
消息中间件 搜索推荐 调度
RocketMQ实战—8.营销系统业务和方案介绍
本文详细介绍了电商营销系统的业务流程、技术架构及挑战解决方案。涵盖核心交易与支付后履约流程,优惠券和促销活动的发券、领券、用券、销券机制,以及会员与推送的数据库设计。技术架构基于Nacos服务注册中心、Dubbo RPC框架、RocketMQ消息中间件和XXLJob分布式调度工具,实现系统间高效通信与任务管理。针对千万级用户量下的推送和发券场景,提出异步化、分片处理与惰性发券等优化方案,解决高并发压力。同时,通过RocketMQ实现系统解耦,提升扩展性,并利用XXLJob完成爆款商品推荐的分布式调度推送。整体设计确保系统在大规模用户场景下的性能与稳定性。
RocketMQ实战—8.营销系统业务和方案介绍
|
4月前
|
人工智能 自然语言处理 数据可视化
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
1542 1
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
|
安全 算法 数据安全/隐私保护
什么是Boot Guard?电脑启动中的信任链条解析
什么是Boot Guard?电脑启动中的信任链条解析
359 0
|
NoSQL 关系型数据库 MySQL
使用docker compose一键部署多个服务
docker compose 是 docker 官方的开源项目,用来实现对 docker 容器集群的快速编排
阿里云怎么注册商标?(附详细商标注册申请操作流程)
阿里云商标注册分为商标智能注册申请、商标顾问注册申请和商标安心注册申请,本文阿小云以商标智能注册申请为例来详细说下阿里云商标申请图文操作流程:
6319 0
阿里云怎么注册商标?(附详细商标注册申请操作流程)
|
虚拟化 Python 容器
python虚拟环境的安装和搭建
通俗的来讲,虚拟环境就是借助虚拟机来把一部分内容独立出来,我们把这部分独立出来的东西称作“容器”,在这个容器中,我们可以只安装我们需要的依赖包,各个容器之间互相隔离,互不影响。
620 0
python虚拟环境的安装和搭建
|
异构计算
FPGA - 7系列 FPGA内部结构之SelectIO -02- 源语简介(一)
FPGA - 7系列 FPGA内部结构之SelectIO -02- 源语简介
1386 0
FPGA - 7系列 FPGA内部结构之SelectIO -02- 源语简介(一)
|
存储 数据采集 监控
新氧云原生全栈数仓最佳实践
新氧数据中台数据研发部总监 高宏超:自建大数据平台面临困难与挑战,我们从成本、安全、资产管理及组件可扩展性等综合考量后决定整体迁移到阿里云,上云后,总体资源成本降低30%,性能上提升2-3倍,商家、用户、活动等运营体验提升,未来期待更多互动和交流。
1824 0
新氧云原生全栈数仓最佳实践