2012-11-21 6 views
14

Ich habe eine JSP-Datei, die eine andere JSP-Datei enthält. Die erste JSP sollte eine Instanz einer Java-Klasse (Widget) an die zweite JSP-Datei übergeben. DieseJsp: Param mit Java-Klasse

ist, was ich habe:

Die erste JSP:

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

Die zweite JSP:

${param.widget.id} 

Das Problem ist, dass dieser Code einen Fehler gibt (es sagt, es doesn kenne ID nicht). Wenn ich den ".id" -Teil weglasse, druckt die Seite den Java-Code für die Java-Klasse, was bedeutet, dass die Klasse korrekt übertragen wurde. Wenn ich die Regel $ {widget} der ersten Seite beispielsweise in $ {widget.id} ändere und versuche, $ {param.widget} zu drucken, funktioniert alles einwandfrei.

Meine Frage: Warum kann ich nicht eine Java-Klasse übergeben und direkt auf ihre Attribute zugreifen? Was mache ich falsch?

Edit: Fehlermeldung: Verursacht durch: javax.el.PropertyNotFoundException: Property 'id' nicht auf Typ java.lang.String gefunden

Antwort

9

Wenn Sie passieren die Variable ${widget} wird zur Zeit der Anfrage in eine Zeichenkette übersetzt (widget.toString()). Dieser Wert wird dann als String an die zweite JSP übergeben, nicht als das ursprüngliche Java-Objekt.

Ein Ansatz der Objektwerte für den Zugriff setzt den Wert des Parameters mit dem Wert des Attributs:

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

dann den Code unten auf der zweiten JSP verwenden:

${param.widgetId} 

Sie auch Widget einstellen als eine Anfrage Attribut und verwenden Sie es auf der zweiten Seite als ${widget.id} oder $ {request.widget.id}. Ich schlage vor, dass Sie den zweiten Ansatz verwenden.

+0

Ich weiß, wie man einen Anfrageparameter mit Hilfe eines Servlets einrichtet. Was ich nicht weiß, ist, wie dieser Parameter an eine enthaltene Datei übergeben wird. Können Sie erklären, wie dies erreicht werden kann? –

6

<jsp:param> übergibt den Parameter als HTTP-Request-Parameter, der nur eine sein kann Zeichenfolge. So wird toString() auf Ihrem Widget aufgerufen, und das Ergebnis dieser Methode wird als Parameter übergeben.

Sie sollten anstelle eines JSP-Includes ein JSP-Tag verwenden, das als Tag-Datei implementiert ist. Siehe http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html für wie man sie benutzt.

Zum Beispiel:

Tag definintion, in /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 

Tag-Nutzung, in jeder 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

Vielen Dank für Ihre Hilfe. Können Sie ein grundlegendes Beispiel dafür geben, wie das funktioniert?Nach dem Studium des Links, den Sie gesendet haben, ist nicht ganz klar, wie ich es für mein Problem verwenden kann. –

+0

Siehe meine Änderungen für ein Beispiel. –

10

konnte ich mein Problem mit dem folgenden Code beheben:

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

Danke sowohl für Ihre Hilfe :) Es sparte meinen Tag

+0

Der Trick, der mir geholfen hat, war, scope = "request" hinzuzufügen – jeff