EL表達式

EL表達式html

基本語法:${EL表達式}java

1.獲取數據web

1)EL表達式只能獲取四大域中的數據。數組

2)EL表達式獲取的對象若是是null,頁面不會顯示數據。所以,EL表達式中永遠不會出現空指針異常。cookie

3).運算符和[]運算符session

.運算符能作的,[]運算符也能作。[]運算符能作,.運算符不必定能作。app

eg:dom

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="cn.lsl.domain.Person"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
    <jsp:useBean id="person" class="cn.lsl.domain.Person"></jsp:useBean>
    <jsp:setProperty property="name" name="person" value="lsl"/>
    ${person.name }
    <hr/>
    <%
        pageContext.setAttribute("pp","p1");
        pageContext.setAttribute("pp","p2",PageContext.SESSION_SCOPE);
        request.setAttribute("pp","p3");
        application.setAttribute("pp","p4");
     %>
     ${pp }
     <hr/>
     ${person.address.city }<br/>
     ${person.class }<br/>
     ${person['class'] }  
     <hr/>
     <!-- 獲取數組中指定的元素 -->   
     <%
         String str[] = {"a","b","c"};
         pageContext.setAttribute("str",str);
      %>
     ${str[1] }
     <hr/>
     <%
         List list = new ArrayList();
         list.add("aa");
         list.add("bb");
         list.add("cc");
         pageContext.setAttribute("list",list);
     %>
     ${list[2] }
     <hr/>
     <%
         Map map = new LinkedHashMap();
         map.put("a","aaa");
         map.put("b","bbb");
         map.put("c","ccc");
         pageContext.setAttribute("mm",map);
     %>
     ${mm.b }
     <hr/>
     <%
         Map map1 = new LinkedHashMap();
         map1.put("1","aaa");
         map1.put("2","bbb");
         map1.put("3","ccc");
         pageContext.setAttribute("mm1",map1);
     %>
     ${mm1["3"] }
     <hr/>
      <%
         Map map2 = new LinkedHashMap();
         map2.put("a",new Person("lsl","男",true));
         map2.put("b",new Person("zs","女",false));
         map2.put("c",new Person("ls","女",true));
         pageContext.setAttribute("mm2",map2);
     %>
     ${mm2["a"].name }<br/>
     ${mm2["b"].name }<br/>
     ${mm2.c.name }<br/>
     
  </body>
</html>

2.數學邏輯運算jsp

empty運算符:若是判斷的對象是null或者空字符串,都返回true。對於集合對象自己不是                       null,沒有任何元素,也返回true。函數

EL表達式不支持字符串鏈接操做。

eg:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
    <jsp:useBean id="person" class="cn.lsl.domain.Person"></jsp:useBean>
    ${empty p }
    <hr/>
    <%
        List list = new ArrayList();
        list.add("aaa");
        pageContext.setAttribute("list",list);
    %>
    ${empty list }
    <hr/>
    <%
        session.setAttribute("user","lsl");
     %>
    ${empty user?"請登陸":"歡迎您:" }${user }<br/>
    <hr/>
    <%
        pageContext.setAttribute("gender","0");
     %>
     ${gender == "0"?"女":"男" }
    <hr/>
  </body>
</html>

3.獲取JSP的內置對象(11大EL內置對象)

難點,不要與JSP的內置對象和範圍名稱搞混

11大EL隱式對象中,其中一個是表示自身對象外,其他都是表示的Map結構

                  

EL隱式對象名稱                Java類型                                              備註

pageContext                     javax.servlet.jsp.PageContext                與JSP中的內置對象徹底相同

剩餘的都是表明的Map集合

pageScope                        java.util.Map                                        表明着PageContext頁面範圍域那個Map

requestScope                    java.util.Map                                        表明着ServletRequest請求範圍域那個Map

sessionScope                    java.util.Map                                        表明着HttpSession會話範圍域那個Map

applicationScope                java.util.Map                                        表明着ServletContext應用範圍域那個Map

param                               java.util.Map                                        表明着請求參數。key:請求參數的名稱。value:請求參數的值,它是 一個字符串。

paramValues                      java.util.Map                                        表明着請求參數。key:請求參數的名稱。value:請求參數的值,它是 一個字符串數組。             

header                              java.util.Map                                        表明着請求消息頭。key:頭名稱。value:頭值,它是一個字符串。

headerValues                     java.util.Map                                        表明着請求消息頭。key:頭名稱。 value:頭值,它是一個字符串數組。

cookie                               java.util.Map                                        表明客戶端提交的Cookie的Map。key:cookie的name。value:cookie對象自己

