2012-11-21 62 views
14

我有一個包含另一個JSP文件的JSP文件。第一個JSP應該將Java類(小部件)的實例傳遞給第二個JSP文件。jsp:param with Java class

這是我有:

第一個JSP:

<jsp:include page="/container/SpecialWidget.jsp"> 
    <jsp:param name="widget" value="${widget}"/> // widget is a .Java POJO 
</jsp:include> 

第二JSP:

${param.widget.id} 

的問題是,這個代碼給出了一個錯誤(它說,它不不知道ID)。如果省略「.id」部分,該頁面會打印Java類的Java代碼,這意味着該類已正確傳輸。如果我更改了第一頁中的$ {widget}規則,例如$ {widget.id},然後嘗試打印$ {param.widget},則一切正常。

我的問題:爲什麼我不能傳遞Java類並直接調用它的屬性?我究竟做錯了什麼?

編輯:錯誤消息:javax.el.PropertyNotFoundException:致屬性的「id」上java.lang.String類型沒有發現

回答

9

當您通過變量${widget}它在請求時被翻譯爲字符串(widget.toString())。然後將該值作爲字符串傳遞給第二個JSP,而不是原始的Java對象。訪問對象的值

一種方法是使用屬性的值設置參數的值:

<jsp:param name="widgetId" value="${widget.id}"/> 

然後用第二JSP代碼波紋管:

${param.widgetId} 

您還可以設置窗口小部件作爲請求屬性並在第二頁上使用它作爲${widget.id}或$ {request.widget.id}。我建議你使用第二種方法。

+0

我知道如何在servlet的幫助下設置一個請求參數。我不知道的是如何將此參數傳遞給包含的文件。你能解釋一下如何實現這一點嗎? –

6

<jsp:param>傳遞參數作爲HTTP請求的參數,它只能是一個串。因此,toString()在您的小部件上被調用,並且此方法的結果作爲參數傳遞。

您應該使用一個JSP標記,作爲標記文件實現,而不是使用JSP include。有關如何定義使用它們的信息,請參閱http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

例如:

標籤definintion,在/WEB-INF/tags/specialWidget.tag:

<%@ tag %> 
<%@ attribute name="widget" required="true" type="the.fully.qualified.name.of.WidgetClass" %> 
TODO: add the HTML markup that must be displayed, using ${widget} to access the passed in widget attribute 

標籤的使用,在任何JSP:

<%@ taglib prefix="myTags" tagdir="/WEB-INF/tags" %> 
... 
Tada! I will use the specialWidget tag here, with widget as an attribute: 
<myTags:specialWidget widget="${widget}"/> 
+0

感謝您的幫助。你能舉一個這個工作原理的基本例子嗎?在研究了您發送的鏈接之後,我不太清楚如何將其用於解決問題。 –

+0

查看我的編輯示例。 –

10

我設法解決我的問題與下面的代碼:

<c:set var="widget" value="${widget}" scope="request" /> 
<jsp:include page="/SOMEWHERE/SpecialWidget.jsp"/> 

謝謝兩位的幫助:)它救了我的一天

+0

幫助我的技巧是添加scope =「request」 – jeff