热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

EL表达式JSTL

EL表达式&JSTLEL表达式&EL的内置对象(重点:必须掌握)EL表达式是什么:EL表达式是jsp中的技术ÿ

EL表达式&JSTL


EL表达式&EL的内置对象(重点:必须掌握)

EL表达式是什么:

EL表达式是jsp中的技术,书写格式为:${ 表达式}

表达式作用:要获取数据的名称、执行的运算、要获取的web常用对象。

pageContext:它可以获取其他八个内置对象,可以给四个容器设置和获取数据,它就是上下文对象。


EL使用——获得四个容器(page\request\session\servletContext :域对象)的数据

代码演示:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>
<%-- 需求:获取四个容器中的数据--%><%pageContext.setAttribute("name", "丽丽", 4);pageContext.setAttribute("name", "猩猩", 3);pageContext.setAttribute("name", "噜噜", 2);pageContext.setAttribute("name", "肥肥", 1);%><%=pageContext.APPLICATION_SCOPE %><%=pageContext.SESSION_SCOPE %><%=pageContext.REQUEST_SCOPE %><%=pageContext.PAGE_SCOPE %><hr><%-- ${applicationScope.name }${sessionScope.name }${requestScope.name }${pageScope.name } --%>
<%-- ${name } --%>
获取aa数据: ${aa }
body>
html>

细节:使用pageContext的getAttribute方法或者findAttribute方法从4个容器中取出数据的时候,如果指定的key不存在会得到null,而使用el表达式取出的时候指定的key不存在,页面上什么都没有

其实还可直接这样写:

img对应pageContext中的findAttribute()方法

img


EL使用——解析复杂数据

复杂数据:数组,集合(ListMap),自定义对象(Person User Animal)

<%-- <%@page import="cn.wit.domain.User"%> --%>
<%-- page指令可以写多个 在import属性中,可以一次性导入多个包或则类--%>
<%@ page language="java" import="java.util.*,cn.wit.domain.User" pageEncoding="UTF-8" %>DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>
<%-- el获取复杂数据 --%>
<%//演示数组int[] arr = {666,1888,2333,1024,999};pageContext.setAttribute("arr", arr); %>
可以通过角标获取数据:${arr[0]}
<hr>
<%//演示集合List list = new ArrayList();list.add("白米饭");list.add("咸菜");list.add("紫菜汤");pageContext.setAttribute("list", list); Map map = new HashMap();map.put("sj1", "诺基亚");map.put("sj2", "黑莓");map.put("sj3", "摩托罗拉");map.put("sj4", "大哥大");map.put("aa.bb.cc", "波导手机中的战斗机");pageContext.setAttribute("map", map);
%>
可以通过角标获取数据:${list[0] }
<hr>
通过map的key获取数据
${map.sj1}
${map["aa.bb.cc"]}
<hr>
<%-- EL获取自定义对象 --%>
<%User u = new User();u.setName("李四");u.setAge(18);pageContext.setAttribute("u", u);
%>
通过相同的属性名称获取数据:
${u }
${u.name }
${u.age }
<%-- 所有可以使用点的地方,都可以使用【】获取数据 --%>
${u["age"] }
body>
html>

效果:

img


EL使用——执行运算

1、支持算术运算符:

+ - * / %

2、支持逻辑运算符:

img

3、支持比较运算符:

img

4、empty运算符:检查对象是否为null或“空”

对于自定义对象,检查是否为null

对于集合检查,是否为空(集合存在,但是没有数据)

代码:

<%User user = new User();user.setName("张三");pageContext.setAttribute("user", user);
%>
${empty user }

效果:

显示:False

4、${user!=null?user.name : “”}三元运算

<%User user = new User();user.setName("张三");pageContext.setAttribute("user", user);
%>
${empty user }
<hr>
${user!=null?user.name:"" }

效果:

显示:张三

<%-- 演示El执行运算 --%><%int x = 3; //String y = "4g"; int y = 4;pageContext.setAttribute("x", x);pageContext.setAttribute("y", y);%><%-- 使用EL表达式获取数据,最终都是讲数据转换成字符串,根据字符串,格式化数字,在进行计算 --%><%-- z的数据不存在,不存在的数据,不参与运算 --%>${x+y } ${x-y } ${x*y } ${x/y } ${x%y }<hr><%boolean flag = true;boolean info = false;pageContext.setAttribute("flag", flag);pageContext.setAttribute("info", info);%>${flag && info}${ !info}${flag || info}<hr>${x y } ${x >= y } ${x == y } ${x != y }