initParam                           java.util.Map                                        表明着全局初始化參數(web.xml中context-param).key:參數名稱。value:參數值

eg:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="cn.lsl.domain.Person"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>EL的11大隱式對象</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
    <br/>-----------------pageContext內置對象-----------------<br/>
    ${pageContext }<br/>
    ${pageContext.request }<br/>
    <!-- EL表達式獲取當前應用名稱 -->
    ${pageContext.request.contextPath }<br/>
    <!-- EL表達式獲取HttpServletResponse採用的編碼 -->
    ${pageContext.response.characterEncoding }<br/>
    <br/>-----------------pageScope內置對象-----------------<br/>
    <%
        pageContext.setAttribute("pp","ppp");
        pageContext.setAttribute("p",new Person("lsl","男",false));
    %>
    ${pageScope.pp }<br/>
    ${pageScope.p.name }<br/>
    <hr/>
    <%
        pageContext.setAttribute("p1",new Person("lsl","男",false),PageContext.REQUEST_SCOPE);
    %>
    ${requestScope.p1.gender }
    <hr/>
    <%
        Person person = new Person("lsl","女",true);
        session.setAttribute("user",person);
    %>
    ${empty sessionScope.user?"請登陸":"歡迎您:" }${sessionScope.user.name }
    <hr/>
    ${param.username }<br/>
    ${param.password }<br/>
    <hr/>
    <!-- http://localhost:8080/EL/3.jsp?username=abc&username=def&password=123 -->
    ${paramValues.username[0] }<br/>
    ${paramValues.username[1] }<br/>
    ${paramValues.password[0] }<br/>
    <hr/>
    ${header["accept-encoding"] }<br/>
    ${headerValues["accept-encoding"][0] }<br/>
    <hr/>
    <!-- 取JSESSIONID這個cookie的名字  -->
    ${cookie["JSESSIONID"].name }<br/>
    ${cookie.JSESSIONID.value}
    <hr/>
    ${initParam.encoding }
    <!-- 
        <context-param>
              <param-name>encoding</param-name>
              <param-value>UTF-8</param-value>
          </context-param>
     -->
  </body>
</html>

4.調用普通類的靜態方法(EL函數)

編寫步驟(自定義EL函數的編寫步驟即自定義標籤的編寫步驟):

a、編寫一個普通的java類,提供一個靜態方法

public class FunctionDemo {
        public static String toUpperCase(String str){
            return str.toUpperCase();
        }
    }

b、在JavaWeb應用的WEB-INF目錄下創建一個擴展名是tld(taglib definition)的XML文件(參考Tomcat中的示例)。內容以下:

<?xml version="1.0" encoding="UTF-8"?>
            <taglib 
                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"
                version="2.0">
                    <tlib-version>1.0</tlib-version>
                    <short-name>myfn</short-name>
                    <uri>http://www.lsl.cn/myfn</uri>
                <function><!-- 定義函數 -->
                    <name>toUppercase</name>
                    <function-class>cn.lsl.el.FunctionDemo</function-class>
                    <function-signature>
                        java.lang.String toUpperCase( java.lang.String )
                    </function-signature>
                </function>
            </taglib>

 

c、(可選步驟)前提是把tld文件放到了WEB-INF目錄下。 

告知應用,tld文件和tld中的uri的對應。修改web.xml,增長如下內容:

<jsp-config>
        <taglib>
            <taglib-uri>http://www.lsl.cn/myfn</taglib-uri>
            <taglib-location>/WEB-INF/myfn.tld</taglib-location>
        </taglib>
    </jsp-config>

d、在JSP中使用

用taglib指令,引入自定義的EL函數庫

<%@ taglib uri="http://www.lsl.cn/myfn" prefix="myfn"%>
    ${myfn:toUppercase(p)}

eg:

FunctionDemo.java

package cn.lsl.el;
public class FunctionDemo {
    public static String toUpperCase(String str){
        return str.toUpperCase();
    }
}

myfn.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib 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"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>myfn</short-name>
    <uri>http://www.lsl.cn/myfn</uri>
    <function><!-- 定義函數 -->
        <name>toUppercase</name>
        <function-class>cn.lsl.el.FunctionDemo</function-class>
        <function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>
    </function>
</taglib>

web.xml

<jsp-config>
        <taglib>
            <taglib-uri>http://www.lsl.cn/myfn</taglib-uri>
            <taglib-location>/WEB-INF/myfn.tld</taglib-location>
        </taglib>
</jsp-config>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.lsl.cn/myfn" prefix="myfn"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
     <%
        pageContext.setAttribute("p","abcdefg");
     %>
    ${myfn:toUppercase(p)}
  </body>
