EL表达式的概述:
在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的做法 会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式。EL是Expression Language
的缩写,它是一种简单的数据访问语言。本节将针对EL表达式进行详细的讲解。
EL(Expression Language) 目的: 为了使JSP写起来更加简单。表达式语言的灵感来自于ECMAScript
由于EL可以简化JSP页面的书写,因此,在JSP的学习中,掌握EL是相当重要的。要使用EL表达式,
首先要学习它的语法。EL表达式的语法非常简单,都是以"${" 符号开始, 以"}" 符号结束的,具体格 式如下:
${表达式}
EL的使用:内置对象
分类 内置对象 描述
作用域 pageScope page作用域
requestScope request作用域
sessionScope session作用域
applicationScope application作用域
请求参数 param 获得一个参数
paramValues 获得一组参数
请求头 header 获得一个请求头
headerValues 获得一组请求头
JSP上下文对象 pageContext
全局初始化参数 initParam
cookie cookie
<%@page import="com.ElDemo.User"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
//获得字符串
String str="华信智原" ;
pageContext.setAttribute("str", str);//将str存入到作用域中 下面就可以取到
%>
${str }<br><%--不在域中 无法获得指定对象 --%>
${pageScope.str }<br><%--page的作用域 --%>
<hr>
<%
//获得数组
String[] arr={"A","B","C"};
pageContext.setAttribute("arr", arr);//没有指定Scope的值 则默认作用域是在page范围
%>
${arr }<br>
${arr[0] }<br>
<hr>
<%
//获得集合(list)中的数据
//创建模拟数据
List<String> list=new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
pageContext.setAttribute("list", list);
%>
${list }<br>
${list[2] }<br>
<hr>
<%
//获得Map<String,JavaBean>的数据
Map<String, User> map2=new HashMap<String,User>();
map2.put("u1",new User("u001","jack",18));
map2.put("u2",new User("u002","rose",21));
map2.put("3",new User("u003","tom",25));
pageContext.setAttribute("map2",map2);
%>
map2:${map2 }<br>
map2.u2:${map2.u2 }<br>
u2.username:${map2.u2.username }<br>
map2[3].username:${map2['3'].username }<br>//通过字符串'3'获得数据
body>
html>
实现结果:
华信智原
华信智原
[Ljava.lang.String;@137d2b6
A
[A, B, C]
C
map2:{3=com.ElDemo.User@bcbc15, u2=com.ElDemo.User@e027e7, u1=com.ElDemo.User@5bc2a1}
map2.u2:com.ElDemo.User@e027e7
u2.username:u002
map2[3].username:u003
//通过字符串’3’获得数据
——————————————————————————
JSTL表达式:
什么是JSTL
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,
是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在
JSP 2.0中也是作为标准支持的。
JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器
(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理
数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库
定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库
包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。
如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing
及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。
从JSP1.1 规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的
重用性。为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商指定可能是不同的,
这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择,为了解决这个问题,Sun公司制定了一套标准标签库
(JavaServer Pages Standard Tag Library),简称JSTL。
JSTL 虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签共同组成的。在JSTL1.1规范中,为这5个
标签库分别指定了不同的URL以及建议使用的前缀,如表1-7所示。
表1-1 JSTL 包含的标签库
标签库 标签库的URL 前缀
Core http://java.sun.com/jsp/jstl/core c
I18N http://java.sun.com/jsp/jstl/fmt fmt
SQL http://java.sun.com/jsp/jstl/sql sql
XML http://java.sun.com/jsp/jstl/xml x
Functions http://java.sun.com/jsp/jstl/functions fn
Core标签库: if标签
在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的
标签,该标签专门用于完成JSP页面中的条件判断,它有两种语法格式 具体如下:
语法1: 没有标签体的情况,将结果存放到指定的作用域(不常用)
语法2: 有标签体的情况,在标签体中指定要输出的内容
body content
在上述语法格式中,可以看到 标签有三个属性,接下来将针对这三个属性进行讲解,具体如下:
● test 属性用于设置逻辑表达式;
● var 属性用于指定逻辑表达式中变量的名字;
● scope 属性用于指定var变量的作用范围,默认值为page。如果属性test的计算结果为true,
那么标签体将被执行,否则标签体不会执行。
通过前面的讲解,我们对 标签有了一个简单的认识,接下来通过一个具体的案例来演示如何在JSP页面中使用
标签。
在WebContent 目录下创建一个名为c_if.jsp的文件, 代码如文件1-15所示。
文件1-2 c_if.jsp
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"
import="java.util.*"%>
<%@ taglib uri="http://java.sum.com/jsp/jstl/core" prefix="c"%>
This is you first visit. Welcome to the site!
启动Tomcat服务器,在浏览器地址栏中输入地址"http://localhost:8080/chapter07/c_if.jsp"访问c_if.jsp页面,
此时,浏览器窗口中显示的结果 如下所示。
This is you first visit. Welcome to the site!
Core标签库:forEach标签
在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个标签,该标签专
门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容,它有两种语法格式,具
体格式如下:
语法1: 迭代包含多个对象的集合
body content
语法2: 迭代指定范围内的集合
body content
在上述语法格式中,可以看到 标签有多个属性。接下来针对这些属性进行讲解,具体如下:
● var属性 用于指将当前迭代到的元素保存到page域中的名称;
● items 属性用于指定将要迭代的集合对象;
● varStatus用于指定当前迭代状态信息的对象保存到page域中的名称;
● begin 属性用于指定从集合中第几个元素开始 进行迭代,begin的索引值从0开始,如果没有指定items属性,
就从begin指定的值开始迭代,直到迭代结束为止;
● step 属性用于指定迭代的步长,即迭代因子的增量。
标签在程序开发中经常会被用到,因此熟练掌握 标签是很有必要的,接下来,通过
几个具体的案例来学习标签的使用。
分别使用标签迭代数组和Map集合,首先需要在数组和Map集合中添加几个元素,然后将数组赋值给
标签的items属性,而Map集合对象同样赋值给标签的items属性,之后使用getKey()和getValue()
方法就可以获取到Map集合中的键和值,如文件1-3 所示
文件 1-3 c_foreach1.jsp
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"
import="java.util.*"%>
<%@ taglib uri="http://java.sum.com/jsp/jstl/core" prefix="c"%>
<%
String[] fruits={"apple","orange","grape","banana"};
%>
String 数组中的元素:
${name}
<%
Map userMap=new HashMap();
userMap.put("Tom","123");
userMap.put("Make","123");
userMap.put("Lina","123");
%>
HashMap集合中的元素:
${entry.key} ${entry.value}
启动Tomcat服务器,在浏览器在地址栏中输入地址"http://localhost:8080/chapter07/c_foreach1.jsp"
访问c_foreach1.jsp页面,此时, 浏览器窗口中的显示结果如下所示
String 数组中的元素:
apple
orangle
grape
banana
____________________________________
HashMap集合中的元素:
Tom 123
Lina 123
Make 123
如上可以看出,在String数组中存入的元素apple、orange、grape和 banana全部被打印出来了,因此可以说明使用
标签可以迭代数组中的元素。Map集合中存入的用户名和密码全部被打印出来了。*在使用标签时,
只需要将userMap集合对象复制给items属性,之后通过entry变量就可以获取到集合中的键和值。*
标签的begin、end和 step属性分别用于指定循环的起始索引、结束索引和步长。使用这些属性可以
迭代集合对象中某一范围内的元素。
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
List list=new ArrayList();
list.add("tom");
list.add("make");
list.add("Lina");
%>
<table border="1">
<tr>
<td>序号td>
<td>索引td>
<td>是否是第一个元素td>
<td>是否是最后一个元素td>
<td>元素的值td>
tr>
<%--varStatus用于指定当前迭代状态信息的对象保存到page域中的名称; --%>
<c:forEach var="name" items="<%=list %>" varStatus="status">
<tr>
<td>${status.count }td>
<td>${status.index }td>
<td>${status.first }td>
<td>${status.last }td>
<td>${name }td>
tr>
c:forEach>
table>
body>
html>