基本概念
- EL 表达式的全称是:Expression Language,是表达式语言
- 作用:代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出
- EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多
<body> <% request.setAttribute("key","值"); %> 表达式脚本输出 key 的值是: <%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%> <br/> EL 表达式输出 key 的值是: ${key1} </body>
- 格式:
${表达式}
- EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
搜索域数据的顺序
- EL 表达式主要是输出域对象中的数据
- 当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
表达式输出
- 普通属性,数组属性,List 集 合属性,map 集合属性
public class Person { private String name; private Integer id; private String[] phones; private List<String> emails = new ArrayList<>(); private Map<String, String> family = new HashMap<>(); // ... }
<%--调用bean的对象,输出该方法--%> <% Person person = new Person(); person.setId(0); person.setName("John"); person.setPhones(new String[]{"24354235245", "41354654846"}); ArrayList<String> emails = new ArrayList<>(); emails.add("513531"); emails.add("5456563"); person.setEmails(emails); Map<String, String> family = new HashMap<>(); family.put("father", "jack"); family.put("mother", "amy"); family.put("brother", "jackson"); family.put("grandma", "mary"); person.setFamily(family); pageContext.setAttribute("person", person); %> <%--获取单个属性--%> ${person.id}<br> ${person.name}<br> <%--获取数组--%> ${person.phones}<br> ${person.phones[0]}<br> ${person.phones[1]}<br> <%--获取List--%> ${person.emails}<br> ${person.emails[0]}<br> ${person.emails[1]}<br> <%--获取Map--%> ${person.family}<br> ${person.family.mother}<br> ${person.family["father"]}<br>
运算
-
基本运算
<%--逻辑运算--%> == ${1 == 2} ${1 eq 2} <br> != ${1 != 2} ${1 ne 2} <br> > ${1 > 2} ${1 gt 2} <br> >= ${1 >= 2} ${1 ge 2} <br> < ${1 < 2} ${1 lt 2} <br> <= ${1 <= 2} ${1 le 2} <br> <%--算术运算--%> + ${1 + 2} <br> - ${1 - 2} <br> * ${1 * 2} <br> / ${1 / 2} <br> % ${1 % 2} <br>
-
empty 运算:可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false
<%--empty运算--%> <% request.setAttribute("emptyNull", null); request.setAttribute("emptyStr", ""); request.setAttribute("emptyArr", new int[]{}); request.setAttribute("emptyList", new ArrayList<Integer>()); request.setAttribute("emptyMap", new HashMap<String, String>()); %> null ${empty requestScope.emptyNull} <br> "" ${empty emptyStr} <br> new int[]{} ${empty emptyArr} <br> new ArrayList>Integer<() ${empty emptyList} <br> new HashMap>String, String<() ${empty emptyMap} <br>
-
三元运算
${1 > 2 ? "greater":"smaller"}
11 个隐含对象
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 它可以获取 jsp 中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取 pageContext 域中的数据 |
requestScope | Map<String,Object> | 它可以获取 Request 域中的数据 |
sessionScope | Map<String,Object> | 它可以获取 Session 域中的数据 |
applicationScope | Map<String,Object> | 它可以获取 ServletContext 域中的数据 |
param | Map<String,String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它也可以获取请求参数的值,获取多个值的时候使用。 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息,它可以获取多个值的情况 |
cookie | Map<String,Cookie> | 它可以获取当前请求的 Cookie 信息 |
initParam | Map<String,String> | 它可以获取在 web.xml 中配置的上下文参数 |
- EL 获取四个特定域中的属性
pageScope
(pageContext
域)
requestScope
(Request
域)
sessionScope
(Session
域)
applicationScope
(ServletContext
域)<body> <% pageContext.setAttribute("key1", "pageContext1"); pageContext.setAttribute("key2", "pageContext2"); request.setAttribute("key2", "request"); session.setAttribute("key2", "session"); application.setAttribute("key2", "application"); %> ${ applicationScope.key2 } </body>
pageContext
对象的使用
通过pageContext
对象可以获取request对象,像在Servlet
一样,获取Servlet
相关的信息
为了方便,可以在java代码中,将request放进pageContext的域中,这样就可以像上面的四个特定域一样,直接取request服务器 ip:${ pageContext.request.serverName }<br>
<% pageContext.setAttribute("req", request); 协议: ${ req.scheme }<br> %>
<%--pageContext对象的使用--%> <%=request.getScheme()%> ${pageContext.request.scheme}<br> <%--简便方法,将request放进key-value里面--%> <%--获取协议--%> <%pageContext.setAttribute("req", request);%> ${req.scheme}<br> <%--获取服务器IP--%> <%=request.getServerName()%> ${req.serverName}<br> <%--获取服务器端口--%> <%=request.getServerPort()%> ${req.serverPort}<br> <%--获取客户端IP--%> <%=request.getRemoteHost()%> ${req.remoteHost}<br> <%--获取客户端端口号--%> <%=request.getRemotePort()%> ${req.remotePort}<br> <%--获取工程路径--%> <%=request.getContextPath()%> ${req.contextPath}<br> <%--获取请求方法--%> <%=request.getMethod()%> ${req.method}<br> <%--获取会话id编号--%> <%=session.getId()%> ${pageContext.session.id}<br>
param
和paramValues
:获取请求参数的值html<%--获取请求参数的值--%> <%--单个参数--%> ${param.username}<br> <%--多个参数(多选列表之类的)--%> ${paramValues.hobby}<br> ${paramValues.hobby[0]}<br> ${paramValues.hobby[1]}<br>
header
和headerValues
获取请求头的信息<%--获取请求头参数--%> ${header['User-Agent']}<br> ${header['Accept']}<br> ${headerValues['User-Agent'][0]}<br>
cookie
:获取cookie参数${cookie.JSESSIONID.name} ${cookie.JSESSIONID.value}
initParam
:获取web.xml的参数<context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param>
${initParam.username}