新手刚开始学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 方法,再次传递一次.
具体的例子就不转了,到这里已经写的比较仔细了