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 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 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,应用服务器,.net,jsp)