java--EL表達式

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
</head>

<body>
    <h2>演示EL表達式的用法,格式: ${標識符}</h2>

    <a href="jsps/demo1.jsp">用EL表達式讀取數據</a>
    <br>
    <br>
    <a href="jsps/demo2.jsp">EL表達式的運算符</a>
    <br>
    <br>

    <a href="jsps/demo3.jsp?name=Jack&age=22">EL表達式中的隱藏對象</a>
    <br />
    <br />
    <br />
    <br />


    <a href="show">EL表達式中的應用實例--用戶信息查詢</a>
    <br />
    <br />

    <a href="show2">EL表達式中的應用實例--用戶信息查詢2--EL表達式的不足,JSTL出場解決</a>
    <br />
</body>
</html>

EL 全名爲Expression Language。

EL主要作用:
獲取數據:
EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的java對象中獲取數據。
執行運算:
利用EL表達式可以在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。
獲取web開發常用對象
EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕鬆獲得對web常用對象的引用,從而獲得這些對象中的數據。
調用Java方法
EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法。
獲取數據:
使用EL表達式獲取數據語法:${ 標識符}
EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從page、request、session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是空字符串)。
EL表達式也可以很輕鬆獲取JavaBean的屬性,或獲取數組、Collection、Map類型集合的數據

結合JSTL的foreach標籤,使用EL表達式也可以很輕鬆迭代各種類型的數組或集合,示例:
        迭代數組
        迭代collection類型集合
        迭代map類型集合
獲得web開發常用對象:
EL表達式語言中定義了11個隱含對象,使用這些隱含對象可以很方便地獲取web開發中的一些常見對象,並讀取這些對象的數據。
語法 :${隱式對象名稱},:獲得對象的引用

pageContext:對應於JSP頁面中的pageContext對象(注意:取的是pageContext對象。)
pageScope:代表page域中用於保存屬性的Map對象
requestScope:代表request域中用於保存屬性的Map對象
sessionScope:代表session域中用於保存屬性的Map對象
applicationScope:代表application域中用於保存屬性的Map對象
param:表示一個保存了所有請求參數的Map對象
paramValues:表示一個保存了所有請求參數的Map對象,它對於某個請求參數,返回的是一個string[]
header:表示一個保存了所有http請求頭字段的Map對象
headerValues:同上,返回string[]數組。注意:如果頭裏面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”]
cookie:表示一個保存了所有cookie的Map對象
initParam :表示一個保存了所有web應用初始化參數的map對象
1.測試各個隱式對象
2.注意事項
測試headerValues時,如果頭裏面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”]
測試cookie時,例cookie.keycookiecookie  {cookie.key.name}或${cookie.key.value}

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>EL表達式</title>
  </head>

  <body>
    <h2>用EL表達式讀取數據</h2>
    <font color="red" size="5">用EL表達式讀取容器中的數據</font><br/>
    <%
        //pageContext.setAttribute("name", "pageContext_jack");
        //request.setAttribute("name", "request_jack");
        session.setAttribute("name", "session_jack");
        application.setAttribute("name", "application_jack");
     %>
     name:${name}<!-- 找到誰就會讀出誰(session/application特殊:只要有) --><br/>
     abc:${abc}<!-- 沒有不會掛 --><br/>
     <!-- EL表達式的內容實現機制, 如果所讀取的屬性不存在,輸出空字符串""(注意,不是null)  -->
     EL表達式的內容實現機制:<%=pageContext.findAttribute("name")==null ? "":pageContext.findAttribute("name") %>

     <br/><br/><br/>
     <font color="red" size="5">用EL表達式讀取JavaBean中的數據</font><br/>
     <%
        User u=new User();
        u.setName("tom");
        u.setAge(15);
        u.setPwd("tom");
        u.setId("001");
        //把數據放到容器中
        session.setAttribute("user", u);//或者request(必須轉發)
      %>
      EL表達式中的標識符必須用"屬性名"但不加引號且屬性名相當於對象:u:${u}<br/>
      <!-- EL表達式的 標識符必須是"屬性名"但不加引號且屬性名相當於對象-->user:${user}<br/>
      user.name:${user.name},,,id:${user.id},,,age:${user.age},,,pwd:${user.pwd}
      <br/><br/><br/>
      <font color="red" size="5">用EL表達式讀取Map中的數據</font><br/>
      <%
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("name", "rose");
        map.put("id", "R001");
        map.put("age", "20");
        map.put("pwd", "21432");
        session.setAttribute("mm", map);
       %>
           建議採用:mm.name:${mm.name},,,id:${user.id},,,age:${user.age},,,pwd:${user.pwd}<br/>
           可以,但不建議使用:mm['name']:${mm['name']},,,user['id']:${user['id']},,,user['age']:${user['age']},,,user['pwd']:${user['pwd']}<br/>
                  但是-如果屬性名不符合標識符的命名規則要用第二種方式<br/><br/><br/>
      <font color="red" size="5">用EL表達式讀取List中的數據</font><br/>
      <%
        List list=new ArrayList();
        list.add(u);
        list.add("hncu");
        session.setAttribute("list", list);

       %>
      list[0]:${list[0]}--調用User類的toString()函數<br/>
      list[0].name:${list[0].name},,,age:${list[0].age},,,id:${list[0].id}


       </body>
