Портлеты Spring MVC: внешняя разбивка на страницы с помощью displaytag должна перейти в фазу действия

Я использую портлеты Spring MVC. Мне нужно реализовать один тег отображения с внешней разбивкой на страницы. Для этого я определил свою таблицу в JSP следующим образом:

    <portlet:actionURL var="viewListURL">
        <portlet:param name='action' value='${ServletContextKeys.MY_ACTION_METHOD}'/> 
    </portlet:actionURL>  
                <display:table name="${whateverList}"
                               requestURI="${viewListURL}"
                               class="displayTagTable"
                               export="true"
                               uid="item"
                               pagesize="10"
                               partialList="true"
                               sort="external"
                               defaultsort="1"                                  
                               size="${ServletContextKeys.SC_LIST_SIZE}">
     ...

Проблема в том, что, когда я нажимаю любую кнопку для разбивки на страницы, displaytag перенаправляет меня на этап рендеринга, а не на этап действия, как я хочу. Что я делаю неправильно? Любые идеи..? Большое спасибо

РЕДАКТИРОВАТЬ: я вижу в URL-адресе параметр p_p_url_type = 0 (этап рендеринга). для меня это не имеет смысла, поскольку я вызываю URL-адрес действия, но, возможно, будет достаточно просто изменить этот параметр на p_p_url_type = 1. Но я просто не знаю как ... Есть идеи?

http://localhost:8080/wsdes/user/sifo3/home?p_p_id=SifoIIIweb_WAR_sifo3economicoweb_INSTANCE_s8jH&p_p_lifecycle=1&p_p_url_type=0&p_p_state=maximized&p_p_mode=view&_SifoIIIweb_WAR_sifo3economicoweb_INSTANCE_s8jH_action=consultaJustificantes&_SifoIIIweb_WAR_sifo3economicoweb_INSTANCE_s8jH_implicitModel=true&_SifoIIIweb_WAR_sifo3economicoweb_INSTANCE_s8jH_d-49489-p=2

person elcadro    schedule 15.01.2013    source источник
comment
Я вижу в URL-адресе параметр p_p_url_type = 0 (этап рендеринга), поэтому, возможно, будет достаточно просто изменить этот параметр на p_p_url_type = 1. Единственное, как сейчас ..?   -  person elcadro    schedule 16.01.2013
comment
Это может помочь найти решение: распространенная проблема, возникающая с Displaytag + Spring, заключается в том, что onSubmit (по умолчанию) вызывается только для запросов POST. Имейте в виду, что displaytag использует запросы GET для сортировки и разбивки на страницы (как и должно быть), поэтому вам, возможно, придется поиграть с переопределением метода isFormSubmission в вашем контроллере, если вы хотите обрабатывать сортировку и разбиение на страницы в onSubmit   -  person elcadro    schedule 17.01.2013


Ответы (2)


Был там раньше. Я решил проблему другим способом, но, глядя в исходный код DisplayTag, обнаружил кое-что интересное. Например, в PortletHref вы можете найти это в addParameter методе:

     if (PARAM_TYPE.equals(name))
        {
           if (TYPE_RENDER.equals(value))
           {
               this.setAction(false);
           }
           else if (TYPE_ACTION.equals(value))
           {
              this.setAction(true);
           }

А также:

 private static final String PARAM_PREFIX = "portlet:";
 public static final String PARAM_TYPE = PARAM_PREFIX + "type";
 public static final String TYPE_ACTION = "action";

Очевидно, если вам нужен параметр с именем portlet:type со значением action, чтобы DisplayTag генерировал URL-адрес действия. Я не тестировал себя, поэтому дайте мне знать, работает ли это.

person Carlos Gavidia-Calderon    schedule 15.01.2013
comment
Я понимаю, о чем вы, но не знаю, как это сделать. Не могли бы вы опубликовать отрывок, чтобы помочь мне? - person elcadro; 16.01.2013
comment
Я вижу в URL-адресе параметр p_p_url_type = 0 (поэтому он переходит в фазу рендеринга), поэтому, возможно, будет достаточно просто изменить этот параметр на p_p_url_type = 1 (фаза действия). Единственное, как сейчас ..? - person elcadro; 16.01.2013

Я до сих пор не знаю причины, но я исправил эту проблему, изменив тег отображения для портлетов (displaytag-portlet.jar) на стандартный displaytag и удалив из файла displaytag.properties свойство factory.requestHelper: factory.requestHelper = org.displaytag.portlet.PortletRequestHelperFactory

Использование обычной библиотеки displaytag вместо библиотеки портлета устранило мои проблемы.

person elcadro    schedule 21.01.2013