Liferay中不同的“请求”隐式对象

时间:2012-08-21 13:34:50

标签: java servlets attributes request liferay

从这些隐式对象中提取属性有什么区别:

renderRequest.getAttribute("myVar")
actionRequest.getAttribute("myVar")
request.getAttribute("myVar")

为什么他们都被允许?
我的意思是你通常将属性存储在actionRequestrenderRequest对象中,但你可以在request隐式对象中获取它,为什么?
什么是正确的方法?

如何在观看时间内获取动作对象?
它是否违反了动作渲染renderParams传递机制?
如果在尝试在JSP中使用它们时抛出NullPointerException,为什么actionRequest / response可用作隐式对象?

最后什么时候在请求中存储属性很有用(PortalUtil.getOriginalServletRequest)?

1 个答案:

答案 0 :(得分:7)

访问请求属性的正确方法是什么? 在portlet中,正确的方法是仅与renderRequest交互以检索参数值以及获取或设置请求属性(在JSP或portlet类中)。 renderResponse可用于创建新的Portlet URL。

为什么还可以从request对象获取请求属性? requestHttpServletRequestrenderRequestPortletRequest。但是,Liferay将request作为HttpServletRequest的包装器实现,例如,要访问请求属性,如果它在实际的PortletRequest中找不到该属性,它将回退到HttpServletRequest

actionRequestactionResponse在观看时有什么用? 就像你说的,如果你遵循MVC的原则,你将只使用JSP进行视图逻辑。如果从Liferay检查DefineObjectsTag,您会发现只有在portlet处于正确的生命周期中时才会设置所有这些xxxRequestxxxResponse对象。因为通常在执行JSP逻辑时您处于RENDER_PHASE中,所以只有renderRequestrenderResponse不为空。

什么时候在request中存储属性很有用 如果您正在使用portlet,那么在HttpServletRequest中存储属性是没有意义的。另一方面,在servlet(过滤器)中,您可以添加可以使用request.getAttribute("xxx")从portlet检索的属性。