JSP/Servlet开发——第八章 JSTL和EL
1、 EL表达式:
●需要EL表达式的原因: ◆在JSP中使用Java脚本的局限: 1)、在JSP页面中嵌入大量的Java代码; 2)、访问结构比较复杂的数据时代码烦琐,且经常需要强制类型转换; eg:<% Employee employee = (Employee) request.getAttribute("employee"); Computer comp = employee.getComputer(); String manufacturer = comp.getManufacturer(); %> 3)、EL表达式使JSP的开发变得更加简单; eg:${requestScope.employee.computer.manufacturer} |
||||||||||||||||||||||||||||
●EL表达式:EL表达式的全称是 Expression Language , 它是一种借鉴了 JavaScript 和 XPath 的表达式语言,EL表达式定义了一系列的隐含对象和操作符,使开发人员能够很方便地访问页面的上下文,以及不用域内的对象,而无须在 JSP 页面嵌入Java 代码,从而使开发人员即使不熟悉 Java 也能轻松地编写JSP程序; |
||||||||||||||||||||||||||||
●EL表达式的功能:替代JSP页面中数据访问时的复杂编码; |
||||||||||||||||||||||||||||
●EL表达式的特点和使用范围: ◆EL表达式提供了在 Java 代码之外, 访问和处理应用程序数据的功能, 通常用于在某个作用域(page、request、session、application 等) 内取得属性值,或者做简单的运算和判断。 ◆EL 表达式有以下特点: ★自动转换类型转换,在使用 EL 得到某个数据时可以自动转换类型,对于类型的限制比较宽松; ★使用筒单,与 JSP 页面中嵌入的 Java 代码相比,EL表达式使用起来非常简单; eg:每个雇员都拥有一台计算机,如果想得到计算机的生产厂商信息,只需要把该雇员对象放在某个作用域(此处以 request 为例 ) 中,然后在 JSP 页面中调用 ${requestScope.employee.computer.manufacturer}即可; |
||||||||||||||||||||||||||||
●EL 表达式的语法: ${ EL expression } ◆EL表达式的两个要素:$和{ },两者缺一不可; ▲通过变量名取值 ▲获取对象的属性值 ▲获取集合元素 ▲执行表达式 ★1)、点操作符:EL 表达式通常由两部分组成:对象和属性。就像在Java代码中一样,在 EL 表达式中也可以点操作符“.” 来访问对象的某个属性。 eg:通过${ employee.computer }可以访问 employee 对象computer属性,而通过引${ employee.computer.manufacturer}则可以访问某个雇员所使用的计算机的产厂商; ★2)、[ ]操作符:与点操作符类似,“[ ]”操作符也可以访问对象的某个属性,${ employee[“computer”] }可以访问雇员的计算机属性。但是,除此之外,“[ ]”操作符还提供了更加强大的功能: ▲当属性名中包含了特殊字符如 “.”或 '一’ 等的情况下,就不能使用点操作符来访问,这时只能使用 ”[ ]" 操作符; ▲访问数组,如果有一个对象名为 array 的数组,那么可以根据索引值来访问其中的元素,如:${array[0]}、${array[1]}等; ▲“[ ]”操作符中可以使用变量实现动态访问,如 ${employee[propertyNamel],propertyName是另一个变量,改变其值可以动态访问employee的不同属性; eg1:<body> <% // 在Servlet或JSP中保存数据 Map names = new HashMap(); names.put("one", "LiYang"); names.put("two", "WangHua"); request.setAttribute("names", names); %> // 在JSP中访问数据 姓名:${ names.one }<br/> 姓名:${ names["two"] }<br/> </body> 分析:在eg1的代码中,使用了 Map 存储姓名的集合,在 JSP 页面中则分别调用了 EL 表达式的两运算符进行姓名的输出显示: 输出结果:
eg2:<body> <% // 在Servlet或JSP中保存数据 List names = new ArrayList(); names.add(0, "LiYang"); names.add(1,"WangHua"); request.setAttribute("names",names); %> // 在JSP中访问数据 姓名:${ names[0] }<br/> 姓名:${ names[1] }<br/> </body> 分析:在eg2的代码中,使用了List存储姓名的集合,在 JSP 页面中则使用[ ]指定元素下标:输出结果如下:
|
||||||||||||||||||||||||||||
●${变量名} eg: // 在Servlet或JSP中保存数据 request.setAttribute("username", "LiYang"); // 在JSP中访问数据 姓名: ${username} ${requestScope.username} 分析:按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null; ▲指定作用域:
|
||||||||||||||||||||||||||||
●关系操作符:
|
||||||||||||||||||||||||||||
●逻辑操作符:
|
||||||||||||||||||||||||||||
●Empty操作符:Empty操作符是一个前缀操作符,用于检测一个变量值是否为 null或者为empty ( 如长度为 0的字符串变量或集合变量)。例如,变量 a 不存在,则${ empty a }返回的结果为true,${ not empty a }或${ ! empty a }返回的结果为false; |
2、 EL表达式隐式对象:
●JSP提供了 page、request、session、application. pageContext 等若干隐式对象。这些隐式对象无需声明,就可以很方便地在 JSP 页面中使用。相应地,在 EL 表达式语言中也提供了一系列可以直接使用的隐式对象。EL 隐式对象按照使用途径的不同分为作用域访问对象、参数访问对象和JSP隐式对象; ★如下图:
|
||||||||||
●作用域访问对象:开发 Java Web 应用时,可以把变量存放在不同作用域中以满足不同范围的访问需求,作用域共有四个选项:page、request、session、application。在 EL 表达式中,为了访问这四个作用域内的变量和属性;
★当使用 EL 表达式访问某个变量时,应该指定查找的范围,如 ${requestScope.employee}即在请求作用域范围内查找 employee 变量,如果不指定查找范围,即${ employee},则会按照 page - request- session - application 的顺序依次查找 employee 变量; |
||||||||||
●参数访问对象:参数访问对象是与页面输入参数有关的隐式对象,通过它们可以得到用户的请求参数;
◆两者之间的不同之处在于,param 对象用于得到请求中单一名称的参数,而paramValues对象用于得到请求中的多个值。 例如:在用户注册时 通常只填写一个名为 userName 的参数,那么就可以用${param:username}来访问此参数,等同于调用 request.getParameter (“usernames”);而在用户注册时,也可以选择多个业余爱好 (habits) ,这样通过${paramValues:habits}可以得到用户所有选择的值等同于调用request.getParameterValues ( “habits”); |
||||||||||
●JSP 隐式对象:为了能够方便地访问 JSP 隐式对象,EL表达式语言引入了pageContext;它是 JSP和EL的一个公共对象,通过 pageContext 可以访问其他八个 JSP 内置对象,这也是EL表达式语言把它作为内置对象的一个主要原因;
|
3、JSTL标签:
●EL表达式封装了数据访问的功能,而JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能,二者结合使用才能完整实现动态页面的开发需求; |
●JSTL 的全称是 Java Server Page Standard Tag Library , 即 JSP 标准标签库。它包含了在开发JSP页面时经常用到的一组标准标签,这些标签提供了一种不用嵌入Java 代码就可以开发复杂的JSP页面的途径。JSTL 标签库包含了多种标签,如通用标签、条件判断标签和迭代标签等。 |
●优点:提供一组标准标签、可用于编写各种动态功能; |
●使用JSTL的步骤: 1)、在工程中引用 JSTL 的两个jar文件和标签库描述符文件 (扩展名为 .tld)。 ◆正如使用JDBC连接数据库那样,使用 JSTL定义的标签库也必须在工程中导入两个jar文件,jstl.jar和standard.jar,除此以外,标签库描述符文件也是必需的,这些资源都能在网上下载得到。 ◆在 MyEclipse 中已经集成了 JSTL,因此这一过程可以由工具代为实现,方法如下:首先执行 'File' — 'New' — 'Web Project' 命令, 弹出 'New Web Project'窗口,在该窗口中的’J2EE Specification Level' 选项组中选中 ’J8va EE 5.0" 或 “ Java EE 6.0' 单选按钮,MyEclipse会自动在项目中添加 JSTL 所需的jar文件和标签库描述符文件。而如果选择更低的版本,则需要勾选“Add JSTL Libraries to WEB-INF/lib folder?“复选框;如图所示,然后单击 ’Finish' 按钮;
2)、在需要使用 JSTL 的 JSP 页面中使用 taglib 指令导入标签库描述符文件,例如,要使用JSTL核心标签库,需要在 JSP 页面的上方增加如下的 taglib 指令: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ◆taglib 指令通过 uri 属性引用某个标签库的配置文件, JSP 页面中通过 prefix 属性指定的前缀即可访问该标签库中的某个标签功能,语法:<c:标签名> 3)、使用JSTL标签; |
●JSTL 核心标签库:顾名思义,核心标签库在 JSTL 中占有十分重要的地位。JSTL 核心标签库按照功能的不同又为通用标签库、条件标签库、迭代标签库等;
|
◆通用标签库:通用标签库用于在 JSP 页面内设置、显示和删除变量,它包含三个标签:<c:set>、<c:out>、<c : remove>; ▲<c:set>标签:<c:set>标签用于设置作用域变量的值或者作用域变量的属性值,其语法格式分为如下两种 (1) 将 value 值存储到范围为 scope 的变量 variable 中: <c:set var="variable" value="value" scope="scope" /> ★var:属性的值是设置的变量名 ★value:属性的值是赋予变量的值 ★scope属性对应的是变量的作用域,可选值有 page、request、 session和application eg:在请求范围内将变量 currentlndex 的值设置为 8,用<c:set>标签可以写为: <c:set va=“currentlndex“value=”8“ scope="request"> (2) 将value值设置到对象的属性中: <c:set target="target" property="property" value="value" /> ★property属性:对应 JavaBean 对象的属性名 ★value 属性是赋予 Java8ean 对象属性的值; eg: // 在Servlet或JSP中设置JavaBean User user = new request.setAttribute("user", user); // 在JSP中修改JavaBean的属性值 <c:set ▲<c:out>标签:<c:out>标签用于将计算的表达式结果输出显示,类似于 JSP 中的<%=%>,但是功能更加强大,代码也更加简洁,方便页面维护。 ◆其语法格式分为指定默认值和不指定默认值两种形式: 1)、不指定默认值: 语法:<c:out ★value 2)、指定默认值: 语法:<c:out ★default ★<c:out>标签还有一个escapeXml属性:表示是否转换特殊字符,用于指定在使用<c:out>标签输出诸如<、>或 ` 或 “ 或 <p>${ <p> <c:out escapeXml="false" </p> <p><c:out value="<a 运行结果:
分析:从运行效果可以看出,将<c:out>标签的 escapeXml 属性设置为 'false“ 与直接使用 EL 表达式效果相同; ▲<c 语法:<c:remove var="variable" scope="scope" /> ★var 属性是指待移除的变量的名称; ★scope属性是指移除的变量所在的范围,可选项有 page、request、session、application,如果没有指定,则默认为 page; eg:在下面示例中,首先使用<c:set>标签在 page 范围内设置一个变量的值,通过<c:out>标签把该量显示在页面上,然后用<c : remove>标签在page 范围内删除该变量,并使用<c:out>标签检查该量是否已经删除;
运行结果:
|
◆条件标签库:JSTL 的条件标签包括<c : if> ▲<c : if>标签:用于实现 Java 语言中 if 语句的功能; 语法: <c:if 主体内容 </c:if> ★test ★var ★scope eg:使用if标签判断是否登录:
▲<c : choose>标签:<c : choose>、<c:when>和<c 语法:<c:choose <c:when 内容1 </c:when> <c:when 内容2 </c:when> …… <c:otherwise> 内容n </c:otherwise> </c:choose > ★<c : ★<c:when>标签必须有一个直接的父标签<c : ★<c : otherwise>标签必须有一个直接的父标签<c : ★在运行时,判断<c:when>标签的测试条件是否为 true , 第一个测试条件为 true 的<c:when>标签体被 JSP 容器执行。如果没有满足条件的<c:when>标签 , 那么<c : otherwise>的标体将被执行;
|
◆迭代标签库:<c:forEach>标签有两种语法格式:一种用于遍历集合对象的成员,另一种用于使语句循环执行指定的次数; ▲遍历集合对象的成员: 语法: <c:forEach …循环体代码… </c:forEach> ★var属性是对当前成员的引用, 即如果当前循环到第一个成员,var 就引用第一个成员,如果当前循环到第二个成员,它就引用第二个成员. 以此类推; ★ items:指被迭代的集合对象; ★varStatus 属性用于存放 var 引用的成员的相关信息,如索引等; ★begin 属性示开始位置, 默认为 0, 该属性可以省略; ★end 属性表示结束位置,该属性可以省略; ★step 表示循环的步长,默认为 1,该属性可以省略; ▲指定语句执行次数: 语法:<c:forEach var="varName" varStatus=" varStatusName" …循环体代码… </c:forEach> ★var 属性是对当前成员的引用; ★varStatus ★begin属性表示开始位置, 默认为 0, 该属性可以省略; ★end ★step属性表示循环的步长, 默认为 1, 该属性可以省略格式; ■格式2 与格式 1 的区别是:格式 2 不是对一个集合对象遍历, 而是根据指定的 begin 属性、 end属性以及 |
4、JSTL遍历集合:
数组或集合 |
访问方式 |
int[] ages = { 1, 2, 3, 4, 5 }; // 普通数组,JSTL直接使用JSP赋值表达式来取 |
遍历数组: <c:forEach var="age" items="<%= ages %>"> <c:out value="${age}" /> </c:forEach> |
List<String> names = new LinkedList<String>(); // List names.add("Biao"); names.add("彪"); names.add("雷"); request.setAttribute("names", names); // 添加到request |
遍历List: <c:forEach var="name" items="<%= names %>"> <c:out value="${name}" /> </c:forEach>
遍历List: <c:forEach var="name" items="${names}"> <c:out value="${name}" /> </c:forEach> |
List<User> users = new ArrayList<User>(); // JavaBean的List users.add(new User("黄彪", "xxxxxx")); users.add(new User("昊天", "xxxxxx")); users.add(new User("姐姐", "yyyyyy")); users.add(new User("丫头", "zzzzzz")); session.setAttribute("users", users); // 添加到session |
遍历UserBean的List: <c:forEach var="user" items="${users}"> <c:out value="${user.username}"/> <c:out value="${user.password}"/> </c:forEach> |
Set<String> set = new TreeSet<String>(); // Set set.add("One"); set.add("One"); set.add("Two"); set.add("Three"); set.add("Set"); |
遍历Set: <c:forEach var="entry" items="<%= set %>"> <c:out value="${entry}" /> </c:forEach>
|
Map<String, String> map = new HashMap<String, String>(); // Map map.put("1", "黄彪"); map.put("2", "丫头"); map.put("3", "哥哥"); map.put("4", "笨蛋"); |
遍历Map: //注意:遍历map时候var="entry"只能这么写; <c:forEach var="entry" items="<%= map %>"> key:<c:out value="${entry.key}"/> value:<c:out value="${entry.value}"/> </c:forEach> |
5、总结:
|
JSP/Servlet开发——第八章 JSTL和EL的更多相关文章
- 基于JSP+Servlet开发手机销售购物商城系统(前台+后台)源码
基于JSP+Servlet开发手机销售购物商城系统(前台+后台) 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MySQL数据库 运行效果图: ...
- 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码
基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...
- 一、jsp和Servlet基础理论及jstl和EL表达式用法
1.题外话:使用JSP有近一年半的时间了,但是开发量不大.昨天部门突然让做个读取EXCLE文件,然后在前台页面进行展示.并通过点击查看按钮可以对每条明细记录进行跳转后进行详情查看,并按照页面原型进行页 ...
- windows7_下Eclipse中部署tomcat7.0进行JSP+servlet开发
环境:windows 7+EclipseJava EE IDE for Web Developers +tomcat 7.02 插件:tomcatPluginV321.zip(百度搜索下载即可) 一. ...
- JSP+Servlet开发物流管理系统 源码
开发环境: Windows操作系统开发工具:Myeclipse+Jdk+Tomcat+MYSQL数据库 运行效果图:
- Web(Jsp+ Servlet)开发中如何解决中文乱码问题
1.中文乱码的成因 编码的字符集和解码的字符集不一致. 2.web开发过程中可能出现的乱码的位置及解决方案 ①request乱码 在向服务器传递数据时,所传递的中文有可能出现乱码. post请求(协议 ...
- IntelliJ IDEA 配置JSP & Servlet开发环境
首先我们要安装和配置好JAVA和TOMCAT,这里不再详细描述 下载地址: JAVA:https://www.oracle.com/technetwork/java/javase/downloads/ ...
- 基于JSP+Servlet开发在线租车系统 java 源码
运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以.IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8. ...
- JSP/Servlet开发——第七章 Servel基础
1.Servlet简介: ●Servlet是一个符合特定规范的 JAVA 程序 , 是一个基于JAVA技术的Web组件. ●Servlet允许在服务器端,由Servlet容器所管理,用于处理客户端请求 ...
随机推荐
- vs2010开发activex(MFC)控件/ie插件(二):js传参数
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802075 js传参数给activex控件. 过程为:js变量通过activex类的属 ...
- Python爬虫教程-25-数据提取-BeautifulSoup4(三)
Python爬虫教程-25-数据提取-BeautifulSoup4(三) 本篇介绍 BeautifulSoup 中的 css 选择器 css 选择器 使用 soup.select 返回一个列表 通过标 ...
- python的异常处理和模块发布安装
1.完整的异常处理 异常处理能够保证程序出错是也能够完整运行,不会应为bug而停止运行,这里介绍下获取异常的完整格式 try: num = int(input("输入整数:")) ...
- Android进入页面开始就自动弹出软键盘
EditText edittext = (EditText)findViewById(R.id.edittext); edittext.setFocusable(true); edittext ...
- delphi 获取可执行文件的当前路径
在Delphi SysUtils 单元中有 ExtractFileDir 与 ExtractFilePath两个类似的函数, 两个函数有以下的区别: ExtractFilePath 传回值的最後一个字 ...
- javax.swing.JComponent 调用顺序
网上截取的,感觉挺有用,记录下来. http://bbs.csdn.net/topics/310041707 java swing 感觉好复杂啊…………一点都不想用但是作业要用到 >_<; ...
- SQL Server 2014 聚集列存储
SQL Server 自2012以来引入了列存储的概念,至今2016对列存储的支持已经是非常友好了.由于我这边线上环境主要是2014,所以本文是以2014为基础的SQL Server 的列存储的介绍. ...
- Markdown学习使用
本文记录Markdown的基础应用. 一.基础知识 Markdown 是一种标记语言 文件后缀名:.md 编辑工具:VSCode(visual studio code) VSCode中预览模式快捷键: ...
- skype for business server2015部署向导启动服务失败
命令行执行start-cspool失败 解决: 1.cmd执行servers.msc打开服务列表,将所有skype服务启动,默认是延迟启动 2.用管理员权限打开cmd,而不是普通权限 重新执行启动服务 ...
- June 29th 2017 Week 26th Thursday
Hope for the best, but prepare for the worst. 做最好的期望,做最坏的打算. Always remember that quotes about being ...