一、EL简述
EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。
脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。
它的形式如: < %=request.getParameter(“username”)% > 等价于 ${ param.username }可以非常方便的嵌入到html代码中
注意:
<%@ page isELIgnored="true" %> jsp文件头中,用该命令表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
1、语法结构
${expression}
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?或- ,等并非字母或数字的符号时,就一定要使用“[ ]“。
例如: ${user.My-Name}应当改为${user["My-Name"] } ,因为属性名中有"-"
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。
例如:${sessionScope.user[data]}中data 是一个变量
3、变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
属性作用域范围,在EL中从上往下取。如果在page没取到${username}值,就会再找request中的值,最后都没取到就返回null
1.Page PageScope
2.Request RequestScope
3.Session SessionScope
4.Application ApplicationScope
对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:
术语 | 定义 |
---|---|
pageScope |
将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。 |
requestScope |
将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。 |
sessionScope |
将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:
|
applicationScope |
将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。 |
4、操作符
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
术语 | 定义 |
---|---|
算术型 |
+、-(二元)、*、/、div、%、mod、-(一元) |
逻辑型 |
and、&&、or、||、!、not |
关系型 |
==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。 |
空 |
空操作符是前缀操作,可用于确定值是否为空。 |
条件型 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 |
5、表达示中的关键字
文字 | 文字的值 |
---|---|
Boolean |
true 和 false |
Integer |
与 Java 类似。可以包含任何正数或负数,例如 24、-45、567 |
Floating Point |
与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567 |
String |
任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。 |
Null | null |
6、隐式对象
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:
pageContext |
JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。 |
此外,还提供几个隐式对象,允许对以下对象进行简易访问:
术语 | 定义 |
---|---|
param |
将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。 |
paramValues |
将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。 |
header |
将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。 |
headerValues |
将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。 |
cookie | 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。 |
initParam | 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。 |
7、代码示例
//先封装一个用户对象
package com.openbox.jspservlet;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserBean {
private int uid;
private String username;
private String password;
}
//创建一个servlet对象,用于处理数据,然后通过forward方法跳转到jsp页面显示出来
package com.openbox.jspservlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("all")
@WebServlet("/el")
public class ELjsp extends HttpServlet{
private static UserBean userBean;
@Override
public void init() throws ServletException {
super.init();
//初始化一个用户对象
userBean = new UserBean();
userBean.setUsername("王宝强");
userBean.setPassword("1122");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//forward方法传一个userBean对象到jsp页面中
req.setAttribute("userBean", userBean);
req.getRequestDispatcher("/jsp/el.jsp").forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>接收传过来的userBean对象:取对象中的属性可以用方法:${userBean.getUsername()},也可以用等同的在UserBean对象中定义的字段名</h3>
<form>
用户名:<input type="text" name="username" value="${userBean.username}">
<br>
密码:<input type="text" name="password" value="${userBean.password}">
</form>
</body>
</html>
EL表达式很好用,JSP默认就支持,它能保证HTML代码不混乱,但是没有语句、函数的支持。所以还要通过另外一个JSTL标签库来支持,在JSP中通过<%@ taglib %>来引入。
二、JSTL标签库
1.JSTL简介
JSTL全名为JavaServer Pages Standard Tag Library ,JSTL是由JCP(Java Community Process)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签函数库。
Web程序员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。
2.JSTL的引入
最简单的方式,是在tomcat中找到这两个包,引包就可以使用。
在以前的版本中tomcat一共有两个jar包: (1)standard.jar ,(2) jstl.jar 复制过来,如下一样操作。
在TOMCAT 8.0版本中,在tomcat目录中找到webapps\examples\WEB-INF\lib 下有两个包:
taglibs-standard-impl-1.2.5.jar 和taglibs-standard-spec-1.2.5.jar 直接复制到你项目的lib中,添加到build path中就可以引用了。
然后,在jsp文件中用<%@ tablib %>引用
<!-- 引入jstl标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core_1_1" prefix="c" %>
3.核心库使用
标签库中共有5个库:
标签库 URI 前缀 使用模式
-------------------------------------------------------------------------------------------------
核心标签库 http://java.sun.com/jsp/jstl/core_1_1 c <c:tagname…>
国际化标签(I18N) http://java.sun.com/jsp/jstl/fmt fmt <fmt:tagname…>
SQL标签库 http://java.sun.com/jsp/jstl/sql sql <sql:tagname…>
XML标签库 http://java.sun.com/jsp/jstl/xml x <x:tagname…>
函数标签库 http://java.sun.com/jsp/jstl/functions fn <fn:tagname…>
一般只使用核心标签库和格式化标签库。
JSTL 核心标签库(C标签)标签共有13个,功能上分为4类:
1.表达式控制标签:out、set、remove、catch
2.流程控制标签:if、choose、when、otherwise
3.循环标签:forEach、forTokens
4.URL操作标签:import、url、redirect
3.1 c:forEach> 标签
为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。
<c:forEach> 标签的 属性说明 :
<c:forEach> 标签的 属性 : varStatus属性: 它的提供另外四个属性:index,count,fist和last,它们个自的意义如下:
- 属性 类型 意义
- index number 现在指到成员的索引
- count number 总共指到成员的总和
- first boolean 现在指到成员是否为第一个
- last boolean 现在指到成员是否为最后一个
3.2代码示例
//java servlet代码
package com.openbox.jspservlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/jstl")
public class JSTLjsp extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<String> list=new ArrayList<>();
list.add("王宝强");
list.add("马上容");
list.add("宋喆");
list.add("潘金莲");
for (String string : list) {
System.out.println(string);
}
//设置要共享的数据
req.setAttribute("list",list);
//forward跳转
req.getRequestDispatcher("/jsp/jstl.jsp").forward(req, resp);
}
}
//jsp代码,使用EL+JSTL 取值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入jstl标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core_1_1" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>使用JSTL标签,循环取出list对象中的数据</h3>
<c:forEach items="${list}" var="li" >
名称:${li}
<c:if test="${li eq '宋喆'}" >-----${li}是小三 </c:if><br>
</c:forEach>
<h3>数组循环</h3>
<c:forEach var="num" begin="0" end="10" step="1">
${num}
</c:forEach>
<br>
这是的el \${} 能取到num的值是,因为内部做了pageCentext.setAttribute("num",num);这项工作,
所以el能取到值
</body>
</html>
3.3 <c:set> 标签
主要用来将变量储存至JSP范围中或是JavaBean的属性中。
<c:set> 标签的语法 说明 :
语法1:将value的值储存至范围为scope的 varName 变量之中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
语法2:将本体内容的数据储存至范围为scope的 varName 变量之中
<c:set var="varName" [scope="{ page|request|session|application }"]>
… 本体内容
</c:set>
语法3:将 value的值储存至 target 对象的属性中
<c:set value="value" target="target" property="propertyName" />
语法4:将本体内容的数据储存至target 对象的属性中
<c:set target="target" property="propertyName">
… 本体内容
</c:set>
<c:set> 标签的 属性说明 :
3.4 <c:remove> 标签
主要用来移除变量。
<c:remove> 标签的语法 说明 :
<c:remove var="varName" [scope="{ age|request|session|application }"] />
3.5 <c:if> 标签
用途就和我们一般在程序中用的if一样。
<c:if> 标签的语法 说明 :
语法1:没有本体内容(body)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
语法2:有本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本体内容
</c:if>
<c:if test="${item['domain']!=null}">
内容
</c:if>
<c:if test="${!empty permissionMap}">
内容
</c:if>
3.6 <c:choose>标签
<c:choose when otherwise> 标签的语法 说明 :
<c:set var="score">85</c:set>
<c:choose>
<c:when test="${score>=90}"> 你的成绩为优秀!</c:when>
<c:when test="${score>=70&&score<90}">您的成绩为良好! </c:when>
<c:when test="${score>60&&score<70}"> 您的成绩为及格 </c:when>
<c:otherwise> 对不起,您没有通过考试!</c:otherwise>
</c:choose>
4.格式化标签库
JSTL格式化标签又称为I18N标签库,主要用来编写国际化的WEB应用,使用此功能可以对一个特定的语言请求做出合适的处理。
例如:中国内地用户将显示简体中文,台湾地区则显示繁体中文,使用I18N格式化标签库还可以格式化数字和日期,例如同一数字或日趋,在不同国家可能有不同的格式,使用I18N格式标签库可以将数字和日期格式为当地的格式。
在JSP页面中要使用到格式化标签,需要引入下面的语句:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"% > 只介绍日期格式化标签:<fmt:formatDate />
4.1:<fmt:formatDate />
value 用来格式化的时间或日期
type 指定格式化的是日期还是时间,或者两者都是取值范围:date,time,both
pattern 自定义格式化样式
dateStyle 日期的格式化样式
timeStyle 时间的格式化样式
timeZone 指定使用的时区
var 存储格式化后的结果
scope 指定存储的范围
<!--自定义日期时间显示格式-->
<fmt:setLocale value="zh_cn" />
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy/MM/dd hh:mm:ss" /><br>
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy-MM-dd HH:mm:ss" /><br>
<fmt:formatDate value="<%=new Date()%>" pattern="yyyy年MM月dd日 hh小时mm分钟ss秒"/><br>
<fmt:formatDate value="<%=new Date()%>" pattern="yy/MM/dd hh:mm:ss" /><br>