LiferayPortlet 中 ActionRequest 和 RenderRequest 的解释

新手刚开始学liferay ,各种迷茫啊!  对于portlet 中的两种request 也是很晕,网上有一篇博客写的挺仔细的 ,看完了也认识了不少:

收藏一下吧:

转自:点击打开链接

本文使用本系列中 Part1 搭建的开发环境 , 如果没有搭建好开发环境 , 请参考 Portlet 应用开发 Part1 进行开发环境的搭建 .  Part1 中我们已经介绍了 Portlet GenericPortlet  从形式上来看 , Portlet  Servlet 非常相似 但是从 request  response 对象的具体特点及功能来说 又有所不同 本部分主要描述了 Portlet Request  Response 对象 的特点及其与 Servlet  Request  Response 对象 的不同点 .

l          Portlet  Request 对象

Portlet 中的 Request  Servlet  Request 一样接受 Client 端发送的 Request, 但是与 Servlet 不同 , Portlet  Request 分为 Action Request  Render Request 两种类型 , 因此 Portlet 接口中定义了两种方法用来处理不同的 Request. 分别是 processAction(ActionRequest request,ActionResponse response) render(RenderRequest request,RenderResponse response), 分别用以处理 Action Request  Render Request. 某种意义上来讲 ,render 方法类似 Servlet 中的service 方法 ,doView,doEdit,doHelp 方法又类似 doGet,doPost 方法 , 如下图 :

 

 

1.             RenderRequest  ActionRequest 有什么不同呢 ?
对于 Portlet 来说 PortletRequest 分为 ActionRequest  RenderRequest 两种 , 分别是由 renderURL  actionURL 来触发的 . 可以这样理解 , renderURL actionURL 的一种优化形式 .Portlet 开发过程中尽可能使用 renderURL 而避免使用 actionURL. actionURL 适用于有确实的 Action( 行为 ) 的情况下 比如说 , form 表单的递交 . Persistent 状态的改变, session 的操作, preference 的修改 , 这种情况下使用 actionURL, 而不使用 renderURL, renderURL 通常用来操作 portlet 内容的导航 .

 

以下是两个例子: 


使用 actionURL: 
<%
PortletURL pu=renderResponse.createActionURL();
pu.setParameter("ACTION","LOGIN");
…
%>
<form name="usrfrm" method="post" action="<%=pu.toString()%>">
 
注 : form 表单递交时,使用 HTTP post 方法,而不用 get 方法.因为某些 Portal/Portlet Container 的实现将内部状态编码到 URL 的 Query 字符串中.
 
 
使用 renderURL:
<%
PortletURL pu=renderResponse.createRenderURL();
pu.setParameter("PAGE",Number);
…
%>
<a href=”<%=pu%>”> 下一页 </a>
 

2.     renderURL  actionURL 的处理方式有什么不同?

当客户端 request 是由 一个 renderURL 触发 时, Portlet/Portlet Container 会调用 Portal 页面中所有 Portlet  render 方法. 如下 :

 

renderURL

/       |           \

                                                              render     render  render  

 

 

 当客户端 request 一个 actionURL 触发时 , Portlet/Portlet Container 会先调用目标 Portlet  processAction() 方法,  processAction 方法处理完毕后, 再分别调用 Portal 页面中所有 Portlet  render 方法.如下 :

                          actionURL

                                 | 

                                processAction

                                /        |         \

                        render     render     render

 

由于以上原因,所以使用 renderURL 要比使用 actionURL  performance 来的好.

 

3.     RenderRequest  ActionRequest  parameter 参数作用范围有什么不同?

当客户端 request 一个 actionURL 触发时,比如一个 form 表单的提交,所有的 Parameter  get 操作必须在 processAction 方法中进行 例如:

 

JSP  form 表单页面 :

<%

PortletURL pu=renderResponse.createActionURL();

pu.setParameter("ACTION","LOGIN");

%>

<form name="usrfrm" method="post" action="<%=pu.toString()%>">

 

Portlet 的处理:

public void processAction (ActionRequest req,ActionResponse res){

   String str=req.getParameter(“ACTION”);

   //response.setRenderParameter("ACTION",action);

}

 

public void doView(ActionRequest req,ActionResponse res){

   String str=req.getParameter(“ACTION”);

}

 

如上 processAction 方法中, getParamter 方法将能成功得到表单中的参数 ACTION 所对应的值 , 因为我们知道,当目标 portlet  processAction 方法运行完后, Portlet Container 将调用 Portal 页面中所有 Portlet  render 方法.但是实际上 doView 方法中使用 getParameter 不会得到任何值.但是如果把processAction 方法中注释了的一行 uncomment 的话,你就可以在 doView 方法中的得到参数 ACTION 对应的值. 这说明 action request 的参数, render 方法中不可以直接取到.必须使用了 setRenderParameter 方法,再次传递一次.

具体的例子就不转了,到这里已经写的比较仔细了



你可能感兴趣的:(request)