从这些隐式对象中获取属性有什么区别:
renderRequest.getAttribute("myVar")
actionRequest.getAttribute("myVar")
request.getAttribute("myVar")
为什么都允许?
我的意思是您通常将属性存储在 actionRequest
或 renderRequest
对象中,但您可以在 request
隐式对象中获取它,为什么?
什么是正确的做法?
如何在 View 时间内获取 Action 对象?
是不是违反了action-render的renderParams传递机制?
如果在 JSP 中尝试使用它们时抛出 NullPointerException
,为什么 actionRequest/response 可以作为隐式对象使用?
最后,什么时候在请求中存储属性有用(PortalUtil.getOriginalServletRequest
)?
最佳答案
访问请求属性的正确方法是什么?
在 portlet 中,正确的方法是仅与 renderRequest
交互以检索参数值以及获取或设置请求属性(在 JSP 或 portlet 类中)。 renderResponse
可用于创建新的 Portlet URL。
为什么您也可以从request
对象中获取请求属性?
request
是一个 HttpServletRequest
而 renderRequest
是一个 PortletRequest
。然而,Liferay 将 request
实现为 HttpServletRequest
的包装器,例如,为了访问请求属性,如果在实际的 HttpServletRequest
中找不到该属性,它将回退到 PortletRequest
。
actionRequest
和 actionResponse
在查看时有什么用?
就像你说的,如果你遵循 MVC 的原则,你将只使用 JSP 来处理 View 逻辑。如果您检查 Liferay 的 DefineObjectsTag
,您可以看到所有这些 xxxRequest
和 xxxResponse
对象只有在 portlet 处于正确的生命周期中时才会设置.因为,通常情况下,您在执行 JSP 逻辑时处于 RENDER_PHASE,只有 renderRequest
和 renderResponse
不会为空。
什么时候在请求
中存储属性有用?
如果您使用的是 portlet,那么将属性存储在 HttpServletRequest
中实际上没有意义。另一方面,在 servlet(过滤器)中,您可以添加属性,然后可以使用 request.getAttribute("xxx")
从 portlet 中检索这些属性。
关于java - Liferay 中不同的 "request"隐式对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056066/