2010年8月11日 星期三

JSP & Servlet Expression Language 使用介紹(2)

當想做的並不只是存取屬性與特性值,EL函式則可以做到功能性上的處理
當然,在JavaBean的 getter 與 setter 裡對想取得的值以程式來作處理沒有問題
只是將程式的邏輯分層等等考量,我們需要能做功能處理的函式
除此之外,本篇也會將EL剩下的東西記錄完

EL函式有一定的撰寫規則
1.撰寫的Java類別需要有公開的靜態(static)方法,而且可以接受參數
    雖然沒有強制規定,但回傳型態不應該是 void

2.撰寫標籤程式庫描述子(Tag Library Descriptor, TLD)
   TLD提供了定義函式的Java類別與呼叫函式的JSP之間的對映
   格式使用XML,應用上類似DD,但副檔名須改成 .tld
   檔案存放地點必須放在/WEB-INF目錄或其子目錄底下,container會幫我們讀取其內容

3.JSP中需加上taglib指令
   定義namespace,可以在一個JSP裡使用多個TLD的函式

4.用EL來呼叫函式

首先提供這次的程式碼:
func.java=========

package tw.vencs;

public class func {
    public static int random(){
        return (int)(Math.random()*100);
    }
}

tldTest.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.2</tlib-version>   <!-- 宣告標籤版本 -->
    <short-name>randFunction</short-name>
    <uri>randFunction</uri> 

    <function>
        <name>getRand</name>
        <function-class>tw.vencs.func</function-class>
        <function-signature> int random() </function-signature>
    </function>

</taglib>

show.jsp======

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="test" uri="randFunction" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>test</title>
</head>
<body>
${test:getRand()}
</body>
</html>


這支程式會在show.jsp裡提供一個隨機產生的數字
Java程式檔案提供了靜態的亂數方法
tld 檔案裡的 uri 元素提供了讓container辨識的功能,而不是指位置
使用EL函式須在 taglib 指令中填上要引用的函式的 uri,範例中JSP與 tld 都填上相同的 uri
<short-name>是給予IDE等開發工具辨識用的依據
這邊我們給它跟 uri 相同的名稱

<function>裡的<name>提供了給予外界呼叫函式用的名稱
JSP中的${test:getRand()}這行,getRand()就會對照 tld 檔,依其名稱使用指定的函式
<function-class>會指定該函式使用的類別
<function-signature>在所指定的類別中選擇被使用的靜態方法,型別也需要寫清楚

JSP的 taglib 宣告將引用的標籤檔案( uri 所指的 tld 檔 )以prefix命名為在此頁面使用的別名
所以${test:getRand()}就是呼叫test這個別名所指的 tld 檔裡的 getRand Function

通常我們使用EL就用到上述功能
雖然不應該在EL中進行運算或邏輯處理
但假使有一些小型的功能需求時,直接在EL中處理掉也是方便的選擇
接著來看看EL的運算子

算術運算子:
加 -> + , 減 -> - , 乘 -> * , 除 -> / or div , 求餘數 -> % or mod

邏輯運算子:
AND -> && or and , OR -> || or or , NOT -> ! or not

關係運算子:
相等 -> == or eq , 不相等 -> != or ne , 小於 -> < or lt , 大於 -> > or gt
小於或等於 -> <= or le , 大於或等於 -> >= or ge

EL裡將數字除以0得到的結果是 INFINITY ,而不是錯誤
而求餘數則不能拿0來求餘數,否則會發生例外
EL在設計上在處理 null 值時,會顯示空白而不會丟出例外

最後再提一個頁面轉向的標準動作
程式碼範例:<jsp:forward page="destination.jsp" />
使用注意事項就像其他的轉向功能一樣,轉交前不能輸出資料
這樣EL的部分就結束了

沒有留言:

張貼留言