2015-09-04 72 views
1

我正在研究基於JSP的組件化系統。這意味着JSP的一部分可以通過拖放從一個JSP移動到另一個JSP,並且導致需要本地頁面範圍作爲在一個JSP中定義的組件的變量,而我在其他JSP中發生衝突。 我可以使用Servlet 3.0/JSP 2.2/JSTL 1.2。是否可以在JSP中創建本地頁面作用域?

++標記文件++

這樣做,是創建組件或類似標籤的文件,因爲他們有這樣的本地頁面範圍的直路。但是對於標籤文件中的每一項變化,都需要重新部署,並且需要創建標籤文件本身需要一些時間。但是,如果沒有其他解決方案,這個方向(自定義標籤,標籤文件,JSP包含,...)可能就是要走的路。

++命名空間前綴/後面添加++

在門戶組件都應該來連接與從portlet響應對象提供一個命名空間的每個變量。我可以做類似的事情,但這會導致副作用和意外行爲。如果有人忘記給名稱空間加前綴/後綴,它可能會工作一段時間,但在其他時間停止工作,而不會在組件移動到具有衝突變量名的其他JSP時更改代碼。

++自定義標籤包裝++

我希望,我作爲一個組件框架開發人員可以用一個標籤文件包組件開發的組件代碼,這樣

<a:component> 
    <div data-component-id="9"> 
     <c:set var="componentId" value="9"/> 
     <c:set var="path" value='${abc:getCurrentPath()}_${componentId}'/> 
     <c:set var="resource" value='${abc:getResourceFromPath(path)}'/> 
     <c:set var="val" value="${resource.getValue('paragraphValue')"/> 
     <p><c:out value="${value}"/></p>  
    </div> 
</a:component> 
組件標記

在標籤文件的本地頁面上下文中具有變量。但是,他們是在周圍的頁面上下文中。我正在尋找類似的東西

<% { %> 
    <div data-component-id="9"> 
     <% 
     String componentId = 9; 
     String path = obj.getCurrentPath()+componentId; 
     Resource resource = otherObj.getResourceFromPath(path); 
     String value = resource.getValue("paragraphValue"); 
     %> 
     <p><c:out value="<%=value%>"/></p> 
    </div> 
<% } %> 

這將創建一個代碼塊,其中變量具有自己的名稱空間。但是當然對於JSTL和JSTL-EL而不是scriptlet代碼。 我查看了JSTL規範,但沒有發現是否有辦法創建這樣的本地頁面範圍。但是我沒有檢查所有內容,因爲它很大,我不確定是否可以使用自定義標籤。

我很清楚,更大的代碼塊不應該在JSP中,但是我希望爲框架提供更簡單的解決方案,用於較小的組件。

++改變JSP代碼++

當元件最初放置在JSP或通過拖動四處移動「ñ下降我實際上從一個JSP移動組件的JSP代碼到其它或在一個JSP內。這意味着如果組件的JSP代碼不太複雜並且它有助於解決問題,那麼我也可以通過編程方式操作組件的JSP代碼。

+0

我在標籤文件試過這樣: '的 $ {}的BodyContent' 但是,在周圍的頁聲明的表述仍然可以取代。 – Sandro

+0

'JSP'將是這個案例研究最糟糕的解決方案。但我認爲讓所有編碼的東西放在後面,那麼這將是可能的,就像一個簡單的NDI – 2015-09-05 01:44:56

回答

0

正如我認爲自定義標籤包裝可能是理想的解決方案,我創建了另一個更具體的問題,我得到了解決問題的答案here

它只是在評估正文並在doEndTag()處再次添加它們之前刪除所有pageContext屬性。

相關問題