iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 20
0

前言

今天來整理一下關於EL的介紹
內容為本書的ch8

Expression Language目的

使用標準動作已經可以減少使用scripting的方式
但所接受的特性為string或基本的資料型別
當遇到特性為物件時,並沒有辦法完整呈現
在這裡用一個簡單的例子做示範

首先我們有兩個class
分別是Student以及Highschool

Student.java

package com.java.test;

public class Student {
  private String Name;
  private Highschool Highschool;

public Highschool getHighschool() {
	return Highschool;
}

public void setHighschool(Highschool highschool) {
	Highschool = highschool;
}

public String getName() {
	return Name;
}

public void setName(String name) {
	Name = name;
}
}

Highschool.java

package com.java.test;

public class Highschool {
  private String Name;

public String getName() {
	return Name;
}

public void setName(String name) {
	Name = name;
}
}

這個時候假設我們已經在Highschool設定好name的值
但是透過Student的getHighschool去呼叫
並將它使用request.setSAttribute

//s為s物件
request.setSAttribute("Student",s)

這樣的狀況下在scripting是可以的

<%=((Student)request.getAttribute("student")).getHighschool().getName() %>

但在標準動作下會有問題

//highschool是一個物件的名稱
//並不是字串或基本的資料型別
//這樣只會得到物件的toSrting()
<jsp:getProperty name="student" property="highschool"

因此這時就需要EL來處理
除了可以解決這類型的問題
還可以更精簡及直覺的表示
使網頁開發人員即便不懂java仍不影響開發
且增加可維護的便利性

此case使用EL表示為

${student.highschool.name}

.及[]運算子

  • 基本結構
    EL的表示方法很簡單,主要由$號及括號組成

    ${ }
    
  • .號運算子
    .點號在EL的表示規則如下:
    1.變數後接點號,左邊的變數衣錠是Map或是bean物件
    2.點號右邊一定是Map的key或是bean的特性
    3.點號右邊的名稱必須符合java名稱規則(因為會對應到java程式)

  • []運算子
    []具有和.號一樣的功能,但可以更彈性,規則如下:
    1.變數後面接[],[]左邊可以為Map,bean,List以及Array
    2.[]裡是一個字串(可以以雙引號或無雙引號)
    裡面的內容可以是Map key,bean的特性,List的index或是Array的index

    針對這些可擴充的表示內容,整理如下:

    • 陣列

      ${myArray}      //呼叫物件的toString()
                      //但在List,會印出其內容 
      ${myArray[0]}   //index = 0
      ${myArray["0"]} //index = 0(在array和List來說,字串的index會被強制轉換成int)
      ${myArray["my"]} //錯誤,因為沒有index為my這種東西
      
    • bean及Map

      • []或是.都可以使用,意義相同
      //兩種結果相同
      ${myMap.Name}
      ${myMap["Name"]}
      
      • 有無雙引號差異
        若在呼叫key或特性名稱時,沒有加雙引號,則Container會自動去找
        簡單說就是
        有加雙引號的 =>必定是key或是特性名稱
        沒有雙引號的 =>container會去找其內容相同的屬性名稱下的對應值

      • 巢狀表示
        EL提供巢狀結構的形式存在
        舉個例子

        myMap.put("a", "aaa");
        myMap.put("b", "bbb");
        myMap.put("c", "ccc");
        
        ${myMap[myMap[0]]} //結果為"aaa" 
        

EL隱含物件

EL也有提供一些隱含物件,如下

  • pageScope/requestScope/sessionScope/applicationScope
    提供使用XXXXScope來取得XXXX作用域的屬性
    可搭配pageContext使用來取得物件的特性

    ${requestScope.Student.name}
    
    //因為屬性名稱為字串,不需要符合java變數命名規則
    //因像這樣是合法的宣告request.setAttribute("com.java.Student",s);
    ${requestScope.com.java.Student.name} //不合法,會錯
    ${requestScope[com.java.Student].name} //XXXXScope另一個功用
    
  • param/paramValues
    取得HTML表單的值

    //<input type="text" name="name" />
    ${param.name}
    //也可以拿來取多個值
    //<input type="text" name="number" />
    //<input type="text" name="number" />
    ${param.number}//預設會取number得第一個內容
    ${paramValues.number[0]}
    ${paramValues.number[1]}
    
  • header/headerValues
    取得標頭內容

    ${header.host}
    ${header["host"]}
    
  • cookie
    取得cookie

    //取得user cookie
    ${cookie.user.value}
    
  • initParam
    取得context的初始參數(非servlet的初始參數,和init-param完全不相同)

    //context的初始參數
    //context-param
    ${initParam.name}
    
  • pageCpontext
    請求物件的特性

    ${pageContext.request.UpdateName}
    

EL function

EL也可以表示function,使用function來呼叫要執行的動作
步驟如下:

  • 1.撰寫java class(必須為public 且static的)

    public class TestFunction{
      public static int counter(){
      	return 10*2;
      }
    }
    
  • 2.撰寫TLD標籤程式庫描述子(一般和DD放在同一層)

    <uri>myFunction</uri>
    <function>
      <name>countAmt</name>
      <function-class>
          com.java.test.TestFunction
      </function-class>
      <function-signature>
          int counter()
      </function-signature>
    </function>
    
  • 3.在JSP新增taglib指令
//myFunction要和TLD對應
<%@ taglib prefix="first" uri="myFunction" %>
  • 4.使用EL呼叫
//對應到設定檔TLD的name
//name又會去執行對應的java methhod
//並回傳結果
${first.countAmt()}

其他運算子

盡量不要在JSP裡面進行邏輯的判斷
但若必須要使用它去做簡單的運算或是邏輯處理
可以使用下列運算子:
http://ithelp.ithome.com.tw/upload/images/20161220/20103425oyRuEXU8gA.png
null的處理機制:

  • 算數運算子
    顯示空白

  • 邏輯運算子
    null當作為0(div會丟出infinity,mod會丟出exception)

  • 關係運算子
    將null的變數處理成false


上一篇
[Day 19 ] 標準動作建立JSP
下一篇
[Day 21] JSTL筆記 - Core標籤程式庫
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言