注意:当算术运算的时候,如果字符串内容不能解析成数据,则报数字格式化异常。

数字格式化错误:EL取出来的数据无法转换成数字

img


EL的11个内置对象使用

EL表达式它也有自己的内置(直接使用)对象可以直接在EL表达式中使用:

从不同的容器中取值

pageScope

requestScope

sessionScope

applicationScope

剩下7个介绍:


param获取用户提交的请求参数测试代码:${param }效果:img
paramValues获取某个key对应的多个value值(获取页面中checkbox)测试代码:paramValues<{paramValues }<%--相当于getParameterValues() --%>paramValues<{paramValues.username[0] }效果:img
header获取请求头中的信息测试代码:${header }
效果:img
headerValues某个请求头中的多个value值测试代码:headerValues
{headerValues }
headerValues<br><br>
{headerValues.COOKIE[0] }
img
COOKIE它获取到的一个COOKIE数组,获取所有的COOKIE数据测试代码:<%-- ${COOKIE }获取了COOKIE数组,如果获取数组中的指定COOKIE,使用点名称的方式获取 --%> ${COOKIE } ${COOKIE.JSESSIONID.name } ${COOKIE.JSESSIONID.value }
COOKIE测试效果:img
initParam获取的项目的全局配置参数测试配置:shxiaomiwhjd测试代码:img
pageContext它就和JSP内置对象pageContext功能一致(获取其他内置对象:jsp)测试代码:<%-- 使用pageContext,获取了 request,调用request对象的方法–%> ${pageContext.request.contextPath}效果:img

JSTL的核心标签库使用(重点:必须掌握)

标签的由来回顾:

img

Jsp:html和java混杂,维护麻烦:

创建java标签,代替java代码,实现功能。

A公司:A标签库(库:一整套标签)

B公司:B标签库

C公司:C标签库

标签库版本太多,到底用那个?

一些优秀的标签,随着,公司的解体,没有人维护(不更新)

Java标签库,没有统一的管理!!!

Sun公司,推出了一套java标签的标准,根据这个标准,自己制作了一套标签,给所有的Java程序员使用,这个标签就是JSTL。

JSTL的介绍:

img

学习的资料:通过《第8章 标准标签库_0519.doc》这篇文档进行学习

maven引入jslt库包


<dependency><groupId>javax.servlet.jsp.jstlgroupId><artifactId>jstl-apiartifactId><version>1.2version>
dependency>

<dependency><groupId>org.glassfish.webgroupId><artifactId>jstl-implartifactId><version>1.2version>
dependency>

创建新工程:

1)将jar包导入工程

img

2)使用核心标签库,引入标签库到jsp页面中

img

prefix 表示的是 标签的小名。

Uri 表示的是引入那个标签库

当我们使用快捷键出现提示的时候,表示引入标签库成功。

img

注意版本:

img

JSTL标签库提供5大功能(了解):

core:jstl的核心标签库,使用最多(必须掌握)

fmt:格式化的标签(对页面显示数据,格式化,现在都交给前端去做)

functions:jstl中提供对字符串操作的函数库(建议,在数据显示在页面之前,在后台程序中,先格式化好字符串,然后直接显示,不再页面做处理,如果有前端,交给前端处理(Javascript 解析json格式数据))

sql:jstl提供的在jsp页面上书写sql,操作数据库,目前已经不再(不允许)使用(jsp开发模式二(MVC),这个开发模式不允许,在页面操作数据库)

xml:jstl操作xml文件的。目前已经不再使用(页面传递数据,页面解析数据,json格式字符串。)


c:if标签(重点:必须掌握)

作用:相当于java代码中if语句

使用c:if 标签,在JSP页面上可以完成if判断。注意:在JSTL核心标签库中没有c:else

只有if(){}结构没有 if(){}else{}结构

写法: 条件成立的时候,执行标签中的内容

API截图:

img

人话翻译:

Test:属性:判断是否执行标签内的内容(true——执行标签中的内容,false,不执行)。

Var:用来保存test属性的结果(使用var属性给他取个名字),这个结果可以保存到指定的容器中。(如果没有指定容器,默认存入page容器中)

Scope:指定保存数据的容器。

是否支持EL表达式:当前这个属性中是否可以书写EL表达式

属性类型:当前属性可以接受一个什么类型的值

C:if标签异常,如果test属性接受一个不是boolean类型的数据,发生类型转换异常

