2012-11-21 18 views
14

Mam plik JSP, który zawiera inny plik JSP. Pierwsza strona JSP powinna przekazać wystąpienie klasy Java (widgetu) do drugiego pliku JSP.jsp: param z klasą Java

To jest to, co mam:

Pierwszy JSP:

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

Drugi JSP:

${param.widget.id} 

Problemem jest to, że kod ten daje błąd (mówi to robi nie wiem ID). Jeśli pominę część ".id", strona wydrukuje kod Java dla klasy Java, co oznacza, że ​​klasa została poprawnie przesłana. Jeśli zmienię regułę $ {widget} na pierwszej stronie, na przykład $ {widget.id} i spróbuję wydrukować plik $ {param.widget}, wszystko działa poprawnie.

Moje pytanie: Dlaczego nie mogę przekazać klasy Java i bezpośrednio wywołać jej atrybuty? Co ja robię źle?

Edit: Komunikat o błędzie: Spowodowany przez: javax.el.PropertyNotFoundException: własność „id” nie znaleziono typu java.lang.String

Odpowiedz

9

Po przejechaniu zmienna ${widget} jest tłumaczona w czasie żądania na ciąg znaków (widget.toString()). Ta wartość jest następnie przekazywana do drugiej strony JSP jako ciąg, a nie do oryginalnego obiektu java.

Jednym ze sposobów, aby uzyskać dostęp wartości obiektu jest ustawienie wartości parametru z wartością atrybutu:

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

Następnie użyj ryk kodu na drugim JSP:

${param.widgetId} 

Można również ustawić widget jako żądanie atrybut i użyj go na drugiej stronie jako ${widget.id} lub $ {request.widget.id}. Proponuję użyć drugiego podejścia.

+0

Wiem, jak ustawić parametr żądania za pomocą serwletu. Nie wiem, jak przekazać ten parametr do dołączonego pliku. Czy możesz wyjaśnić, jak można to osiągnąć? –

6

<jsp:param> przechodzi parametr jako parametr żądania HTTP, które mogą być tylko Strunowy. Na twoim widżecie wywoływana jest toString(), a wynik tej metody jest przekazywany jako parametr.

Należy używać znacznika JSP, zaimplementowanego jako plik znacznika, zamiast korzystania z dołączenia strony JSP. Zobacz http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html, aby dowiedzieć się, jak je zdefiniować.

Na przykład:

Tag definintion w /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 

używania tagów w każdym 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

Dzięki za pomoc. Czy możesz podać prosty przykład tego, jak to działa?Po przestudiowaniu przesłanego linku nie jest do końca jasne, w jaki sposób mogę go użyć w celu rozwiązania mojego problemu. –

+0

Zobacz moje zmiany na przykład. –

10

udało mi się rozwiązać mój problem z następującego kodu:

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

Dziękuję zarówno za pomoc :) Uratowała mój dzień

+0

Lewą, która pomogła mi było dodanie scope = "request" – jeff

Powiązane problemy