2009-07-20 5 views
1

Ich möchte dieselbe JSP für mehrere Struts-Aktionen rendern. Ich habe Probleme, weil beim Rendern der JSP der Name des Beans abhängig davon, welche Aktion aufgerufen wurde, unterschiedlich ist. So kann, nenne ich nicht so etwas wie:Effektives Teilen von JSPs zwischen verschiedenen Struts-Action-Klassen

<c:out value="${myBean.myProperty}" />

weil die Bohne ist nicht unbedingt MyBean genannt.

Zur Zeit habe ich mich darum gekümmert, indem ich alle gängigen Objekte, die ich in der JSP benötige, in die HttpSession lege. Zum Beispiel:

public class SampleAction extends Action 
{ 
    public ActionForward execute(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, 
     HttpServletResponse response) throws Exception 
    { 
     String string = "TEST"; 
     HttpSession session = request.getSession(); 
     session.setAttribute("sampleString", string); 

     return mapping.findForward("sampleAction"); 
    } 
} 

Dann wird in der JSP, kann ich einfach Referenz „sampleString“ und es wird nicht auf der Rendering-Aktion je ändern.

Natürlich sind die Objekte, die ich verwende, viel größer als eine Zeichenfolge, und ich möchte keine Objekte in die Sitzung einfügen, wenn ich nicht muss. Gibt es eine Möglichkeit, ein Objekt einfach in den Seitenkontext oder etwas und nicht in die Sitzung einzufügen, um es zwischen verschiedenen JSPs zu teilen?

Ich komme aus der Rails-Welt, also bin ich Struts sehr neu und bin ein wenig verloren. Ich muss eine bestehende Anwendung in Struts erweitern. Das Programm verwendet tatsächlich BeanAction, um ein ActionForm mit einer Action zu kombinieren, daher ist das obige Beispiel nicht genau so, wie mein Code aussieht.

Danke für jede Hilfe, die meine Verwirrung aufräumt!

Antwort

1

Mein erster Gedanke war es zu versuchen, es als benutzerdefinierte Tag zu implementieren, genau wie krosenvold in seiner Antwort sagte. Aber du hast gesagt, dass du neu bei Struts bist, und ich gehe davon aus, dass du neu in der JSP- und J2EE-Webentwicklung bist. Und benutzerdefinierte Tags sind kein sehr einfaches Thema.

Sie könnten eine Proxy-Seite verwenden, um über jsp aufzurufen: Fügen Sie Ihre Ziel-JSP hinzu. Das jsp: include-Tag kann einen body mit jsp: param-Tags haben, in dem Sie einen gemeinsamen Variablennamen verschiedenen Referenzen zuordnen können.

See here for an example in jsp:param in jsp:include.

Auf diese Weise haben Sie eine einzige Seite mit echtem Code und N Proxies für die Referenzierung Ihrer komplexen Objekte. Die Verwendung von benutzerdefinierten Tags würde auch funktionieren, dies ist nur eine andere Art, es zu tun, die ich persönlich denke, ist einfacher für eine Nicht-SCWCD zu implementieren.

1

Ich denke, dass Sie eine Schnittstelle verwenden möchten, die die drei verschiedenen Aktionsklassen implementieren, so dass Sie denselben JSP verwenden können, der den Schnittstellentyp verwendet. Beachte, dass dies die drei Aktionsklassen "gleich" macht, also sag ich im Grunde, dass es der Weg ist, den es zu gehen gilt. Wenn Sie das nicht verwenden können/wollen, würde ich wahrscheinlich ein benutzerdefiniertes JSP-Tag verwenden, um die allgemeinen Bits zu kapseln, und separate JSPs für jede Seite haben denselben gemeinsamen Tag.