EL

  什么是EL

JSP2.0要把html和css分离、要把html和javascript分离、要把Java代码块替换成标签。标签的好处是非Java人员都可以使用。

JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>

EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。

EL表达式的格式:${…},例如:${1+2}。

在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式。

如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“”,例如:${1+2}。

EL运算符

(数学和逻辑|&!)

    .运算符:调用.之前的getter方法.只要有get方法,  . 就能调

   []运算符:.能做的,它都能做;  .不能做的,它也能做.                

    empty运算符:判断一个对象是否是null或者"",如果是,返回true;

如果对象是一个集合,即使对象本身不是null,没有元素也返回true.

 1  <body>
 2 
 3     <%  pageContext.setAttribute("p", null);   %>
 4 
 5     <!-- empty判断是否为空,为空打印true -->
 6 
 7     ${empty p }<br/>
 8 
 9     <%
10 
11     List list = new ArrayList();
12 
13     list.add("p");
14 
15     pageContext.setAttribute("list", list);
16 
17      %>
18 
19     ${empty list }<hr/>   
20 
21     ${empty cart }<br/>
22 
23      <!-- empty进行 3元运算 -->
24 
25     ${1!=1?"等于":"不等于" }<br/>
26 
27     ${empty list?"您没有购买任何商品":"您买了以下商品" }<br/>
28 
29     <%
30 
31     session.setAttribute("user", new Person("向阳"));
32 
33      %>
34 
35      ${empty user?"您没有登录":"欢迎访问" }
36 
37     <%
38 
39     pageContext.setAttribute("gender", "0");
40 
41      %>
42 
43     <input type="radio" name="gender" value="1" ${gender=='1'?'checked="checked"':''}/>44 
45     <input type="radio" name="gender" value="1" ${gender=='0'?'checked="checked"':''}/>46 
47     </body>

运算符

说明

范例

结果

+

${17+5}

22

-

${17-5}

12

*

${17*5}

85

/或div

${17/5}或${17 div 5}

3

%或mod

取余

${17%5}或${17 mod 5}

2

==或eq

等于

${5==5}或${5 eq 5}

true

!=或ne

不等于

${5!=5}或${5 ne 5}

false

<或lt

小于

${3<5}或${3 lt 5}

true

>或gt

大于

${3>5}或${3 gt 5}

false

<=或le

小于等于

${3<=5}或${3 le 5}

true

>=或ge

大于等于

${3>=5}或${3 ge 5}

false

&&或and

并且

${true&&false}或${true and false}

false

!或not

${!true}或${not true}

false

||或or

或者

${true||false}或${true or false}

true

empty

是否为空

${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”}

true

EL操作操作对象的方式

l  操作List和数组:${list[0]}、${arr[0]};

l  操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法;

l  操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)。

        List:按照索引取

        Map:按照key取绑定的对象。

  <!-- 获取Map中的数据 -->

    <%

    Map<String,Person> map = new HashMap<String,Person>();

    map.put("p1", new Person("刘艳伟"));

    map.put("p2", new Person("宋旭东"));

    map.put("p3", new Person("李梅"));

    pageContext.setAttribute("mm", map);

    %>

    <!-- 获取map中的数据,先获取键,再name -->

    ${mm.p3.name }<hr/>


注意: *在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点                     与使用request.getParameter()方法是不同的。

      * *${EL表达式}, ${pp.address.city} == ${pp['address']["city"]} 当参数名中间有-号非法字符时,应用[]来取,否则应为有-而报错

EL隐藏对象

    请不要与JSP内置对象混淆,一个是表示对象本身,其余表示的都是Map

        ---------------------------------------------------------------------------------------------------

        EL内置对象名称                         表示的类型                                           

        pageContext                                                          javax.servlet.jsp.PageContext       

        pageScope                                                             java.util.Map                    

        requestScope                                                        java.util.Map                     

        sessionScope                                                        java.util.Map                     

        applicationScope                                                   java.util.Map                     

        param                                                                     java.util.Map              

        paramValues                                                java.util.Map              

        header                                                                     java.util.Map              

        headerValues                                                       java.util.Map               

        cookie                                         java.util.Map      

       initParam                                     java.util.Map                       

