Как настроить WindowState в ссылках портлета на основе моста Struts? - PullRequest
0 голосов
/ 23 июня 2009

Я занимаюсь разработкой JSR-286-совместимого портлета на основе Struts 1.2.9 (по историческим причинам мы хотим повторно использовать существующий код) с использованием моста портлетов Struts. Я хочу, чтобы некоторые ссылки изменили WindowState, но FormTag и LinkTag, предоставляемые мостом портала, не имеют простого способа установить WindowState. Я рад расширить эти два тега, но не уверен, как поступить, как я могу определить, какие параметры запроса нужно добавить способом, независимым от портала?

1 Ответ

2 голосов
/ 24 июня 2009

Ну, хорошо, я мог бы также ответить на мой собственный вопрос :-)

Мне пришлось создавать свои собственные версии TagsSupport, FormTag и LinkTag на основе (не расширяя) кода моста Struts.

Я изменил методы TagsSupport.getUrl () и TagsSupport.getFormTagRenderFormStartElement (), чтобы принять параметр WindowState и использовать его при создании URL-адресов рендеринга и действий.

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();
    }
...

и

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;
}

Затем я изменил FormTag и LinkTag для принятия атрибута WindowState и передачи его методам в TagsSupport.

private String windowState;

public String getWindowState() {
    return windowState;
}

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

и

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

Очевидно, тогда нужно было tld для ссылки на мои измененные теги.

Поставляется в виде патча PB-91 (также включает исправление для изменения режима портлета) для проекта моста Struts.

...