2014-02-04 2 views
2

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

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

опция1:

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

option2:

request.getParameter("param1"); 

option1 не работает в Liferay, но, похоже, будет работать в WebSphere. Вариант2 отлично работает в спасательном режиме 6.2. Вариант 1, похоже, работает до 6.1.

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

+1

поднял этот вопрос в Liferay https://issues.liferay.com/browse/LPS-44604 – Kalai

ответ

0

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

+0

Привет Георгий Гобозов, Спасибо за ваши ответ – Kalai

+0

Привет, Георгий Гобозов, спасибо за ваш ответ. Скажем, я создаю портлет, который использует пространства имен для передачи параметров, и я хочу развернуть этот портлет в разных средах, таких как liferay, websphere и weblogic и т. д. Поэтому я ищу писать код, который будет работать на всех платформах, так вы говорите, что это невозможно? – Kalai

+0

он должен работать на всех платформах.<портлет: пространство имен /> часть спецификации портлета, и если портал реализует jsr 168 или jsr 286, этот тег должен работать –

0

заявления журнала в конце находятся от выполнения кода в webphere

<%@ 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: 23877 DEBUG ..... renderPage == Namespace => сайты/Руководство Компонентный/Домашняя страница 2014-02-12 19: 35: 23,877 DEBUG ..... renderPage == withoutnamespace => null

+0

И? Вы отправляете только один параметр формы с именем = <портлет: namespace /> renderPage, и я предполагаю, что вы получите его в processAction "sites/Component Guide/Home.page". Конечно, request.getParameter (Constants.RENDER_PAGE) будет null, потому что вы не отправляете его из формы в портлет –

+0

Но проблема в том, что в liferay это обратное, и причина, сказанная в liferay, заключается в том, что пространство имен будет применяться по умолчанию, поэтому вам не нужно префикс пространства имен в нашем методе действий. С тем же кодом оператор журнала будет печатать DEBUG ..... renderPage == Namespace => null DEBUG ..... renderPage == withoutnamespace => sites/Руководство по компонентам/Домашняя страница – Kalai

+1

@Kalai Я натыкаюсь на вас точная проблема два дня назад (я еще не решил ее). Я думаю, что Liferay работает неправильно. Спецификация JSR-286 говорит следующее (вверху стр. 76 спецификации): «Если пространство имен портлетов или параметры URL-адреса или параметры формы, они также несут ответственность за удаление пространства имен. Контейнер портлета не удалит namespacing портлета сделал по этим параметрам. " Кто-то открывает проблему в JIRA Liferay: https://issues.liferay.com/browse/LPS-39775 – Montecarlo

4

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

Чтобы решить эту проблему, я добавил элемент <requires-namespaced-parameters>false</requires-namespaced-parameters> в каталог liferay-portlet.xml каталога портфолио . Делая это, параметры 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 параметры или параметры формы они также ответственны для удаления пространства имен. Контейнер портлетов не приведет к удалению портлета разделяет пространства имен сделали по этим параметрам «.

+1

Спасибо Карлос, эта работа будет работать только в том случае, если у нас есть параметры в jsp без предварительного пространства имен. Проблема в том, что у нас должно быть пространство имен, связанное с параметрами в jsp, и нужно получить эти параметры в портлете, и этот портлет должен быть развернут в liferay, weblogic и webphere. Заметьте, что webphere и weblogic отлично работают, нужно найти исправление или работать в liferay 6.2 – Kalai

+0

Поскольку @Kalai уже прокомментировал OP, обратитесь к https://issues.liferay.com/browse/LPS-44604. (Это уже связано с перекрестными ссылками. Попытаться помочь в продвижении решения по основному вопросу оттуда). – ziesemer

Смежные вопросы