1        参数隐藏对象

这些隐藏对象都是Map类型!

l  param:param是Map<String,String>类型!param对象可以用来获取参数,与request.getParameter()方法相同。

                       

注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。

 

l  paramValues:paramValues是Map<String, String[]>类型,当一个参数名,对应多个参数值时可以使用它。

 

l  header:header是Map<String,String>类型,用来获取请求头。

 

l  headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。

l  initParam:initParam是Map<String,String>类型。它对应web.xml文件中的<context-param>参数。

 

l  cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。

 

2        域隐藏对象

使用EL表达式最为常用的就是获取域对象中保存的数据。例如:${pageScope.xxx},表示获取在pageContext保存的数据。当然${pageScope[‘xxx’]}是相同的!

l  pageScope:pageScope是Map<String,Object>类型,${pageScope.xxx}的功能相等与pageContext.getAttribute(“xxx”)。两者的区别在于,前者在数据不存在时返回空字符串,而后者返回null。

l  requestScope:requestScope是Map<String, Object>类型,装载了request对象中的所有数据;

l  sessionScope:sessionScope是Map<String, Object>类型,装载了session对象中的所有数据;

l  applicationScope:applicationScope是Map<String, Object>类型,装载了application对象中的所有数据;

当EL中给出的不是隐藏对象时,表示在四个域中查找数据。例如:${a},表示

l  在${pageScope.a}中查找,如果找到就返回;

l  在${requestScope}中查找,如果找到就返回;

l  在${sessionScope}中查找,如果找到就返回;

l  在${applicationScope}中查找,如果找到就返回,找不到就返回空字符串。

3 页面上下文隐藏对象

l  pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest,可以${pageContext.request}。

Expression

说明

${pageContext.request.queryString}

pageContext.getRequest().getQueryString();

${pageContext.request.requestURL}

pageContext.getRequest().getRequestURL();

${pageContext.request.contextPath}

pageContext.getRequest().getContextPath();

${pageContext.request.method}

pageContext.getRequest().getMethod();

${pageContext.request.protocol}

pageContext.getRequest().getProtocol();

${pageContext.request.remoteUser}

pageContext.getRequest().getRemoteUser();

${pageContext.request.remoteAddr}

pageContext.getRequest().getRemoteAddr();

${pageContext.session.new}

pageContext.getSession().isNew();

${pageContext.session.id}

pageContext.getSession().getId();

${pageContext.servletContext.serverInfo}

pageContext.getServletContext().getServerInfo();

JSTL(core和fn)

JSTL概述

1 什么是JSTL

JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!

既然是第三方的东西,那么就需要导包。但是如果你使用的是MyEclipse,那么MyEclipse会帮你导包的。

2 JSTL标签库结构

3 导入标签库

导入标签库需要使用taglib指令!

<%@ taglib prefix="c" uri=" http://java.sun.com/jsp/jstl/core"" %>

JSTL核心库

1 out和set(重点)

 out

<c:out value=”aaa”/>

输出aaa字符串常量

<c:out value=”${aaa}”/>

与${aaa}相同

<c:out value=”${aaa}” default=”xxx”/>

当${aaa}不存在时,输出xxx字符串

<%

request.setAttribute("a","<script>alert('hello');</script>");

%>

<c:out value="${a }"   default="xxx" escapeXml="false" />

当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

set:set标签的var、value、scope是一组,而target、property、value是一组。

<c:set var=”a” value=”hello”/>

在pageContext中添加name为a,value为hello的数据。

<c:set var=”a” value=”hello” scope=”session”/>

在session中添加name为a,value为hello的数据。

<jsp:useBean   id="user" class="cn.itcast.domain.User"/>