</html>

這裏寫圖片描述

<%@ page language="java" import="java.util.*,cn.hncu.domain.User" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>EL表達式</title>
  </head>

  <body>
    <%
        User u=new User();
        u.setName("tom");
        u.setAge(15);
        u.setPwd("tom");
        u.setId("001");
        //把數據放到容器中
        request.setAttribute("user", u);//或者request(必須轉發)
        pageContext.setAttribute("a", "page_a");
        request.setAttribute("a", "req_a");
        session.setAttribute("a", "session_a");
        application.setAttribute("a", "app_a");

      %>
     <font color="red">從指定容器讀取,效率更高</font><br/>
     pageScope.a:${pageScope.a}<br/>
     requestScope.user.name:${requestScope.user.name}<br/>
     requestScope.a:${requestScope.a}<br/>
     sessionScope.a:${sessionScope.a}<br/>
     applicationScope.a:${applicationScope.a}<br/>
     <br/>
     <font color="red">請求頭</font><br/>
     header:${header}<br/>
     <font color="red">--都是key-value形式</font><br/>
     header.host:${header.host}<br/>
     header.cookie:${header.cookie}<br/>
     cookie.JSESSIONID.value:${cookie.JSESSIONID.value}<br/>
     cookie.jsessionid.value:${cookie.jsessionid.value}<br/>
     <!-- 這種註釋不能把下面的cookie.JSESSIONID.key注掉-->
     <%-- org.apache.jasper.JasperException
     cookie.JSESSIONID.key:${cookie.JSESSIONID.key}
      --%>
     cookie.JSESSIONID.name:${cookie.JSESSIONID.name}<br/>
     <br/>
     param:${param}<br/>
     param.name:${param.name}<br/>
     param.age:${param.age}<br/>
     paramValues:${paramValues}--用於讀取類似 興趣愛好 這種參數 的值 (字符串數組)<br/>
     paramValues.name:${paramValues.name}<br/>
     paramValues.name[0]:${paramValues.name[0]}<br/>
     <br/>
     initParam:${initParam}<br/>
     pageContext:${pageContext}--類對象<br/>
     pageContext.request:${pageContext.request}<br/>
     pageContext.request.contextPath:${pageContext.request.contextPath}--項目名(不能重寫url但是能代替寫java代碼的方式)<br/>
     <br/><br/><br/>

  </body>
</html>

這裏寫圖片描述

執行運算:
語法:${運算表達式},EL表達式支持如下運算符:
這裏寫圖片描述

這裏寫圖片描述

empty運算符:檢查變量是否爲null或“空”,很好用!!!
二元表達式:${user!=null?user.name : “”} ,很好用!!!
[ ] 和 . 號運算符

<%@ page language="java" import="java.util.*,cn.hncu.domain.User" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>EL表達式</title>
  </head>

  <body>
    <h2>EL表達式的運算符</h2>
    <%
        User u=new User();
        u.setName("tom");
        u.setAge(15);
        u.setPwd("tom");
        u.setId("001");
        //把數據放到容器中
        request.setAttribute("user", u);//或者request(必須轉發)
      %>
    <font color="red" size="5">可以使用算術運算符:+,-,*,/,%</font><br/>
    user.age+10:${user.age+10}
    <br/><br/><br/>
    <font color="red" size="5">可以使用比較運算符:== != < > <= >= </font><br/>
    user.name=='tom'&& user.age>15=   ${user.name=='tom'&& user.age>15 }<!-- true -->
    <br/><br/><br/>
    <font color="red" size="5">可以使用條件算符</font><br/>
    user.age>20?"老了":"年輕"=  ${user.age>20?"老了":"年輕"}
    <br/><br/><br/>
    <font color="red" size="5">可以使用判斷是否爲空的運算符--empty</font><br/>
    如果u爲null(根本就沒有這樣的屬性) 或 空字符串 ,都是返回true<br/>
    empty u:${empty u}<!-- 如果u有定義,爲null--根本米有這樣的屬性,或者爲空字符串....true --><br/>
    empty user:${empty user}<!-- false --><br/>
    empty user的非:${!empty user}<!-- true --><br/>

  </body>
</html>

這裏寫圖片描述

運用EL表達式的一個小實例:

package cn.hncu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.domain.Car;
import cn.hncu.domain.User;

