从这些隐式对象中提取属性有什么区别:
renderRequest.getAttribute("myVar")
actionRequest.getAttribute("myVar")
request.getAttribute("myVar")
为什么他们都被允许?
我的意思是你通常将属性存储在actionRequest
或renderRequest
对象中,但你可以在request
隐式对象中获取它,为什么?
什么是正确的方法?
如何在观看时间内获取动作对象?
它是否违反了动作渲染renderParams传递机制?
如果在尝试在JSP中使用它们时抛出NullPointerException
,为什么actionRequest / response可用作隐式对象?
最后什么时候在请求中存储属性很有用(PortalUtil.getOriginalServletRequest
)?
答案 0 :(得分:7)
访问请求属性的正确方法是什么?
在portlet中,正确的方法是仅与renderRequest
交互以检索参数值以及获取或设置请求属性(在JSP或portlet类中)。 renderResponse
可用于创建新的Portlet URL。
为什么还可以从request
对象获取请求属性?
request
是HttpServletRequest
,renderRequest
是PortletRequest
。但是,Liferay将request
作为HttpServletRequest
的包装器实现,例如,要访问请求属性,如果它在实际的PortletRequest
中找不到该属性,它将回退到HttpServletRequest
。
actionRequest
和actionResponse
在观看时有什么用?
就像你说的,如果你遵循MVC的原则,你将只使用JSP进行视图逻辑。如果从Liferay检查DefineObjectsTag
,您会发现只有在portlet处于正确的生命周期中时才会设置所有这些xxxRequest
和xxxResponse
对象。因为通常在执行JSP逻辑时您处于RENDER_PHASE中,所以只有renderRequest
和renderResponse
不为空。
什么时候在request
?中存储属性很有用
如果您正在使用portlet,那么在HttpServletRequest
中存储属性是没有意义的。另一方面,在servlet(过滤器)中,您可以添加可以使用request.getAttribute("xxx")
从portlet检索的属性。