Параметр пространства имен, совместимый с JSR 286

В портлете Как лучше всего прочитать параметр пространства имен в методе действия. Моя форма содержит

<input id="<portlet:namespace/>param1"  name="<portlet:namespace/>param1" value='hello'/>

Опция 1:

request.getParameter(response.getNamespace() + "param1");

вариант 2:

request.getParameter("param1");

вариант 1 не работает в лайфрейе, но, похоже, будет работать в вебсфере. option2 отлично работает в liferay 6.2. option1, кажется, работает до 6.1.

Может ли кто-нибудь сказать мне, что такое jsr 286-совместимый способ?


person Kalaiselvam M    schedule 04.02.2014    source источник
comment
Подняли эту проблему в liferay issues.liferay.com/browse/LPS-44604.   -  person Kalaiselvam M    schedule 27.02.2014


Ответы (3)


Как я упоминал в комментарии к ответу на этот вопрос, проблема связана с Liferay 6.2, поскольку IBM WebSphere и предыдущие версии Liferay работают должным образом.

Чтобы решить эту проблему, я добавил элемент <requires-namespaced-parameters>false</requires-namespaced-parameters> в liferay-portlet.xml каталога /WEB-INF портлета. При этом параметры HTML-форм не "распределяются по именам".

Пример /WEB-INF/liferay-portlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<liferay-portlet-app>
  <portlet>
    <portlet-name>Portlet name</portlet-name>
    <requires-namespaced-parameters>false</requires-namespaced-parameters>
    <instanceable>true</instanceable>
    <ajaxable>false</ajaxable>
  </portlet>
</liferay-portlet-app>

Если вы добавите этот элемент в liferay-portlet.xml, портлет по-прежнему будет корректно работать в предыдущих версиях Liferay (я тестировал версии 5.5 и 6.1). Он также работает с другими портлетами, потому что они игнорируют этот файл.

Я утверждаю, что Liferay ведет себя неправильно, потому что спецификация JSR-286 говорит следующее (верхняя страница 76 спецификации):

Если пространство имен портлетов или кодировать параметры URL или параметры формы, они также несут ответственность за удаление пространства имен. Контейнер портлета не удалит любое пространство имен, которое портлет сделал для этих параметров».

person Montecarlo    schedule 14.02.2014
comment
Спасибо, Карлос, этот обходной путь будет работать, только если у нас есть параметры в jsp без префикса пространства имен. Проблема в том, что у нас должно быть пространство имен, связанное с параметрами в jsp, и нам нужно получить эти параметры в портлете, и этот портлет должен быть развернут в liferay, weblogic и webphere. Обратите внимание, что webphere и weblogic работают нормально, нужно найти исправление или обойти проблему в liferay 6.2. - person Kalaiselvam M; 18.02.2014
comment
Поскольку @Kalai уже прокомментировал ОП, см. issues.liferay.com/browse/LPS- 44604 . (Оттуда уже есть перекрестные ссылки. Постараемся помочь решить основную проблему оттуда.) - person ziesemer; 08.07.2015

Не существует «совместимого с jsr 286 способа». Вы можете использовать оба подхода. Основная цель тега использования — передать точный параметр конкретному портлету, когда у вас есть несколько экземпляров портлета на одной странице портала. В этом случае одни и те же html-вводы разных портлетов имеют разные имена, и каждый портлет получит свое собственное значение страницы.

person Georgy Gobozov    schedule 05.02.2014
comment
Привет Георгий Гобозов, Спасибо за ваш ответ. - person Kalaiselvam M; 06.02.2014
comment
Привет Георгий Гобозов, Спасибо за ваш ответ. скажем, я создаю портлет, который использует пространства имен для передачи параметров, и я хочу развернуть этот портлет в другой среде, такой как liferay, websphere, weblogic и т. д. Поэтому я ищу код, который будет работать на всех платформах. так вы говорите, что это невозможно? - person Kalaiselvam M; 06.02.2014
comment
он должен работать на всех платформах. ‹portlet:namespace/› часть спецификации портлета, и если портал реализует jsr 168 или jsr 286, этот тег должен работать - person Georgy Gobozov; 06.02.2014
comment
Я проверил это, request.getParameter(param1); не работает в веб-сфере и request.getParameter(response.getNamespace() + param1); не работает в лайфрей. Поэтому невозможно написать общий метод. - person Kalaiselvam M; 12.02.2014
comment
Невозможно. Вы делаете что-то не так. Покажи свой код пожалуйста - person Georgy Gobozov; 12.02.2014
comment
добавил код в качестве ответа, так как я не могу добавить его сюда - person Kalaiselvam M; 12.02.2014

Операторы журнала в конце - это запуск кода в веб-сфере.

 <%@ taglib uri='http://java.sun.com/portlet' prefix='portlet'%>

    <form name="<portlet:namespace />"
                action="<portlet:actionURL windowState='normal'> <portlet:param name='action' value='processAction' /></portlet:actionURL>"
                method="post"><br />
    <input id="<portlet:namespace/>renderPage"
                name="<portlet:namespace/>renderPage"
                value='<%=request.getAttribute(Constants.RENDER_PAGE)%>'><br />
    </form>

     @Override
      public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException
      {
        if (mLogger.isDebugEnabled())
        {
          mLogger.debug("processAction:: Request Parameter Map:" + request.getParameterMap());
        }
        // Make all ActionRequest Parameter for RenderRequest
        response.setRenderParameters(request.getParameterMap());
        if (mLogger.isDebugEnabled())
        {
          mLogger.debug("processAction:: Latest changes are there");
          mLogger.debug(Constants.RENDER_PAGE + "==Namespace=>"+request.getParameter(response.getNamespace()+Constants.RENDER_PAGE));
          mLogger.debug(Constants.RENDER_PAGE + "==withoutnamespace=>"+request.getParameter(Constants.RENDER_PAGE));
        }

2014-02-12 19:35:23,877 ОТЛАДКА ..... renderPage==Namespace=>sites/Component Guide/Home.page 2014-02-12 19:35:23,877 ОТЛАДКА ..... renderPage==без пространства имен => ноль

person Kalaiselvam M    schedule 12.02.2014
comment
И? Вы отправляете только один параметр формы с именем = ‹portlet:namespace/›renderPage, и я предполагаю, что вы получаете его на сайтах processAction/Руководстве по компонентам/Home.page. Конечно, request.getParameter(Constants.RENDER_PAGE)) будет нулевым, потому что вы не отправляете его из формы в портлет. - person Georgy Gobozov; 12.02.2014
comment
Но проблема в том, что в liferay все наоборот, и причина, о которой говорится в liferay, заключается в том, что пространство имен будет применяться по умолчанию, поэтому вам не нужно добавлять префикс пространства имен в нашем методе действия. С тем же кодом оператор журнала напечатает DEBUG ..... renderPage==Namespace=›null DEBUG ..... renderPage==withoutnamespace=›sites/Component Guide/Home.page - person Kalaiselvam M; 13.02.2014
comment
@Kalai Я столкнулся с вашей проблемой два дня назад (я еще не решил ее). Я думаю, что Лайфрей работает неправильно. Спецификация JSR-286 говорит следующее (верхняя страница 76 спецификации): Если пространство имен портлетов или кодировать параметры URL или параметры формы, они также несут ответственность за удаление пространства имен. Контейнер портлета не удалит пространство имен, которое портлет сделал для этих параметров. Кто-нибудь, откройте задачу в JIRA Liferay: issues.liferay.com/browse/LPS-39775 - person Montecarlo; 13.02.2014