<c:set target="${user   }" property="username" value="qdmmy6"/>

<c:set target="${user   }" property="password" value="123456"/>

<c:out value="${user }"   />

给user的username属性赋值qdmmy6,给user的password属性赋值123456。

2 remov

       <%

              pageContext.setAttribute("a",   "pageContext");

              request.setAttribute("a",   "session");

              session.setAttribute("a",   "session");

              application.setAttribute("a",   "application");

       %>

       <c:remove   var="a"/>

       <c:out   value="${a }" default="none"/>

删除所有域中name为a的数据!

<c:remove var="a" scope=”page”/>

删除pageContext中name为a的数据!

3 url

  url标签会在需要URL重写时添加sessionId。

<c:url value="/"/>

输出上下文路径:/day08_01/

<c:url value="/"   var="a" scope="request"/>

把本该输出的结果赋给变量a。范围为request

4 if和choose(重点)

  if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

<c:set var="a"   value="hello"/>

<c:if test="${not empty a }">

    <c:out value="${a }"/>

</c:if>

choose标签对应Java中的if/else if/else结构

when标签的test为true时,会执行这个when的内容。

当所有when标签的test都为false时,才会执行otherwise标签的内容

<c:set var="score"   value="${param.score }"/>

<c:choose>

    <c:when test="${score > 100   || score < 0}">错误的分数:${score }</c:when>

    <c:when test="${score >= 90   }">A级</c:when>

    <c:when test="${score >= 80   }">B级</c:when>

    <c:when test="${score >= 70   }">C级</c:when>

    <c:when test="${score >= 60   }">D级</c:when>

    <c:otherwise>E级</c:otherwise>

</c:choose>

5 forEach(重点)

  forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。

<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10">
    <c:set var="sum" value="${sum + i}" />
</c:forEach>

<c:out value="sum = ${sum }"/>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10" step ="2">
    <c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>

      还可以使用forEach来遍历数据或集合,遍历数组:

<%

String[] names =   {"zhangSan", "liSi", "wangWu", "zhaoLiu"};

pageContext.setAttribute("ns", names);

%>

<c:forEach var="item" items="${ns } ">

    <c:out value="name: ${item }"/><br/>

</c:forEach>

遍历List

<%

    List<String> names = new   ArrayList<String>();

    names.add("zhangSan");

    names.add("liSi");

    names.add("wangWu");

    names.add("zhaoLiu");

    pageContext.setAttribute("ns", names);

%>

<c:forEach var="item"   items="${ns }">

    <c:out value="name: ${item }"/><br/>

</c:forEach>

遍历Map

<%

    Map<String,String> stu = new   LinkedHashMap<String,String>();

    stu.put("number", "N_1001");

    stu.put("name", "zhangSan");

    stu.put("age", "23");

    stu.put("sex", "male");

    pageContext.setAttribute("stu", stu);

%>

<c:forEach var="item " items="${stu }">

    <c:out value="${item.key }: ${item.value } "/><br/>

</c:forEach>

forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。

l  count:int类型,当前以遍历元素的个数;

l  index:int类型,当前元素的下标;

l  first:boolean类型,是否为第一个元素;

l  last:boolean类型,是否为最后一个元素;

l  current:Object类型,表示当前项目。

<c:forEach var="item"   items="${ns }" varStatus="vs"> <!-- varStatus 把循环状态赋给vs -->

    <c:if test="${vs.first }">第一行:</c:if>  <!--如果是第一行,那么${vs.first}为true --> 

    <c:if test="${vs.last }">最后一行:</c:if> 

    <c:out value="${vs.count }: "/>  <!-- 返回行数,从1开始-->

    <c:out value="[${vs.index } ]: "/>    <!-- 返回行数,从0开始-->

    <c:out value="name: ${vs.current } "/><br/>  <!--当前项,与${item}相同 -->

</c:forEach>

原文地址:https://www.cnblogs.com/lulu638/p/4257552.html