Liferay中不同的"请求"隐式对象

Whi*_*cal 6 java attributes servlets request liferay

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

renderRequest.getAttribute("myVar")
actionRequest.getAttribute("myVar")
request.getAttribute("myVar")
Run Code Online (Sandbox Code Playgroud)

为什么他们都被允许?
我的意思是,你通常存储属性,actionRequestrenderRequest对象,但你可以得到它的request隐含对象,为什么呢?
什么是正确的方法?

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

最后,什么时候在request(PortalUtil.getOriginalServletRequest)中存储属性是有用的?

p.m*_*ten 7

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

为什么还可以从request对象获取请求属性? request是一个HttpServletRequest而且renderRequest是一个PortletRequest.但是,Liferay 以这样的方式实现request了包装HttpServletRequest,例如,对于访问请求属性,PortletRequest如果它在实际中找不到属性,它将回退HttpServletRequest.

有什么用的actionRequest,并actionResponse在观看时间? 就像你说的,如果你遵循MVC的原则,你将只使用JSP进行视图逻辑.如果DefineObjectsTag从Liferay中检查,您可以看到只有在portlet处于正确的生命周期中时才会设置所有这些xxxRequestxxxResponse对象.因为,通常,在执行JSP逻辑时,您在RENDER_PHASE中,renderRequest并且renderResponse将不为null.

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