</html>

5.SUN提供的標準EL函數庫

JSTL標準標籤

須要導入JSTL的jar包。standard.jar jstl.jar

eg:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
      ${fn:contains("abc","bc") }<br/>
    ${fn:substring("shit",3,100) }<br/>  ${fn:split("www.lsl.cn",".")[0]}${fn:split("www.lsl.cn",".")[1]}
${fn:split("www.lsl.cn",".")[2]}<br/>
    ${fn:split("2013-04/26","-/")[0]}<br/>
    ${fn:split("2013-04/26","-/")[1]}<br/>
    ${fn:split("2013-04/26","-/")[2]}<br/>
    &lt;hr/&gt;<br/>
    <%
    pageContext.setAttribute("h","<h1>haha</h1>");
    %>
    ${fn:escapeXml(h)}
  </body>
</html>

拓展:

Functions標籤庫中經常使用的16個函數的用法

1)fn:contains函數用於判斷在源字符串中是否包含目標字符串,其語法爲:

fn:contains(String source,String target) -------boolean;

2)fn:containsIgnoreCase函數用於判斷在源字符串中是否包含目標字符串,而且在判斷時忽略大小寫,其語法爲:

fn: containsIgnoreCase (String source,String target) -------boolean;

3)fn:startsWith函數用於判斷源字符串是否以指定的目標字符串開頭,其語法爲:

fn:startsWith(String source,String target) ----boolean

4)fn: endsWith函數用於判斷源字符串是否以指定的目標字符串結尾,其語法爲:

fn: endsWith (String source,String target) ----boolean

5)fn:indexOf函數用於在源字符串中查找目標字符串,並返回源字符串中最早與目標字符串匹配的第一個字符的索引,若是在源字符串中不包含目標字符串,就返回-1,源字符串中的第一個字符的索引爲0。 fn:indexOf函數的語法爲:

fn: indexOf (String source,String target) ----int

6)fn:replace函數用於把源字符串中的一部分替換爲另外的字符串,並返回替換後的字符串。fn:replace函數的語法爲:

fn: replace (String source,String before,String after) ----String

7)fn:substring函數用於獲取源字符串中的特定子字符串,它的語法爲:

fn:substring(String source,int beginIndex,int endIndex) ------String

8)fn:substringBefore函數用於獲取源字符串中指定子字符串以前的子字符串,其語法爲:

fn:substringBefore(String source,String target) ----String

9)fn: substringAfter函數用於獲取源字符串中指定子字符串以後的子字符串,其語法爲:

fn: substringAfter (String source,String target) ----String

10)fn:split函數用於將源字符串拆分爲一個字符串數組,其語法爲:

fn: split (String source,String delimiter) ----String[]

11)fn:join函數用於將源字符串數組中的全部字符串鏈接爲一個字符串,其語法爲:

fn:join(String source[],String separator) ----String

12)fn:toLowerCase函數用於將源字符串中的全部字符改成小寫,其語法爲:

fn:toLowerCase(String source)  -----String

13)fn: toUpperCase函數用於將源字符串中的全部字符改成大寫,其語法爲:

fn: toUpperCase (String source)  -----String

14)fn:trim函數用於將源字符串中的開頭和末尾的空格刪除,其語法爲:

fn:trim(String source) ----String

15)fn:escapeXml函數用於將源字符串中的字符「<」、「>」、「」」和「&」等轉換爲轉義字符,本書第1章的1.2節(HTML簡介)介紹了轉義字符的概念。fn:escapeXml函數的行爲與<c:out>標籤的escapeXml屬性爲true時的轉換行爲相同,fn:escapeXml函數的語法爲:

fn:escapeXml(String source) ----String

16)fn:length函數用於返回字符串中的字符的個數,或者集合和數組的元素的個數,其語法爲:

fn:length(source) ---- int

6. c:if

做用:判斷是否爲true,若是爲true,那麼標籤的主體內容就會顯示。

屬性:

         test:必須的。要求必須是boolean的。支持表達式(EL或Java表達式)

         var:保存test運算結果的變量

         scope: 保存的域範圍。默認是page

eg:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
      <% 
          pageContext.setAttribute("result",true); 
       %>
       <c:if test="${result}">
           真的
       </c:if>
       <hr/>
       <%
        session.setAttribute("user","lsl");
     %>
     <c:if test="${sessionScope.user==null}">
         對不起!請登陸
     </c:if>
     <c:if test="${sessionScope.user!=null}">
         歡迎您:${sessionScope.user }
     </c:if>
     <hr/>
     <%
        List list = new ArrayList();
        list.add("書");
        session.setAttribute("cart",list);
     %>
     <c:if test="${empty sessionScope.cart}">
         對不起!您還不曾購物
     </c:if>
     <c:if test="${!empty sessionScope.cart}">
         您購買了以下東西
     </c:if>
     <hr/>
     <c:if test="${empty sessionScope.cart}" var="result" scope="page"></c:if>
     ${result }
     
  </body>
