- 浏览: 2830625 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (1173)
- 名言警句 (5)
- 心情随笔 (50)
- 数据库 (57)
- Java基础 (241)
- J2EE框架 (91)
- 数据结构 (12)
- 程序设计 (21)
- WEB技术 (128)
- 网络日志 (12)
- IT资讯 (247)
- linux (64)
- solaris (2)
- 其它 (143)
- WebService (4)
- 日语学习 (2)
- 机器人 (5)
- Android (5)
- cgywin (3)
- Game (1)
- DWR (1)
- spring (8)
- canvas (1)
- Guava (3)
- Modbus (5)
- 测试 (6)
- mongodb (9)
- Quartz (2)
- Cron (1)
- windows (2)
- 持续集成 (1)
- bootstrap (3)
- 结对编程 (1)
- nodejs (1)
- Netty (1)
- 安全 (3)
- webstorm (2)
- sparkline (1)
- Job (1)
- git (3)
- Maven (3)
- knockout (5)
- jquery (1)
- bower (1)
- docker (1)
- confluence (4)
- wiki (1)
- GoogleMap (1)
- jekyll (10)
- ruby (2)
- npm (3)
- browserify (1)
- gulp (3)
- openwrt (1)
- discuz (3)
- 输入法 (1)
- JPA (1)
- eclipse (2)
- IntelliJ (1)
- css (1)
- 虚拟机 (1)
- 操作系统 (1)
- azkaban (2)
- scrum (1)
最新评论
-
pangxiea_:
你好, 想请问一下 Linux下 这么使用rxtxcomm 在 ...
使用Java进行串口通信 -
abababudei:
请教一下,这个您是怎么解决的:/dev/ttyS2enteri ...
Java应用程序的MODBUS通讯 -
xuniverse:
hannibal005 写道楼主,我问下 request.se ...
用javascript与java进行RSA加密与解密 -
atxkm:
找了一下午,终于找到了
gulp 拷贝文件时如何移除文件目录结构 -
kalogen:
gtczr 写道非常感谢,经过我自己的修改,已经完美实现。发出 ...
用javascript与java进行RSA加密与解密
开发环境部署
配置开发环境
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, 如图:
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 >
<?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 >
<?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/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
发表评论
-
高级Java程序员值得拥有的10本书
2015-05-04 07:24 766Java是时下最流行的编程语言之一。市面上也出现了适合初学者 ... -
深入理解java异常处理机制
2015-01-30 09:30 12801. 引子 try…catch…fi ... -
java 运行时参数设置
2015-01-07 09:13 823JVM的运行时参数: -Xms为执行单元内存的1/4, ... -
每个Java开发者都应该知道的5个JDK工具
2014-12-29 12:37 1104JDK是Java语言的软件开 ... -
使用双重锁判定可以大幅降低锁的征用
2014-12-29 12:30 708class ObjInstance { //单例 pri ... -
MAVEN Scope使用说明
2014-11-24 09:40 716在Maven的依赖管理中,经常会用到依赖的scope设置。这 ... -
Spring4 quartz job xml configuration
2014-11-11 09:46 14051. 定义job details public ... -
Add items into list in one line using guava
2014-11-10 10:54 694//@formatter:off fina ... -
配置动态读取(变化)文件 in Spring
2014-11-10 08:51 12931. 从环境变量中读取路径: <bean id=&q ... -
JAVA实现AES加密与解密
2014-11-04 15:34 616package com.eifesun.monitor.up ... -
Netty4.x分析
2014-07-31 11:06 1421官网定义: netty是一个异步、事件驱动的网络应用框架,用 ... -
Ways to sort lists of objects in Java based on multiple fields
2014-07-21 17:19 7351. the first way: Sorting wit ... -
how to parse a String to BigDecimal
2014-07-21 10:08 889private BigDecimal parsePrice( ... -
order list using google guava
2014-07-21 09:08 854Predicate<String> filter ... -
Java 读文件操作
2014-07-08 14:09 8581. only use java core, no exte ... -
怎样使Java 中测试按一定顺序执行
2014-03-10 11:27 1268@FixMethodOrder(MethodSorters. ... -
如何实现在当类初始化时,自动调动某个方法
2014-02-14 14:44 925有两种思路, 1. 将这个类实现为thread类 (or ... -
持续集成JenkinsAPI常见用法
2014-02-10 13:54 43jenkins(持续集成开源工具)提供了丰富的api接口,基 ... -
Sonar 安装与使用
2014-01-13 10:49 1695Sonar 是一个用于代码质量管理的开放平台。通过插件机制, ... -
源代码管理分析工具 Source Navigator的安装与使用
2014-01-13 09:51 1843Source-Navigator是原来redhat开发的一个 ...
相关推荐
JSR-168是适合于portlet开发人员的Java API集合。设计符合规范的JSR-168 portlet的原因有很多。可移植性就一个显而易见的好处。根据规范编写的代码更容易在门户服务器之间移动。多数基于Java的门户服务器都支持JSR-...
JSR-168 Portlet 开发 JSR-168 Portlet 开发
基于JSR168的portlet精彩范例
Struts2 JSR168 Portlet的开发
PORTAL开发相关标准:JSR168Introduction_to_JSR_168
通过自己学习中记录的演示eclipse+tomcat开发portlet的每个步骤,含截图和demo,适合初学者。
在RAD7中开发JSR168 Portlet
本压缩包里含有了开发一个jsr168 portlet所需要的软件 本想包含jetspeed2.0的安装程序的,可是最多智能上传10M <br>从环境配置讲到开发步骤。 并表明了很多注意的地方 本包适合初学portlet的人使用
portlet国际标准 JSR168 PORLET标准手册汉化整理
目前最全的资源 jsr168 jsr286 中英文都有 还有API
开发Portlet的JSR-168标准手册跟帮助文档。
Eclipse 中 JSR 168 Portlet Project Creator 插件两个jar包 用于开发Portlet
文章专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet 新...在学习完本系列后,您将了解相对于 JSR 168 Portlet,JSR 286 Portlet 究竟提供了哪些增强功能, 以及这些新增特性在实际开发中的应用。
使用jsr标准开发简单的portlet项目
JSR168规范与API手册 官方手册、标准 Portlet1.0开发必备
许多大型企业的网站, 渐渐采用了 portal server 作为开发的基础. 至于什么是 portal 呢, 中文翻译为 "门户网站"。 有人可能想.. 天杀的.. 门户网站不是就像 yahoo, pchome, yam 等等。不过, 我们现在讨论的 portal ...
关于portlet 开发的一源码的开发指导
使用eclipse开发基于jsr168标准的portlet项目
文章专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet 新...在学习完本系列后,您将了解相对于 JSR 168 Portlet,JSR 286 Portlet 究竟提供了哪些增强功能, 以及这些新增特性在实际开发中的应用。