Pluto Portlet 应用开技术

发布时间:2016-12-7 0:05:07 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Pluto Portlet 应用开技术",主要涉及到Pluto Portlet 应用开技术方面的内容,对于Pluto Portlet 应用开技术感兴趣的同学可以参考一下。

  2. portlet技术。 2. 1 什么是portlal。 Portal是基于WEB的应用程序, 一个信息平台, 它将不同来源的各种资源进行整合并集中展现给客户.   通常其有如下三个特点: a. Personalization (个性化) b.      Single sign on (单点登陆) c.       Content aggregation (内容聚合)   2. 2 什么是 portlet。  Portlet是一种基于WEB组件的JAVA技术, 由Portlet Container进行管理. 处理请求并动态返回页面, 可以作为Portal的可即插即用的界面组件. 2. 2什么是Portlet Container。 Portlet Container用来管理Portlet的生命周期并且提供其运行所需要的必要环境. 并且给Portlet Preferences提供持久性(Persistent)存取服务.但是其不支持Portlet的aggregation(内容聚合). 内容聚合由Portal组件提供.这个概念需要弄清楚. 2. 2什么是WSRP? WSRP 是 OASIS Web Service for Remote Portlets的缩写. WSRP是Web service的一种新的商业应用, 一种新的标准, 主要用来简化Portal对于各种资源或者程序整合的复杂性, 可以避免编程带来的整合麻烦和问题. 而且Portal的管理员可以从海量的WSRP服务中选择需要的功能用以整和到目前使用的Portal中. 它有三种Roles:1) Producer -> 提供Portlet2) Consumer -> 使用Portlet3) End User -> 最终用户 它的特点在于Producer将Consumer所需要的信息通过WSRP返回给Consumer,这些信息是相对的标记Fragment(片段),例如HTML,XHTML等, 直接可以镶入用户的Page中,而不用象Web service一样需要单独开发用户端接口. 3.开发环境部署 配置开发环境             Step1 : 解压eclipse-SDK-3.2-win32.zip              Step2 : 解压org.eclipsefan.pluto.ui_1.0.0.zip , 并将其拷入eclipse/plugins目录 下, 如下: eclipse/plugins/org.eclipsefan.pluto.ui_1.0.0/ /Icon /Lib /Source /Webapp Step3 : 解压tomat5.5到一目录. 并且配置好Tomcat服务器.   配置完成. a.      使用Portlet Wizard来创建Portal1) 选择File > New > Project… > Portal > Pluto Portal application, 单击Next, 如图:   2) 指定Project名称 (如图1.3), 这里使用pluto, 然后单击Next 3) 指定Tomcat路径, 单击Finish. 之后eclipse会将Pluto安装到tomcat上,并且自动配置好环境 b.创建Portlets Application b.      最后生成的工程如图并通过portlet.xml生成/更新web.xml 4.portlet技术验证。 4. 1doView(…),doEdit(…) , doHelp(…) 与Servlet非常类似, Portlet扩展自GenericPortlet . import javax.portlet.*; public class Textportlet extends GenericPortlet 其三个方法对应了Portlet标题栏中的三个链接(View, Edit, Help)所执行的功能. public void doView(…) public void doEdit(…) public void doHelp(…)三个方法分别调用了三个JSP文件, 用以生成Portlet fragment, 同样也可以调用Servlet产生Portlet fragment, 或者不调用JSP或者Servlet,直接在方法中得到PrintWriter,用最简单的pw.println(…)打印出内容,类似Servlet,如下: PrintWriter pw=renderResponse.getWriter(); pw.println("Hello, Portlet!"); 与Servlet应用类似,也可以使用getInitParameter(String s)方法,得到配置文件中Portlet的初始值. 只不过Servlet使用web.xml,而Portlet 使用portlet.xml文件.   4.2 Portal的设定Tomcat 中Webapps目录: 其中pluto是portal所在目录, 用以配置Portal Page的两个文件分别是pageregistry.xml和portletentityregistry.xml   其中pageregistry.xml用来在Portal中配置Portal Page, 而portletentityregistry.xml 用来在Page中配置Portlet.                             4.2.1配置同一行中的两个Portlet <?xml version="1.0"?> <portal> <fragment name="navigation" class="org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation">  </fragment>  <fragment name="sample" type="page">    <navigation>       <title>Sample Portlet</title>          <description>Basic page to show the simple portlet</description>     </navigation> <fragment name="row" type="row"> <fragment name="col1" type="column"> <fragment name="p1" type="portlet">                    <property name="portlet" value="1.1"/>                 </fragment> <fragment name="p2" type="portlet">                     <property name="portlet" value="1.1"/>                 </fragment>               </fragment>         </fragment>     </fragment> </portal>   4.2.2配置同一列中的两个Portlet <?xml version="1.0"?> <portal>  <fragment name="navigation" class="org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation"> </fragment> <fragment name="sample" type="page">  <navigation>       <title>Sample Portlet</title>           <description>Basic page to show the simple portlet</description>         </navigation> <fragment name="row1" type="row"> <fragment name="col1" type="column">  <fragment name="p1" type="portlet">                     <property name="portlet" value="1.1"/>                 </fragment>             </fragment>         </fragment>         <fragment name="row2" type="row">             <fragment name="col1" type="column">                 <fragment name="p1" type="portlet">                     <property name="portlet" value="1.1"/>                 </fragment>             </fragment>         </fragment>     </fragment> </portal>   4.3 Portlet Modes 和 Portlet window states ·          Portlet模式(Portlet Mode)是Portlet提供的用以区分 Portlet所执行功能的一个概念.通常情况下其拥有以下几种模式:1. VIEW 2. EDIT 3. HELP以上各模式分别对应GenericPortlet中的 doView(…) , doEdit(…) , doHelp(…) 方法,分别调用以上方法来产生各个模式中的Fragment内容. 非常类似Servlet中的doGet(…) , doPost(…) 方法,都是Helper方法, 但是概念不同. Portlet状态(Portlet window states)提供了对于Portlet窗口的控制功能 , 其中有如下三种最基本的状态: 1.      Normal 2.      Maximized 3.      Minimized Portlet开发人员可以在处理ActionRequest (以后的章节将讲述其概念) 时使用代码实现Portlet模式, 及其Portlet状态的转变. 注: 只能在处理ActionRequest时改变Portlet Modes和Portlet Window state        以上Portlet Modes和Portlet window states都可以配置成custom Portlet mode和custom portlet window state. 不同的地方在于对于Mode来说, 定制化的Mode需要对GenericPortlet的doDispatch方法进行重写(Overriding), 因为GenericPortlet类通过render方法按照不同的Portlet Mode将request分别分发给doView,doEdit,doHelp等辅助方法. 如果需要定制的Mode , 必须重写doDispatch 方法. 同时如果使用Portal提供商的Portlet Modes 或者 Portlet window States,都必须在部署描述中添加相关的设定   4.4 PortletConfig 对象 ·          PortletConfig对象 和ServletConfig对象类似, PortletConfig对象提供Portlet初始的所需的参数及其对PortletContext对象存取提供相关方法. 和ServletConfig不同处在于, PortletConfig对象提供对Portlet Title Bar资源的I18N支持,我们可以设定不同的Resource Bundle文件用以提供多语言的支持, 如下portlet.xml文件: … …                             <portlet-info>                                           <title>PortletConfig Example</title>                                           <short-title>PortletConfig</short-title>                                           <keywords>PortletConfig</keywords>  </portlet-info>  … … 以上Portlet描述文件中的设置用于显示Portlet的Title Bar文字, 同样也可以使用Resource Bundle用以显示Title Bar文字, 如下:   … …  <resource-bundle> portlets.portletconfig.portletconfigexample </resource-bundle>                             … …     4.5 Portlet 的Request和Response对象 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方法,如下图:   RenderRequest和ActionRequest有什么不同呢? 对于Portlet来说PortletRequest分为ActionRequest和RenderRequest两种,分别是由renderURL和actionURL来触发的.可以这样理解, renderURL是actionURL的一种优化形式.Portlet开发过程中尽可能使用renderURL而避免使用actionURL. actionURL适用于有确实的Action(行为)的情况下. 比如说, form表单的递交. Persistent状态的改变,session的操作,preference的修改,这种情况下使用actionURL,而不使用renderURL, renderURL通常用来操作portlet内容的导航. a. 使用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> b. 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来的好 c. 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方法,再次传递一次. l         A case study 在这部分中,我们来做一个简单的Portlet, 实现一个简单的Form submit功能. 以下是代码片段 JSP(view_portletrequest.jsp.jsp): … … <!-- Use PortletURL Object//--> <% PortletURL pu1=renderResponse.createActionURL(); pu1.setParameter("ACTION","Use PortletURL Object"); pu1.setPortletMode(PortletMode.VIEW); %> <table width=100% border=0> <TR><TD>1. Use PortletURL object to get an ActionURL and set current portlet mode to view</TD></TR> <tr><td> <form name="usrfrm" method="post" action="<%=pu1.toString()%>">  <input type=submit name=bt1 value="GetActionByJava"> </form> <tr><td> </table>               … … 注: 处理完form后将会将PortletMode设定为VIEW. 以上代码使用了actionURL因为是form表单的递交. 详细请参考Portlet的Request 对象部分. 或者也可以使用Tag. 它同样也可以生成一个Portlet的URL, 如下: … … <!-- Use Portlet Tag //--> <portlet:actionURL windowState="maximized" portletMode="edit" var="pu2"> <portlet:param name="ACTION" value="Use Portlet Tag"/> </portlet:actionURL> <BR> <table width=100% border=0> <TR><TD>2. Use Portlet Tag to get a ActionURL and and set current portlet mode to edit</TD></TR> <tr><td> <form name="usrfrm" method="post" action="<%=pu2%>">               <input type=submit name=bt2 value="GetActionByTag"> </form> <tr><td> </table> … … 注: 它在处理完form后将会将PortletMode设定为EDIT,并且Window state会为最大化. Portlet(PortletRequestExample.java): … …         public void processAction(ActionRequest request, ActionResponse response)                             throws PortletException, IOException               {                             String action=request.getParameter("ACTION");                             System.out.println("ACTION" + action);                             if(action==null){                                           action="";                             }                             response.setRenderParameter("ACTION",action); } … … JSP(view_portletrequest.jsp)               … …               <% String getaction=""; if(request.getParameter("ACTION")!=null){  getaction=request.getParameter("ACTION"); } %> <B>ACTION:<%=getaction%></B>               … … JSP(edit_portletrequest.jsp.jsp) … … <% String getaction=""; if(request.getParameter("ACTION")!=null){  getaction=request.getParameter("ACTION"); } %> <B>ACTION:<%=getaction%></B> … … 将以上源代码编译后, 再通过Eclipse生成/更新Portlet的web.xml后, 将所有配置及相关文件部署后, 启动Tomcat 在Browser中加载如下页面: Http://localhost:8080/pluto/portal , 可以看到如下的页面   单击PortletRequest Example Page后可以看到如下Portlet 页面 单击 GetActionByJava 后             单击 GetActionByTag 后, 将跳转到edit modes       4.5.1 Portlet的Response 对象. 与Request对象类似,Response对象也有两种:分别是ActionResponse和RenderResponse, 分别封装了对应ActionRequest和RenderRequest对象返回的所有信息。例如,重定向,windows state,portlet mode等的信息。其中他们的父类,PortletResponse拥有setProperty和addProperty方法,用以传递提供商指定的信息给portal/portlet container 1。ActionResponse和RenderResponse有什么不同?ActionResonse可以用来处理以下相关功能: 1) 重定向sendRedirect方法用来进行帮助portal/portlet-container进行头信息,及其内容的设定,并且将URL重定向到用户指定的页面。 2) 改变windows state, portlet mode ,我们在以前章节中介绍了window state 和 portlet mode概念. 3) 传递Parameter参数到RenderRequest中去,如上面request部分中用到的例子。RenderResponse用来提供如下功能(和Servlet中的Response更相似): 1) 设置ContentType 2) 得到Output Stream and Writer对象,用来产生页面内容 3) Buffering 4) 设定Portlet的Title , 但必须先于portlet的输出递交前来调用,否则将会被忽略。 5.资源 Pluto http://jakarta.apache.org/plutoPluto Mail Listhttp://news.gmane.org/gmane.comp.jakarta.pluto.userWSRP Spec1.0http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrpApache的WSRP实现http://ws.apache.org/wsrp4j/Apache’s Portal, JetSpeed:http://jakarta.apache.org/jetspeed/site/index.htmlJSR 168: http://www.jcp.org/en/jsr/detail?id=168 "Portlet 规范介绍" By Stefan Hepper 和 Stephan Hesmer Part 1: Get your feet wet with the specification's underlying terms and concepts (August 2003) Part 2: The Portlet API's reference implementation reveals its secrets (September 2003)  

上一篇:强烈谴责:MSN7.5.0299悄悄安装FLASH插件
下一篇:通用ShellCode深入剖析

相关文章

相关评论