EL表达式的使用
E L(Expression Language) 目的:为了使JSP写起来更加简单。
1、获取数据
${expression}
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量
3、变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找
使用范例:
<%@page import="org.eclipse.jdt.internal.compiler.lookup.ImportConflictBinding"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@page import="com.entity.People"%> <%@page import="java.util.*"%> <!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 here</title> </head> <body>
<!-- 直接取数据 --> <% pageContext.setAttribute("info1", "page范围属性"); request.setAttribute("info1", "request范围属性"); session.setAttribute("info1", "session范围属性"); application.setAttribute("info1", "application范围属性"); %> ${info1} <hr>
<!-- 提交表单参数 --> <form action="el.jsp" method="psot"> name属性:<input type="text" name="name" /> <br> age属性:<input type="text" name="age" /> <br> <input type="submit" value="提交到el.jsp"> <hr>
<!-- paramValues提交一组参数 --> <form action="el.jsp" method="post"> <input type="checkbox" name="hobby" value="java语言" />java语言 <input type="checkbox" name="hobby" value="C语言" />C语言 <input type="checkbox" name="hobby" value="php语言" />php语言 <br> <input type="submit" value="提交到el.jsp"> <hr>
<!-- 对象操作 --> <% People zhangsan = new People(); zhangsan.setId(1); zhangsan.setName("zhangsan"); zhangsan.setAge(12); request.setAttribute("zhangsan", zhangsan); %> 编号:${zhangsan.id }<br> 姓名:${zhangsan.name }<br> 年龄:${zhangsan.age }<br> <hr>
<!-- list操作 --> <% People p1 = new People(); p1.setName("张三"); People p2 = new People(); p2.setName("李四"); List<People> list = new ArrayList<People>(); list.add(p1); list.add(p2); request.setAttribute("list",list); %> <!-- 取list指定位置的数据 --> ${list[0].name} ${list[1].name} <hr> <!-- 运算符操作 --> <% request.setAttribute("num1", 10); request.setAttribute("num2", 3); request.setAttribute("flog1", true); request.setAttribute("flog2", false); %> 算术运算符<br> num1=${num1 },num2=${num2 }<br> num1+num2=${num1+num2 }<br> num1-num2=${num1-num2 }<br> num1-num2=${num1-num2 }<br> num1*num2=${num1*num2 }<br> num1/num2=${num1/num2 }<br> num1%num2=${num1%num2 } <hr> 关系运算符<br> flag1=${flag1 },flag2=${flag2 }<br> flag1 && flag2: ${flag1 && flag2 }<br> flag1 || flag2: ${flag1 || flag2 }<br> !flag1: ${!flag1} } <hr> 三目运算符<br> num1>num2: ${num1>num2?"yes":"no" } <hr> 判断空操作:${empty num1 } EL表达式中使用二元表达式<hr> <% session.setAttribute("user",new People("张三")); %> ${user==null? "对不起,您没有登陆 " : user.username} </body> </html>
在对对象进行操作时要用<%@page import%>把包引进来
<%=user.getAddr( ) %>等价于${user.addr}
el.jsp页面范例:
<%@ page language="java" contentType="text/html; charset=utf-8" 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 here</title> </head> <body> this is el.jsp <% request.setCharacterEncoding("utf-8"); %> <!--表单提交过来的参数 --> 姓名:${param.name}<br> 年龄:${param.age}<hr> <!-- 提交过来的一组参数 --> 技能1:${paramValues.hobby[0]}<br> 技能2:${paramValues.hobby[1]}<br> 技能3:${paramValues.hobby[2]} </body> </html>
4、表达式内置对象说明
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
语法:${隐式对象名称}:获得对象的引用
序号 | 隐含对象名称 | 描 述 |
1 | pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
2 | pageScope | 代表page域中用于保存属性的Map对象 |
3 | requestScope | 代表request域中用于保存属性的Map对象 |
4 | sessionScope | 代表session域中用于保存属性的Map对象 |
5 | applicationScope | 代表application域中用于保存属性的Map对象 |
6 | param | 表示一个保存了所有请求参数的Map对象 |
7 | paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] |
8 | header | 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”] |
9 | headerValues | 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] |
10 | cookie | 表示一个保存了所有cookie的Map对象 |
11 | initParam | 表示一个保存了所有web应用初始化参数的map对象 |
示例代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>el隐式对象</title> </head> <body> 1、pageContext对象:获取JSP页面中的pageContext对象 <br /> ${pageContext} <hr> 2、pageScope对象:从page域(pageScope)中查找数据 <br /> <% pageContext.setAttribute("name", "张三"); //map %> ${pageScope.name} <hr> 3、requestScope对象:从request域(requestScope)中获取数据 <br /> <% request.setAttribute("name", "李四"); //map %> ${requestScope.name} <hr> 4、sessionScope对象:从session域(sessionScope)中获取数据 <br /> <% session.setAttribute("user", "sf1"); //map %> ${sessionScope.user} <hr> 5、applicationScope对象:从application域(applicationScope)中获取数据 <br /> <% application.setAttribute("user", "sf2"); //map %> ${applicationScope.user} <hr> 6、param对象:获得用于保存请求参数map,并从map中获取数据 <br /> ${param.name} <!-- 此表达式会经常用在数据回显上 --> <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post"> <input type="text" name="username" value="${param.username}"> <input type="submit" value="注册"> </form> <hr> 7、paramValues对象:paramValues获得请求参数//map{"",String[]} <br /> <!-- http://localhost:8080/JavaWeb_EL_Study_20140826/ELDemo03.jsp?like=aaa&like=bbb --> ${paramValues.like[0]} ${paramValues.like[1]} <hr> 8、header对象:header获得请求头 <br /> ${header.Accept} <br /> <%--${header.Accept-Encoding} 这样写会报错 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] --%> ${header["Accept-Encoding"]} <hr> 9、headerValues对象:headerValues获得请求头的值 <br /> <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组 例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值 --%> ${headerValues.Accept[0]} <br /> <%--${headerValues.Accept-Encoding} 这样写会报错 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] headerValues["Accept-Encoding"]返回的是一个string[]数组,headerValues["Accept-Encoding"][0]取出数组中的第一个值 --%> ${headerValues["Accept-Encoding"][0]} <hr> 10、cookie对象:cookie对象获取客户机提交的cookie <br /> <!-- 从cookie隐式对象中根据名称获取到的是cookie对象,要想获取值,还需要.value --> ${cookie.JSESSIONID.value} //保存所有cookie的map <hr> 11、initParam对象:initParam对象获取在web.xml文件中配置的初始化参数 <br /> <%-- <!-- web.xml文件中配置初始化参数 --> <context-param> <param-name>xxx</param-name> <param-value>yyyy</param-value> </context-param> <context-param> <param-name>root</param-name> <param-value>/JavaWeb_EL_Study_20140826</param-value> </context-param> --%> <%--获取servletContext中用于保存初始化参数的map --%> ${initParam.xxx} <br /> ${initParam.root} </body> </html>
RegisterServlet的代码如下:
package com.web.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RegisterServlet extends HttpServlet { /* * 处理用户注册的方法 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、接收参数 String userName = request.getParameter("username"); /** * 2、直接跳转回/ELDemo03.jsp页面,没有使用request.setAttribute("userName", userName)将userName存储到request对象中 * 但是在ELDemo03.jsp页面中可以使用${param.username}获取到request对象中的username参数的值 */ request.getRequestDispatcher("/ELDemo03.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
注意:
测试header和headerValues时,如果头里面有“-” ,例Accept-Encoding,则要header["Accept-Encoding"]、headerValues["Accept-Encoding"]
测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}
使用EL调用Java方法
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。语法:${prefix:method(params)}
在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。
是否启用EL表达式:
<%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言