</html>

7.c:forEach

遍歷:數組、List、Set、Map

屬性:

         items:要遍歷的目標對象。支持表達式

         var:變量名。指向當前遍歷的集合中的一個元素

         begin:開始的索引(含)

         end:結束的索引(含)

         step:步長。默認是1

         varStatus:取一個名字,引用了一個對象。

                   該對象有如下方法:

                   int getIndex():當前記錄的索引號。從0開始

                   int getCount():當前記錄的順序。從1開始

                   boolean isFirst():是不是第一條記錄

                   boolean isLast():是不是最後一條記錄

 

eg:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="cn.lsl.domain.Person"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>
      <%
        String str[] = {"a","b","c"};
        pageContext.setAttribute("str",str);
    %>
    <c:forEach items="${str}" var="s">
        ${s }<br/>
    </c:forEach>
    <hr/>
    <%
        List list = new ArrayList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        pageContext.setAttribute("list",list);
    %>
    <c:forEach items="${list}" var="s">
        ${s }<br/>
    </c:forEach>
    <hr/>
   
   <%
        Set set = new HashSet();
        set.add("aaa");
        set.add("bbb");
        set.add("ccc");
        pageContext.setAttribute("set",set);
    %>
    <c:forEach items="${set}" var="s">
        ${s }<br/>
    </c:forEach>
    <hr/>
    <%
        Map map = new LinkedHashMap();
        map.put("a","aaaa");
        map.put("b","bbbb");
        map.put("c","cccc");
        pageContext.setAttribute("map",map);
    %>
    <c:forEach items="${map}" var="me">
        ${me.key }==${me.value }<br/>
    </c:forEach>
    <hr/>
    <%
        String s1[] = {"a","b","c","d","e","f"};
        pageContext.setAttribute("s1",s1);
    %>
    <c:forEach items="${s1}" var="s" begin="1" end="4" step="2">
        ${s }<br/>
    </c:forEach>
    <hr/>
    <c:forEach items="${s1}" var="s"  step="2">
        ${s }<br/>
    </c:forEach>
    <hr/>
    <c:forEach begin="1" end="100" var="s">
        ${s }
    </c:forEach>
    <hr/>
    <%
    List<Person> ps = new ArrayList<Person>();
    ps.add(new Person("zs","1",true));
    ps.add(new Person("ls","1",false));
    ps.add(new Person("ww","0",false));
    ps.add(new Person("xl","0",false));
    ps.add(new Person("xq","1",true));
    ps.add(new Person("xb","1",false));
    ps.add(new Person("xj","1",false));
    pageContext.setAttribute("ps",ps);
    %>
    <c:forEach items="${ps}" var="p">
        ${p.name}:${p.gender=="1"?"男":"女"}:${p.married?"已婚":"未婚"}<br/>
    </c:forEach>
    <hr/>
    <table border="1" width="60%">
        <tr>
            <th>索引</th>
            <th>順序</th>
            <th>第一個</th>
            <th>最後一個</th>
            <th>姓名</th>
            <th>性別</th>
            <th>婚姻</th>
        </tr>
        <c:forEach items="${ps}" var="p" varStatus="vs">
            <tr>
                <td>${vs.index }</td>
                <td>${vs.count }</td>
                <td>${vs.first }</td>
                <td>${vs.last }</td>
                <td>${p.name }</td>
                <td>${p.gender=="1"?"男":"女"}</td>
                <td>${p.married?"已婚":"未婚"}</td>
            </tr>
        </c:forEach>
    </table>
    <hr/>
    <table border="1" width="60%">
        <tr>
            <th>順序</th>
            <th>姓名</th>
            <th>性別</th>
            <th>婚姻</th>
        </tr>
        <c:forEach items="${ps}" var="p" varStatus="vs">
            <tr bgcolor="${vs.index%2==0?'#CFCFCF':'#4D88AB' }">
                <td>${vs.count }</td>
                <td>${p.name }</td>
                <td>${p.gender=="1"?"男":"女"}</td>
                <td>${p.married?"已婚":"未婚"}</td>
            </tr>
        </c:forEach>
    </table>
    
  </body>
</html>
相關文章
相關標籤/搜索