Eclipse下Portlet应用开发(JSR168)

开发环境部署
配置开发环境
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
下载地址:
Pluto-plugin
http://prdownloads.sourceforge.n ... _1.0.0.zip?download
Step3 : 解压tomat5.5到一目录. 并且配置好Tomcat服务器.

配置完成.

a. 使用Portlet Wizard来创建Portal
1) 选择File > New > Project… > Portal > Pluto Portal application, 单击Next, 如图:
Eclipse下Portlet应用开发(JSR168)_第1张图片

2) 指定Project名称 (如图1.3), 这里使用pluto, 然后单击Next
Eclipse下Portlet应用开发(JSR168)_第2张图片

3) 指定Tomcat路径, 单击Finish. 之后eclipse会将Pluto安装到tomcat上,并且自动配置好环境
Eclipse下Portlet应用开发(JSR168)_第3张图片

b.创建Portlets Application
Eclipse下Portlet应用开发(JSR168)_第4张图片

b. 最后生成的工程如图并通过portlet.xml生成/更新web.xml
Eclipse下Portlet应用开发(JSR168)_第5张图片

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.

Eclipse下Portlet应用开发(JSR168)_第6张图片

4.2.1配置同一行中的两个Portlet

Xml代码 复制代码
  1. <? xml   version = "1.0" ?>   
  2. < portal >   
  3. < fragment   name = "navigation"   class = "org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation" >   
  4.  </ fragment >   
  5.  < fragment   name = "sample"   type = "page" >   
  6.    < navigation >   
  7.       < title > Sample Portlet </ title >   
  8.          < description > Basic page to show the simple portlet </ description >   
  9.     </ navigation >   
  10. < fragment   name = "row"   type = "row" >   
  11. < fragment   name = "col1"   type = "column" >   
  12. < fragment   name = "p1"   type = "portlet" >   
  13.                    < property   name = "portlet"   value = "1.1" />   
  14.                 </ fragment >   
  15. < fragment   name = "p2"   type = "portlet" >   
  16.                     < property   name = "portlet"   value = "1.1" />   
  17.                 </ fragment >   
  18.    
  19.             </ fragment >   
  20.         </ fragment >   
  21.     </ fragment >   
  22. </ portal >   
<?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>



Eclipse下Portlet应用开发(JSR168)_第7张图片

4.2.2配置同一列中的两个Portlet

Xml代码 复制代码
  1. <? xml   version = "1.0" ?>   
  2. < portal >   
  3.  < fragment   name = "navigation"   class = "org.apache.pluto.portalImpl.aggregation.navigation.TabNavigation" >   
  4. </ fragment >   
  5. < fragment   name = "sample"   type = "page" >   
  6.  < navigation >   
  7.       < title > Sample Portlet </ title >   
  8.           < description > Basic page to show the simple portlet </ description >   
  9.         </ navigation >   
  10. < fragment   name = "row1"   type = "row" >   
  11. < fragment   name = "col1"   type = "column" >   
  12.  < fragment   name = "p1"   type = "portlet" >   
  13.                     < property   name = "portlet"   value = "1.1" />   
  14.                 </ fragment >   
  15.             </ fragment >   
  16.         </ fragment >   
  17.         < fragment   name = "row2"   type = "row" >   
  18.             < fragment   name = "col1"   type = "column" >   
  19.                 < fragment   name = "p1"   type = "portlet" >   
  20.                     < property   name = "portlet"   value = "1.1" />   
  21.                 </ fragment >   
  22.             </ fragment >   
  23.         </ fragment >   
  24.     </ fragment >   
  25. </ portal >   
<?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>



Eclipse下Portlet应用开发(JSR168)_第8张图片

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 , 可以看到如下的页面
Eclipse下Portlet应用开发(JSR168)_第9张图片

单击PortletRequest Example Page后可以看到如下Portlet 页面
Eclipse下Portlet应用开发(JSR168)_第10张图片

单击 GetActionByJava 后
Eclipse下Portlet应用开发(JSR168)_第11张图片

单击 GetActionByTag 后, 将跳转到edit modes
Eclipse下Portlet应用开发(JSR168)_第12张图片

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/pluto
Pluto Mail List
http://news.gmane.org/gmane.comp.jakarta.pluto.user
WSRP Spec1.0
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrp
Apache的WSRP实现
http://ws.apache.org/wsrp4j/
Apache’s Portal, JetSpeed:
http://jakarta.apache.org/jetspeed/site/index.html
JSR 168:
http://www.jcp.org/en/jsr/detail?id=168

你可能感兴趣的:(eclipse,tomcat,jsp,应用服务器,servlet)