Как получить параметры из 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;
}