2010-02-21 84 views

回答

3

其實我覺得EL函數返回一些複雜對象是完全合理的。當然,還有一些「架構風格」的問題可能會決定什麼會適合這樣的事情,但我想說一個很好的例子是用於返回某些不是用於配置信息的工具特定於任何特定操作,對後端業務邏輯不太感興趣,並可能在許多頁面上用於演示目的。

要做到這一點,你想要的是一個返回「Object」或者「Object []」的EL函數。你不能在你的EL聲明中使用Java泛型(在你的.tld文件中),但這並不重要,因爲EL環境無論如何都會輸入嗅探。你會做在一個類中聲明公共靜態函數的地方:

public static Object yourFunction(String arg1, String arg2, String arg3) { 
    // code code code 
    return (ArrayList<HashMap<String, String>>) whatever; 
} 

在你.TLD文件,你就會有這樣的事情:

<function> 
    <description>Blah blah blah</description> 
    <name>yourFunction</name> 
    <function-class>your.package.YourClassName</function-class> 
    <function-signature> 
    java.lang.Object yourFunction(java.lang.String, java.lang.String, java.lang.String) 
    </function-signature> 
</function> 

在你的JSP,你」 d訪問這樣的功能:

<c:set var='result' value='${prefix:yourFunction("Goodbye", "Mr.", "Chips")}'/> 
+0

+1爲介紹性文字。不過,我會感興趣的是他需要什麼。我無法想象任何有效的現實世界理由。無論何時這些值已經在JSP中硬編碼了,爲什麼要將它轉換爲另一個Java對象?或者當這些值是動態的,爲什麼你不抓取一個servlet或bean來預處理它? – BalusC 2010-02-21 16:37:23

+0

我不知道。在大多數情況下,可能會有一個bean使用,但是誰知道?最初的問題是關於如何設置EL功能。無論如何,通過EL函數可以更快更清晰地獲得bean,相比'',它會在每個使用它的頁面中定義類名。 – Pointy 2010-02-21 19:06:11

+0

不支持泛型,但返回類型應該是函數簽名中的java.util.List和方法簽名中的List。 – BacMan 2010-02-22 17:58:55

5

可以在你的TLD使用複雜的返回類型了。例如。這將工作:

public static List<Map<String, String>> func(String arg1, String arg2, 
     String arg3) { 

    List<Map<String, String>> out = new ArrayList<HashMap<String, String>>(); 
    // code code code 
    return out; 
} 

在你.TLD文件,你必須把這個:

<function> 
    <description>Blah blah blah</description> 
    <name>func</name> 
    <function-class>your.package.YourClassName</function-class> 
    <function-signature> 
    java.util.List&lt;java.util.Map&lt;java.lang.String,java.lang.String&gt;&gt; func(java.lang.String,java.lang.String,java.lang.String) 
    </function-signature> 
</function> 

注意事項:由於在這個例子中,尖括號都必須適當XML轉義。函數簽名不得行封裝。非一元泛型,如Map<String,String>,不能用作參數。 (可能是一個令牌化錯誤。)您將不得不使用原始類型。

相關問題