Как получить параметры из URL в портлете Liferay?

Я использую jsp из готового портлета, например feed.jspf в Liferay 6:

String articleId =null;
HttpServletRequest httpReq = PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(renderRequest));
articleId = httpReq.getParameter("articleId");

Он дает нулевое значение, будь то в пользовательском портлете или в файлах.jsp, но он должен иметь значение.

6 ответов

Решение

Конечно, вы всегда можете использовать стандартный запрос HttpServletRequest для получения ваших параметров. Вы можете получить этот запрос, используя класс PortalUtil, как в следующем примере:

HttpServletRequest request = PortalUtil.getHttpServletRequest(portletRequest);
String articleId = request.getParameter("articleId");

В моей Liferay- JSP я использую это:

<!-- ... some imports... -->
<!-- ... some more imports... -->
<%@ page import="com.liferay.portal.util.PortalUtil" %>

<portlet:defineObjects /> <!-- Liferay-specific, defines renderRequest etc.-->

<%
    HttpServletRequest r = PortalUtil.getHttpServletRequest(renderRequest);
    String wellHole =  PortalUtil.getOriginalServletRequest(r).getParameter("well_hole");

%>

(это объединяет фрагменты мудрости из других ответов, в частности, ответа Мигеля Хила Мартинеса от 2012 г., 23 июля в 17:35.

Это сработало для меня:

public void doView(RenderRequest request, RenderResponse response) throws 
  PortletException, IOException {

HttpServletRequest requestInsideThePortlet = PortalUtil.getHttpServletRequest(request);

String myURLParam =
 PortalUtil.getOriginalServletRequest(requestInsideThePortlet).getParameter("myURLParam");

....
....
....
}

При работе с портлетами каждый параметр HttpServletRequest имеет префикс, который сообщает "тип" параметра и суффикс, выражающий, какой экземпляр портлета должен его обработать. Таким образом, имя параметра не просто "articleId". Я не знаю, с каким портлетом вы работаете, но если бы это был портлет с именем, скажем, "example", развернутый в ходе войны, параметр был бы назван example_WAR_exampleportletwar_articleId_w2Xd,

Однако вам не придется иметь дело с такой сложностью. Если вы работаете в JSP какого-то уже созданного портлета, должен быть объект с именем renderRequest который содержит все параметры и обобщает все это искажение имени. Таким образом, вместо получения исходного запроса сервлета вы используете его:

String articleId = renderRequest.getParamenter("articleId");

Если этот объект не определен, вам просто нужно вставить <portlet:defineObjects/> пометьте где-нибудь, и после этого объект будет доступен.

НТН. Дайте нам знать, если это сработало!

Для JSF я использую это:

@ManagedBean
@RequestScoped
public class OriginalRequest {
    private HttpServletRequest getOriginalRequest() {
        return PortalUtil.getOriginalServletRequest(
                PortalUtil.getHttpServletRequest(
                        (PortletRequest) FacesContext.getCurrentInstance()
                                .getExternalContext().getRequest() ) );
    }

    public String getParam( String name ) {
        return getOriginalRequest().getParameter( name );
    }

    public List<String> getParamNames() {
        return Collections.list( getOriginalRequest().getParameterNames() );
    }
}

Тогда в вашем лицевой стороне:

#{originalRequest.getParam('my_param')}

Я пробовал твои решения, но отрисовка запроса дает мне исключение, так что это еще одно решение:

public String obtainFromUrl(String keyFromWeb) {

    Object outcome = null;
    Map<String, Object> map = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
    if (map != null) {
        for (String key : map.keySet()) {
            if (map.get(key) instanceof HttpServletRequestWrapper) {
                HttpServletRequest request = (HttpServletRequest) ((HttpServletRequestWrapper) map.get(key))
                        .getRequest();
                outcome = request.getParameter(keyFromWeb);
                break;
            }
        }
    }
    return (String) outcome;

}
Другие вопросы по тегам