2010-04-20 160 views
0

假設一個例子。我有以下接口:兩遍JSP頁面呈現

public interface DataSource<T> { 

    Future<T> fetch(); 
} 

此數據源可以執行異步數據提取。我們在JSP中使用數據源的標籤如下:

<html> 
    <d:fetch from="${orderDS}" var="orders"> 
    <c:foreach in="${orders}" var="order"> 
     <div class="order"> 
     <c:out value="${order.title}" /> 
     </div> 
    </c:foreach> 
    </d:fetch> 
</html> 

所以,我想要什麼?我希望JSP呈現引擎調用我的自定義標記(本示例中爲FetchTag)兩次。首先調用FetchTag將執行DataSource.fetch()調用,並將Future作爲對象字段保存在本地。在第二次調用FetchTag時執行Future.get()調用,並且將被阻塞直到數據可用。

有沒有辦法做這樣的事情?

回答

3

我認爲更好的設計不會嘗試改變JSP渲染。將所有數據庫代碼放在它所屬的服務器端,然後使用AJAX調用從服務器端組件獲取數據。

一般來說,我發現在自定義標記庫中嵌入東西是一個壞主意。 JSTL和/或Spring標籤庫都是我需要的。如果我覺得我的用戶界面需要做更多的事情,我會錯誤地考慮它。

對於JS禁用的客戶端,我只是讓他們做數據的往返行程,而不是嘗試在後臺執行它。給他們一個選擇:等待或打開JS。

+0

是的,我們想到了。但我們試圖保存與禁用js的客戶端的兼容性。也許還有其他模板引擎更適合這項任務? – 2010-04-20 12:23:26