如何在 Liferay portlet 中从 URL 获取参数?

3

我正在使用Liferay 6中的feed.jspf等开箱即用的门户组件:

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

无论是在自定义Portlet还是在.jsp文件中,它都返回null值,但实际上应该有一个值。


使用RenderRequest request = (RenderRequest) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("javax.portlet.request"); 来获取RenderRequest。 - frandevel
6个回答

10

当然,您始终可以使用标准的HttpServletRequest从中检索参数。您可以通过使用PortalUtil类来获取此请求,就像以下示例中所示:

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

你能否看一下我在同一主题上的帖子,并告诉我是否可以使用相同的解决方案? - Al.Boldyrev

8
在我的 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");

%>

(这篇文章结合了其他答案的智慧,特别是Miguel Gil Martínez在2012年7月23日17:35的回答。)


可以使用JSTL或EL获取它吗? - Serg Shapoval

2
当使用portlet时,每个HttpServletRequest参数都有一个前缀,它表示参数的“类型”,并且有一个后缀表示应该处理它的portlet的“实例”。因此,参数的名称不仅仅是“articleId”。我不知道你正在使用哪个portlet,但如果它是通过war部署的名为“example”的portlet,那么参数将被称为example_WAR_exampleportletwar_articleId_w2Xd
然而,您不必处理这样的复杂性。如果您正在某个已创建的portlet的JSP中工作,则应该有一个名为renderRequest的对象,其中包含所有参数并抽象化了所有这些名称混淆。因此,您可以使用它而不是检索原始servlet请求:
String articleId = renderRequest.getParamenter("articleId");

如果这个对象没有被定义,你只需要在某个地方插入<portlet:defineObjects/>标签,之后这个对象就会可用。
希望对你有所帮助。如果有效,请告诉我们!

是的,但我想从URL中获取articleId,例如http://localhost:8080/author-detail?articleId=12345,在portlet的JSP页面中可以吗? - Mayur Patel
那么,URL参数没有前缀或后缀,对吧?我不知道如何获取它(我建议你尝试一下,希望它能起作用),但我想知道这个参数是如何设置的。它是如何定义的?是在你制作的某个portlet/hook中吗? - brandizzi
从我的Liferay自定义Portlet之一中...我通过定义页面名称并手动传递参数来调用其他页面...之后将重定向到作者详细信息页面...在那里我有一个Portlet..我必须在其中访问articleId?... - Mayur Patel

2

对我来说它有用:

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

HttpServletRequest requestInsideThePortlet = PortalUtil.getHttpServletRequest(request);

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

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

1
对于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')}

0

我尝试了你的解决方案,但在渲染请求时出现了异常, 所以这是另一个解决方案:

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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接