img

测试代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>
<%-- var 设置一个变量空间,将test的结果保存下来,然后,默认存入page容器中 --%><%-- scope="session" 设置var中的数据保存在哪个容器中--%>
<c:if test="false" var="hehe" scope="session">测试if标签,EL表达式方式
c:if>
pageScope:${pageScope.hehe }
requestScope:${requestScope.hehe }
sessionScope:${sessionScope.hehe }
applicationScope:${applicationScope.hehe }body>
html>

效果:

img


c:choose c:when c:otherwise(重点:必须掌握)

c:choose c:when c:otherwise 相当于:

if(){

}else if(){

} else if(){

}

。。。。。

else{

}

标签它必须与标签一起使用,它表示哪些when和otherwise是在一组的。

使用三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。

c:when ,c:otherwise 属于同一级别标签。同时是c:choose的子标签

测试代码:

<%-- 演示choose when otherwise 标签 --%><%int num = 4;pageContext.setAttribute("num", num);int flag = 1;pageContext.setAttribute("flag", flag);%>
<c:choose><c:when test="${num==1 }">星期一c:when><c:when test="${num==2 }">星期二c:when><c:when test="${num==3 }">星期三c:when><c:when test="${num==4 }">星期四c:when><c:when test="${num==5 }">星期五c:when><c:when test="${num==6 }">星期六c:when><c:when test="${num==7 }">星期日c:when><c:when test="${flag==1 }">白天c:when><c:when test="${flag==2 }">黑夜c:when><c:otherwise>参数不合法c:otherwise>
c:choose>

效果:

img

异常:使用when otherwise标签的时候,一定要写在choose标签内,不然报错

img

异常:一组choose中有多个otherwise,就出现异常。

img

异常:choose标签中不要写java代码

img


c:set和c:out标签

c:set作用:它可以给某个容器中保存数据,或者去修改某个对象的属性值。

注:相当于代替了pageContext.setAttribute

API截图:

img

Var:声明了一个变量空间,用来存储数据(value属性的值)的

Value:要保存的数据

Scope:指定保存在那个容器中

Target:指定要修改的对象

Property:指定要修改的属性

测试代码:

<%@page import="cn.wit.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>
<%-- 演示set标签 --%>
<%-- int i = 0;
var="root" 声明一个变量空间,用来保存数据 (int i )value="${pageContext.request.contextPath }" 给var属性声明的变量空间赋值 ( = 0;)--%>
<c:set var="root" value="${pageContext.request.contextPath }" scope="session">c:set>
${sessionScope.root }
<hr>
<%-- 修改数据演示 --%>
<% pageContext.setAttribute("user", new User()); %>
<%-- target="${user }" 指定要修改的对象property="username" 指定要修改的属性--%>${user }
<c:set target="${user }" property="username" value="柳岩">c:set>${user }body>
html>

效果:

img

c:out 作用:它可以把数据输出到页面上,相当于JSP的内置对象out

API截图:

img

测试代码:

<%@page import="cn.wit.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title heretitle>
head>
<body>
<%-- 演示out标签 --%>
<%-- default设置没有数据的时候,默认输出 --%>
<%pageContext.setAttribute("str", null);
%>
<c:out value="${str }" default="《党的纲领性文件学习》">c:out>
<%-- escapeXml="true" 让浏览器不解析其中的html--%>
<c:out value="&#39;http://www.baidu.com&#39;>测试" escapeXml="false">
c:out>
body>
html>

效果:

img


c:forEach标签(重点:必须掌握)

c:forEach 循环的标签。 实现 java中for循环的功能

API截图:

img

varStatus :保存了当前循环过程中的信息


  1. public java.lang.Integer getBegin()

返回为标签设置的begin属性的值,如果没有设置begin属性则返回null


  1. public int getCount()

返回当前已循环迭代的次数


  1. public java.lang.Object getCurrent()

返回当前迭代到的元素对象


  1. public java.lang.Integer getEnd()

返回为标签设置的end属性的值,如果没有设置end属性则返回null


  1. public int getIndex()

返回当前迭代的索引号


  1. public java.lang.Integer getStep()

返回为标签设置的step属性的值,如果没有设置step属性则返回null


  1. public boolean isFirst()

返回当前是否是第一次迭代操作


  1. public boolean isLast()

返回当前是否是最后一次迭代操作

Foreach不循环对象(集合、数组)的情况下,单单控制循环的次数。

Var:用来设置,保存在page容器中的数据的名称

