2010-06-16 77 views
3

當創建JSP頁面一兩件事,我經常喜歡是做這樣的事情的能力:JSP組件創建

<jsp:include page="fancystoryrenderer.jsp" value="${aStoryObjectInMyModel}/> 

...

fancystoryrenderer.jsp 

<div id="fancymainbody"> 
    ... 
    ${theStory.title} 
    ... 
</div> 

這樣做的主要重要特徵是我可以在不同地點的同一個JSP頁面上重複使用相同的組件,而無需複製粘貼組件併爲故事變量賦予不同的名稱,請注意,故事在JSP中稱爲「theStory」,而不是「aStoryObjectInMyModel」,我們的模型之間的聯繫已被打破,在這種情況下,這是一件好事。另外,我知道你可以傳遞一個參數給JSP視圖,但我不想從請求對象中獲取屬性,我希望能夠使用表達式語言中的參數。

你是如何做到這一點的?

我正在使用Spring-MVC和JSP,請不要添加框架,我有興趣只使用我當前擁有的Web棧來工作。

回答

4

將所需的模型放在請求(或更廣泛的)範圍內,它只會在沒有「傳遞」的情況下工作。

如果這個需求背後的實際舉動是因爲你將頁面包含在例如JSTL c:forEach循環中(它將當前迭代的項目放在本地作用域中,這對於包含的JSP頁面來說實際上是不可訪問的),那麼你可以使用c:set進行設置。

<c:forEach items="${items}" var="item"> 
    <c:set var="currentitem" value="${item}" scope="request" /> 
    <jsp:include page="include.jsp" /> 
</c:forEach> 

隨着include.jsp

<p>Current item: ${currentitem}</p> 

這將只是工作:)

4

這可能是使用所謂的 「標記文件」 arhcives。標記文件基本上是放在WEB-INF /標記下的jsps,然後可以像taglib一樣使用。我在這個例子中使用xml語法,但它也應該使用較老的語法。

/WEB-INF/tags/mytag.jspx

<?xml version='1.0' encoding='utf-8'?> 
<jsp:root version="2.1" xmlns:jsp="http://java.sun.com/JSP/Page"> 
    <jsp:directive.attribute name="mybean" required="true" rtexprvalue="true" type="mypackage.MyBean"/> 
    <div> 
     ${mybean.myproperty} 
    </div> 
</jsp:root> 

test.jspx

<?xml version='1.0' encoding='utf-8'?> 
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:tags="urn:jsptagdir:/WEB-INF/tags/"> 
    <jsp:directive.page contentType="text/html; charset=utf-8"/> 
    <div> 
     <tags:mytag mybean="${mymodel.mybean}"/> 
    </div> 
</jsp:root> 

您可能還需要在WEB-INF文件implicit.tld /標籤設置標籤庫版本:

<?xml version='1.0' encoding='utf-8'?> 
<taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" 
    version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"> 
    <tlib-version>2.1</tlib-version> 
</taglib>