2009-06-23 6 views
0

Ich entwickle ein JSR-286-konformes Portlet basierend auf den Struts 1.2.9 (aus historischen Gründen wollen wir viel vorhandenen Code wiederverwenden) mit der Struts-Portlet-Bridge. Ich möchte, dass einige Links den WindowState ändern, aber der von der Portalbrücke bereitgestellte FormTag und LinkTag haben keine einfache Möglichkeit, den WindowState festzulegen. Ich freue mich, diese beiden Tags zu erweitern, bin mir jedoch nicht sicher, wie ich vorgehen soll. Wie kann ich feststellen, welche Anforderungsparameter portalnagnostisch hinzugefügt werden müssen?Wie kann ich WindowState in Struts Bridge-basierten Portlet-Links setzen?

Antwort

2

Na ja, könnte genauso gut meine eigene Frage beantworten :-)

Ich musste meine eigenen Versionen von TagsSupport, FormTag und LinkTag auf Basis von (nicht erstreckt) der Streben Brücke Code erstellen.

Ich habe die Methoden TagsSupport.getUrl() und TagsSupport.getFormTagRenderFormStartElement() geändert, um einen WindowState-Parameter zu akzeptieren und ihn beim Erstellen von Render- und Aktions-URLs zu verwenden.

public static String getURL(PageContext pageContext, String url, PortletURLTypes.URLType type, WindowState ws) 
... 
    if (type.equals(PortletURLTypes.URLType.ACTION)) 
    { 
     final PortletURL portletURL = StrutsPortletURL.createActionURL(pageContext.getRequest(), url); 
     if (ws!=null) { 
     try { 
      portletURL.setWindowState(ws); 
     } 
     catch (WindowStateException e) { 
      e.printStackTrace(); 
     } 
     } 
     return portletURL.toString(); 
    } 
    else if (type.equals(PortletURLTypes.URLType.RENDER)) 
    { 
     final PortletURL portletURL = StrutsPortletURL.createRenderURL(pageContext.getRequest(), url); 
     if (ws!=null) { 
     try { 
      portletURL.setWindowState(ws); 
     } 
     catch (WindowStateException e) { 
      e.printStackTrace(); 
     } 
     } 
     return portletURL.toString(); 
    } 
... 

und

public static String getFormTagRenderFormStartElement(PageContext pageContext, String formStartElement, WindowState ws) 
{ 
    if (PortletServlet.isPortletRequest(pageContext.getRequest())) 
    { 
     int actionURLStart = formStartElement.indexOf("action=") + 8; 
     int actionURLEnd = formStartElement.indexOf('"', actionURLStart); 
     String actionURL = formStartElement.substring(actionURLStart, 
       actionURLEnd); 
     final PortletURL portletURL = StrutsPortletURL.createActionURL(pageContext.getRequest(), 
                    actionURL); 
     if (ws!=null) { 
     try { 
      portletURL.setWindowState(ws); 
     } 
     catch (WindowStateException e) { 
      e.printStackTrace(); 
     } 
     } 
     formStartElement = formStartElement.substring(0, actionURLStart) 
       + portletURL.toString() 
       + formStartElement.substring(actionURLEnd); 
    } 
    return formStartElement; 
} 

I änderten dann FormTag und LinkTag ein Window Attribut zu akzeptieren und an die Methoden in TagsSupport passieren.

private String windowState; 

public String getWindowState() { 
    return windowState; 
} 

public void setWindowState(String windowState) { 
    this.windowState = windowState; 
} 

und

url = TagsSupport.getURL(pageContext, url, urlType, new WindowState(getWindowState())); 

Offensichtlich benötigt dann eine TLD meine modifizierten Tags zu verweisen.

Dies wurde als Patch PB-91 (ebenfalls mit einem Fix zum Ändern des Portlet-Modus) in das Struts-Bridge-Projekt geliefert.