测试代码:

<%-- 演示foreach标签 --%><%for (int i = 1; i <= 5; i++) {}%><%-- begin="1" int i = 1;end="5" i<=5;step="6" 步长,控制循环,间隔几次循环,执行一次循环体中的内容step="1" 1 2 3 4 5 M M M M Mstep="2" 12 34 5 M M M step="3" 123 45 M M step="4" 1234 5 M M step="5" 12345 M var 保存了控制循环变量数据的值(在foreach标签,不循环对象的时候)varStatus 保存了循环过程中状态信息(索引号、循环总数、是否第一次或者最后一次)的对象--%><c:forEach begin="10" end="15" step="1" var="info" varStatus="sta"><td>${sta.index}td><td>${sta.count}td><td>${sta.first}td><td>${sta.last}td><br>c:forEach>

效果:

img

Foreach循环对象的情况下(数组,集合:list和map)

测试代码:

<%-- 演示foreach,循环对象 --%><%int[] arr = {666,23333,886,9527,82};pageContext.setAttribute("arr", arr);%><%-- var="num" :保存的是数组中的元素 --%><c:forEach items="${arr }" var="num">${num }c:forEach><hr><%List list = new ArrayList();list.add("跑男");list.add("欢乐喜剧人");list.add("极限挑战");list.add("笑傲江湖");list.add("爸爸去哪儿");pageContext.setAttribute("list", list);%><c:forEach items="${list }" var="name">${name }c:forEach><hr><%Map map = new HashMap();map.put("addr1", "东京");map.put("addr2", "东莞");map.put("addr3", "巴黎");map.put("addr4", "东南亚");pageContext.setAttribute("map", map);%><c:forEach items="${map }" var="entry">${entry.value }${entry.key }c:forEach>

开发模式&JavaBean


JavaBean介绍

JavaBean:它是一个简单的Java类。属性要求是private 这个类中拥有get或set方法即可,但要求这个类必须有一个公开的空参数的构造函数。

特点:


  • 一定要有一个无参数的构造函数—public无参的构造函数

  • 属性必须是 private的。

  • 为这个私有的属性,提供公有的访问方法getter ,setter。

注意:目前使用的javaBean是用来封装数据的。

img

提示:后期开发中,这些类一般会保存在名称为domain或者beans.或者entity 或者pojo包中,这是一个开发的习惯,你在公司,拿到公司项目的所有封装数据的Javabean一般都会在这里包中。


JSP开发模式一(早期开发模式,现在已经淘汰了)

img

在JSP刚刚推出的时候,基于JSP出现了JSP开发模式一:

使用JSP处理用户的请求以及响应,使用JavaBean来封装用户的数据

这种模式问题:

1)java代码、html代码、混杂在一起,代码阅读性差

2)维护不方便(前端和后台开发人员都在的情况下,才能维护页面(jsp))

3)耦合性高(处理请求,处理响应,处理业务方法操作数据库方法都写在jsp中)

jsp开发模式一:它可以解决一些小型的需求,但是后期项目需求越来越复杂,这种开发模式已经不行了。JSP页面中的JAVA代码太多难以维护和升级。

耦合性高:所有的代码都拥挤到一个类或者jsp文件中,导致,只要某一个部分出问题,其他功能,也无法执行。


MVC设计(开发)模式(jsp开发模式二)(重点:必须掌握)

掌握:可以画出MVC设计模式的流程图

MVC设计模式:

M:model 模型— 数据模型(JAVABean)。作用: 存取数据。

V:view 视图主要是用来展示数据和页面效果的,jsp

C:Controller 控制器(servlet)。处理请求,调用业务处理方法,给出浏览器响应的作用

控制器:struts2:action springMVC:Controller

JSP开发模式二:

img

总结设计模式实现:

使用JSP显示数据,把JSP当做MVC中的view层。

使用JavaBean封装数据,它是MVC中的Model。模型层

使用Servlet处理用户的请求和响应。它是MVC中的Controller 控制层

优点:耦合性低,可维护性高。程序整体非常清晰。


推荐阅读
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • JSP内置对象之application的作用范围和获取方式
    本文介绍了JSP内置对象之application的作用时间范围、可以在不同浏览器获取的特点,以及获取application对象的方法。通过示例代码展示了在JSP中设置和在servlet中获取application对象的步骤。对于学习JSP内置对象的读者来说,本文具有一定的参考价值。摘要长度为163字。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
author-avatar
鱼红1993
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有