public class ShowServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //封裝信息--模擬後臺查詢並封裝出出來
        User user=new User();
        user.setId("u001");
        user.setName("rose");
        user.setAge(12);
        user.setPwd("1324");

        String[] colors={"red","green","blue"};
        Car cars[]=new Car[3];
        for(int i=0;i<3;i++){
            cars[i]=new Car();
            cars[i].setId(""+(i+1));
            cars[i].setColor(colors[i]);
            cars[i].setName("car"+(i+1));

        }
        user.setCars(cars);
        //把查詢出來的數據 轉到 前端頁面去顯示
        request.setAttribute("user", user);
        request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);


    }

}
<%@ page language="java" import="java.util.*,cn.hncu.domain.User" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>EL表達式</title>
    <style type="text/css">
        table{
            border: 1px red solid;
            border-collapse: collapse;
            width: 200px;
        }
        th{
            border: 1px red solid;
        }
        td{
            border: 1px red solid;
        }
    </style>
  </head>

  <body>
    <h2>用戶信息如下:</h2>
        user--${user}<br>
        user.name--${user.name}<br>
        <font color="red">車輛信息如下:</font><br>
        <table>
            <tr><th>車名</th><th>編號</th><th>顏色</th></tr>
            <tr><th>${user.cars[0].name}</th><th>${user.cars[0].id}</th><th>${user.cars[0].color}</th></tr>
            <tr><th>${user.cars[1].name}</th><th>${user.cars[1].id}</th><th>${user.cars[0].color}</th></tr>
            <tr><th>${user.cars[2].name}</th><th>${user.cars[2].id}</th><th>${user.cars[0].color}</th></tr>
        </table>
  </body>
</html>

這裏寫圖片描述

package cn.hncu.servlet;

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.domain.Car;
import cn.hncu.domain.User;

public class ShowServlet2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //封裝信息--模擬後臺查詢並封裝出出來
        User user=new User();
        user.setId("u001");
        user.setName("rose");
        user.setAge(12);
        user.setPwd("1324");

        String[] colors={"red","green","blue","pink","black","gray","yellow","white"};
        Random r=new Random();
//      int n=0;
        int n=r.nextInt(50);
        Car cars[]=new Car[n];
        for(int i=0;i<n;i++){
            cars[i]=new Car();
            cars[i].setId(""+(i+1));
            cars[i].setColor(colors[i%8]);
            cars[i].setName("car"+(i+1));

        }
        user.setCars(cars);
        //把查詢出來的數據 轉到 前端頁面去顯示
        request.setAttribute("user", user);
        request.getRequestDispatcher("/jsps/show2.jsp").forward(request, response);


    }

}
<%@ page language="java" import="java.util.*,cn.hncu.domain.*" 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>EL表達式</title>
    <style type="text/css">
        table{
            border: 1px red solid;
            border-collapse: collapse;
            width: 200px;
        }
        th{
            border: 1px red solid;
        }
        td{
            border: 1px red solid;
        }
    </style>
  </head>

  <body>
    <h2>用戶信息如下:</h2>
        user--${user}<br>
        user.name--${user.name}<br>
        <font color="red">車輛信息如下:</font><br>
        <table>
            <tr><th>車名</th><th>編號</th><th>顏色</th></tr>
            <%
                Car cars[]=((User)request.getAttribute("user")).getCars();
                pageContext.setAttribute("cars", cars);
                for(Car c:cars){
                    pageContext.setAttribute("c", c);
                    %>
            <tr><td>${c.name}</td><td>${c.id}</td><td>${c.color}</td></tr>
                    <%
                }
             %>
        </table>


        <h2>El表達式的不足-JSTL出場解決</h2>
        <font color="red">車輛信息如下2:</font><br>
        <c:if test="${!empty c}">
            <table>
                <tr><th>車名</th><th>編號</th><th>顏色</th></tr>
                <%--
                <c:forEach items="${user.cars}" var="c">
                 --%>
                <c:forEach items="${cars}" var="c">
                    <tr><td>${c.name}</td><td>${c.id}</td><td>${c.color}</td></tr>
                </c:forEach>
            </table>
        </c:if>
  </body>
</html>

這裏寫圖片描述

值對象

package cn.hncu.domain;

public class User {

    private String pwd;
    private Integer age;
    private String name,id;
    private Car cars[];
    public User() {

    }
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", pwd=" + pwd + ", age=" + age + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Car[] getCars() {
        return cars;
    }
    public void setCars(Car[] cars) {
        this.cars = cars;
    }

}
package cn.hncu.domain;

public class Car {

    private String id;
    private String color;
    private String name;

    public Car() {
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Car [id=" + id + ", color=" + color + ", name=" + name + "]";
    }

}

EL表達式是JSP 2.0規範中的一門技術 。因此,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術的WEB服務器。
注意:有些Tomcat服務器如不能使用EL表達式
(1)升級成tomcat6
(2)在JSP中加入<%@ page isELIgnored=”false” %>

EL表達式保留關鍵字
這裏寫圖片描述

所謂保留字的意思是指變量在命名時,應該避開上述的名字,以免程序編譯時發生錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章