如何从LIferay / IceFaces / JSF portlet支持bean中获取url请求参数

时间:2011-09-20 19:51:12

标签: java jsf liferay portlet icefaces

portlet是否可以读取其周围页面的请求参数?

E.g。 portlet所在页面的URL是http://example.com/mygroup/mypage?foo=bar是否可以从该页面上的portlet中读取“foo”参数?

Portlet Container是Liferay 6.0.5。

P.S。

我已经尝试过了:

com.liferay.portal.util.PortalUtil.getOriginalServletRequest(com.liferay.portal.util.PortalUtil.getHttpServletRequest((javax.portlet.PortletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest())).getParameter("foo")

但我总是为productId

获取null

谢谢!

4 个答案:

答案 0 :(得分:1)

你试过吗

ExternalContext.getRequestParameterMap()

答案 1 :(得分:1)

以下代码可以解决问题:

javax.portlet.PortletRequest pr = (javax.portlet.PortletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("javax.portlet.request");
java.lang.reflect.Method method = pr.getClass().getMethod("getOriginalHttpServletRequest");
HttpServletRequest httpServletRequest = (HttpServletRequest)method.invoke(pr, new Object[] {});
return httpServletRequest.getParameter(YOUR_PARAM_KEY);

答案 2 :(得分:0)

在部分提交中,icefaces ajax bridge(取代通常的jsf portlet桥)避免了正常的门户操作/呈现请求,直接联系阻塞servlet(以避免使其他请求范围的portlet无效,并且一般,更快)。因此,在正常门户请求中设置的所有参数/属性都不在ajax中设置。它们仅在该页面的初始GET类型请求中设置。所以,实际上你应该做的是将这些参数保存在@PostConstruct或控制bean的其他方法中,然后再重用它们。 (无论如何,他们不会改变部分提交,对吧?)。 但请记住,如果你将IceFaces与Spring(以及他们的EL解析器一起使用,因为这会消除你的扩展请求范围),这将不起作用。

答案 3 :(得分:-1)

如果你在JSF环境中,那么试试这个:

String param = LiferayFacesContext.getInstance().getRequestQueryStringParameter("foo");