Spring portlet从动作阶段开始渲染阶段

时间:2013-04-16 18:05:46

标签: jsr286 spring-portlet-mvc

如果在spring portlet控制器中,我有一个用@ActionMapping注释的方法和另一个用@RenderMapping(params = "action=detail")注释的方法,我看到从方法#1到方法#2,我们不会调用方法#2直接,我们在方法#1中设置Actionresponse.setRenderParameter("action", "detail"),方法#2将从这里提取它。

我的第一个问题是我们将渲染阶段与行动阶段分离(或者我应该说是请求阶段)有什么好处?还有为什么我们不进行直接方法调用而是通过设置渲染参数来调用方法?

2 个答案:

答案 0 :(得分:3)

回答你的问题

  1. Portlet可以在页面上共存。无论您对portlet执行了什么操作,Portal容器都会在所有portlet上调用render()方法来收集html片段并聚合它们,以便准备整个页面视图并提供给浏览器。拥有2个方法不仅是一个优势,而且是执行上述要求的强制执行,它将业务逻辑 - processAction()分开,可能会改变您的系统状态,如@Mark Chorley所说,您知道执行“AND”渲染逻辑 - render()决定要渲染的视图,有时你不知道执行。

  2. 这很简单,为什么你可以在start()上调用run()而不是Thread,尽管你可以直接调用run方法。您不应该直接调用该方法的原因有很多

      
        
    1. 您不对来自页面上所有Portlet的html片段的聚合负责。
    2.   
    3. 您不是在感兴趣的Portlet的render()方法中提供公共渲染参数的人。
    4.   
    5. 你绝对不想把Event委托给订阅的portlet而头疼
    6.   

答案 1 :(得分:1)

这就是portlet基本上做的事情。至于你获得了什么好处 - 它允许你将你的行动(通常是修改数据)与为你的观点准备数据分开。

Action和Render都是单个请求的不同阶段。正如您所说,操作请求在渲染请求之前。 “请求阶段”对我来说听起来很混乱。行动阶段和渲染阶段是更有用的术语。

为什么不直接调用它 - portlet容器会为你做。此外,您必须记住,将在所有可见的portlet上调用render方法,但操作请求将仅针对您的portlet。

因此,假设portlet容器保证调用所有可见portlet上的所有render方法,仅仅因为操作请求针对它而在一个portlet上手动调用render方法没有意义。

如果您只看到一个portlet,则可能不太清楚。当您在一个页面上有多个portlet时,它会更有意义。