一、EL表达式简介
EL全名为Expression Language,它的出现主要是替代<%= %>脚本表达式
它有四大的作用:
1.1 获取数据
1.2 执行运算
1.3 获取web常见的开发对象
1.4 调用java方法
二、EL的作用详解
上面已经简单的介绍EL的四大作用,但是具体有什么作用,下面会详细的介绍
2.1 获取数据
获取数据也就是获取属性
它的语法是:${标识符}
EL能获取javabean属性、数组、Collection、Map类型集合的数据
看下面的综合案例:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.javabean.Persion;"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>获取常数</h1><hr>
${"这是常数"}
<h1>获取域中的变量</h1><hr>
<%
String name="小红";
pageContext.setAttribute("name",name);
%>
${name}
<h1>获取数组中的数据</h1><hr>
<%
String[] names={"小红","小明","小黑","小黄"};
pageContext.setAttribute("names",names);
%>
${names[2]}
<h1>获取集合中的数据</h1><hr>
<%
ArrayList list=new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
pageContext.setAttribute("list",list);
%>
${list[2]}
<h1>获取map中的数据</h1><hr>
<%
//Map<String,String> map=new HashMap();
//pageContext.setAttribute("map",map);
%>
// ${map["map"]}
<h1>获取javabean的数据</h1>
<%
Persion p=new Persion();
p.setName("小雪");
p.setAge("23");
pageContext.setAttribute("p",p);
%>
${p.name}
${p["age"] }
</body>
</html>
在浏览器中输入:http://localhost/Day06/EL/el1.jsp,即可显示:
我们将转换过来的servlet看看有什么独特的地方:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.42
* Generated at: 2015-08-05 14:09:28 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp.EL;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import com.javabean.Persion;;
public final class el1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" \r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" <h1>获取常数</h1><hr>\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${\"这是常数\"}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" \r\n");
out.write(" <h1>获取域中的变量</h1><hr>\r\n");
out.write(" ");
String name="小红";
pageContext.setAttribute("name",name);
out.write("\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${name}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" \r\n");
out.write(" <h1>获取数组中的数据</h1><hr>\r\n");
out.write(" ");
String[] names={"小红","小明","小黑","小黄"};
pageContext.setAttribute("names",names);
out.write("\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${names[2]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" \r\n");
out.write(" <h1>获取集合中的数据</h1><hr>\r\n");
out.write(" ");
ArrayList list=new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
pageContext.setAttribute("list",list);
out.write("\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${list[2]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" \r\n");
out.write(" <h1>获取map中的数据</h1><hr>\r\n");
out.write(" ");
Map<String,String> map=new HashMap();
pageContext.setAttribute("map",map);
out.write("\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${map[\"map\"]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" <h1>获取javabean的数据</h1>\r\n");
out.write(" ");
Persion p=new Persion();
p.setName("小雪");
p.setAge("23");
pageContext.setAttribute("p",p);
out.write("\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${p.name}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" ");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${p[\"age\"] }", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("\r\n");
out.write(" \r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
上面的数据都是先存储在域里面,然再拿出来的
先存储
pageContext.setAttribute("names",names);
再拿出来
${names[2]}
上面的在转换的servlet是这样的:
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${names[2]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
语法:${运算表达式}
(1)算数运算:所有参与元算的元素都会被转成数字,如果不能转就报错,空元素参与运算当作没参与。
(2)关系运算:
(3)逻辑运算:
(4)empty/not empty判断一个对象或集合或数组是否为空或长度为0
(5)三元表达式 name == null ? "张三" : name;
下面的案例:
2.3 获取web开发常用对象
${对象名称}
有11个常用的对象名称
pageContext:代表pageContext对象,注意和pageScope进行区分
pageScope:代表page域,可以用来获取page域中的属性
reqeustScope:代表reqeust域,可以用来获取reqeust域中的属性
sessionScope:代表session域,可以用来获取session域中的属性
applicationScope:代表application域,可以用来获取application域中的属性
param 代表请求参数组成的map集合${param.userName}
paramValues 代表请求参宿组成的map集合,但是此集合的value是String[],用来获取一名多值的param
header 获取请求头组成的map
headerValues 获取请求头组成的map但是value是一个String[],用来获取一名多值的head
cookie 获取cookie组成的map对象,此map的值是一个cookie对象${cookie.cookieName.cookieValue}
initParam 以map封装的web.xml中配置的整个web应用的初始化参数
具体的解释:
!pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
!pageScope -- page域中属性组成的Map
!requestScope -- request域中属性组成的Map
!sessionScope -- session域中属性组成的Map
!applicationScope --application域中属性组成的Map
!param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>
header -- 所有请求头组成的Map<String,String>
headerValues -- 所有请求头组成的Map<String,String[]>
!cookie -- 所有cookie信息组成的Map<String,Cookie>
initParam -- 所有web应用的初始化参数组成Map
先讲
!pageScope -- page域中属性组成的Map
!requestScope -- request域中属性组成的Map
!sessionScope -- session域中属性组成的Map
!applicationScope --application域中属性组成的Map
案例:el4.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
pageContext.setAttribute("name","li");
request.setAttribute("name","wang");
%>
<%
String name1=(String)pageContext.getAttribute("name");
String name2=(String)request.getAttribute("name");
out.write("java实现的:"+name1+"<br>");
out.write("java实现的:"+name2+"<br>");
%>
${pageScope.name}
${requestScope.name}
</body>
</html>
然后在浏览器中输入:http://localhost/Day06/EL/el4.jsp 即可显示:
sessionScope和applicationScope 的功能相似,就不介绍了
下面讲
param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>
案例:
param的意思就是参数的map集合,但是里面只能取一个参数
el5.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${param.name}
</body>
</html>
当浏览器输入:
可以获得参数
但是如果参数是多个的话,那么只能获得第一个参数
那么如何解决这个问题?这就需要用paramValues
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${paramValues.name[2]}
</body>
</html>
这个时候就可以显示出了指定的参数了
下面的讲
header
headerValues
案例el6.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${header.Accept}
${header["Accept-Language"]}
</body>
</html>
上面的代码就是将下面的header获取出来
在浏览器中输入:http://localhost/Day06/EL/el6.jsp 即可得到
下面讲
cookie
先看默认有多少个cookie, 可以看出,只要一个默认的cookie
看下面
那么可以用el表达式获取数值
el7.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Cookie[] cs=request.getCookies();
for(int i=0;i<cs.length;i++){
out.write(cs[i].getValue());
}
%>
${"<br>"}
${cookie.JSESSIONID}
${"<br>"}
${cookie.JSESSIONID.name}
${"<br>"}
${cookie.JSESSIONID.value }
</body>
</html>
上面是用java代码获取的,下面是用EL表达式获取的,注意下面三种表达式有什么区别:
在浏览器中输入:http://localhost/Day06/EL/el7.jsp
可以显示:
下面讲
initParam-———所有web应用的初始化参数组成Map
先在web.xml设置配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>name1</param-name>
<param-value>hhhh</param-value>
</context-param>
<context-param>
<param-name>name2</param-name>
<param-value>jjjj</param-value>
</context-param>
</web-app>
然后可以建立el8.jsp获取上面的值
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${initParam.name1 }
</body>
</html>
在浏览器中输入:http://localhost/Day06/EL/el8.jsp 可显示
2.4 调用java方法
调用过程:
写一个类其中包含要被el调用的方法,这个方法必须是静态的方法
写一个tld文件在其中对要被调用的静态方法进行一下描述
在jsp页面中taglib指令将tld文件引入当前jsp页面,从而在jsp页面中就可以调用描述好的方法
先写一个java类,里面包含静态方法
package com.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class ELFunc {
//里面要包含静态方法
public static String myEncode(String str,String encode){
try {
return URLEncoder.encode(str, encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
如何调用,先写一个tld文件来描述:
注意tld文件写在那里是有规定的,应该写在WEB-INF 目录下,但是不能写在lib目录和classes 目录下
新建tld
第一步:
第二步:
第三步:
上面新建了一个tld,这时候就要引入java方法,但是因为没有提示,所以在之前先做提示
在web-jsptaglibrary_2_0.xsd"前面添加这段代码:http://java.sun.com/xml/ns/j2ee
这时候就有提示了:
这时候就可以描述java代码了
tld变成这样了:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>cuixueyong</short-name>
<uri>http://www.cuixueyong.com</uri>
<function>
<name>jk</name>
<function-class>com.util.ELFunc</function-class>
<function-signature>java.lang.String myEncode(java.lang.String,java.lang.String)</function-signature>
</function>
</taglib>
下面解释是到底有什么含义:
新建好了上面的,这时候就要建jsp 文件用EL表达式引进:
el10.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://www.cuixueyong.com" prefix="hh"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${hh:jk("中文","utf-8")}
</body>
</html>
上面的都是什么意思?下面的图片解释:
在浏览器中输入:http://localhost/Day06/EL/el10.jsp 即可显示:
三、如何使用EL函数库
EL函数库是由第三方的公司开发的,原本是要导入到lib目录下的,但是java EE5 开始就有内置的jar包
它的名称叫做:jstl 如在下面的位置
我们可以打开,里面有描述它的文件
如何使用?建立一个e11.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="jk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
${jk:toLowerCase("sdfhkADJGHDI")}
${"<br>"}
${jk:toUpperCase("sdfhkADJGHDI")}
</body>
</html>
上面的功能可以用下面的图解释:
这样就完成了一次EL函数库里面的函数的调用。注意EL函数库是JSTL的一个知识点。
那么什么是JSTL?下一节有详细的介绍。