Portal是一个包含很多自定义的、可定制网页的Web应用。一个Portal应用里面包含有多个Portlets,而Porlets是一些web组件,可以嵌入到Portal应用里面。在上一篇文章《SOA概念的一些个人见解》中,我提到过SOA的服务包含表示层服务,这些Portlets可以看作是表示层的服务。下图是一个Portal的应用的例子:
在这个网站中,我们可以看到,整个网站又多个小窗口组成,这些窗口可以最小化,最大化和关闭,这些小窗口就是一个个的Portlets。Portlets和Servelet一样,需要一个容器来管理,Servelet需要一个WEB容器来管理,而Portlets则需要用一个Portal容器来进行管理。在这篇文章里,我将介绍如何在Netbeans里创建和管理Portlets。
Netbeans部署和测试软件需求:
1、JDK1.6以上版本
2、OpenPortal Portlet Container 2.0 beta
3、Netbeans 6.0以上版本(我使用的是Netbeans 6.1),并安装这些插件:jMaki Ajax Support,OpenPortal Portlet Container, Generic Portlet。
Netbeans部署和测试实验步骤:
1、把Portal容器配置到glassfish中:下载OpenPortal Portlet Container 2.0 beta,下载的文件是一个jar包,把该jar包的路径拷贝到命令行中,用java -jar portlet-container-configurator.jar命令执行安装,并选择glassfish的安装路径,如下图所示:
点击OK即可进入下一步。
2、配置Portal服务器:打开"Service"窗口,右键单击"server"-"Add Server",在弹出的窗口中选择"OpenPortal Portlet Container 2",点击下一步,这一步要选择WEB容器,默认是GlassFish Server,在GlassFish Home中把路径指向glassfish的安装目录即可,如:C:\Program Files\glassfish-v2ur2。另外还需要输入admin的口令,默认是adminadmin。点击下一步并完成即可配置好。
3、新建一个web工程:File - New - Web - Web Application,命名为MyPortlet,点击下一步,其中Server选择"OpenPortal Portlet Container 2.0",点击下一步,选择框架时,必须把Portlet Support及jMaki Ajax Framework选中,在选中Portlet Support时,注意要把"Create Portlet"选中,并把Portlet Class Name和Portlet Name都改为MyPortlet,注意,这两个名称必须一致,如下图所示:
选中jMaki时,把CSS Style选为No CSS Style,如下图所示:
4、工程建立完毕以后,我们展开WEB-INF文件夹,可以看到以下结构:
在一个Portlet里面,我们不再需要index.jsp,因此可以先把index.jsp删除。Portlet的视图是在WEB-INF下的jsp目录下的MyPortlet_view.jsp。Netbeans IDE为我们生成了一个非常重要的源文件,那就是源包中的com.test.MyPortlet.java。这个java文件相当于Portlet的一个控制器,它继承了GenericPortlet这个基类,doView,doEdit,doHelp方法分别会被GenericPortlet里的render()方法调用,为Portlet指定视图、编辑页面及帮助页面。
5、右键单击项目的"Build",生成项目并运行,你可以看到如下的页面:
由于MyPortlet_view.jsp中只有一句:MyPortlet - VIEW MODE,因此,我们看到窗口中只有一句话:MyPortlet - VIEW MODE。注意MyPortlet窗口右上角的那些按钮,都是可以使用的,大家可以尝试点按一下它们,体验一下Portlet的含义。
6、下面我们来为该Portlet添加一些动态和静态的内容,包括RSS订阅的功能。
首先,打开WEB-INF/jsp/MyPortlet_view.jsp,我们来在主视图中添加一个多页选项卡:
把MyPortlet - VIEW MODE这行去掉,在组件面板中拖一个Yahoo的ViewTab到jsp代码中,在jsp代码中生成了以下代码:
- value="{items:[
- {label : 'My Tab', content : 'Some Content'},
- {id : 'bar', label : 'My Tab 2', include : 'test.jsp ', lazyLoad : true },
- {label : 'My Tab 3', content : 'More Content', selected : true}
- ]
- }" />
点击项目的右键,选择Undeploy and deploy,再运行一下项目,你可以看到以下的页面:
点击MyTab2时,得到一个消息"Unable to load URL test.jsp .",那是因为MyTab2指向一个jsp文件,而我们并没有创建这个文件。将MyPortlets_view.jsp的那段Widget的代码用以下的替换:
现在,我们来创建3个jsp文件。点击Web Pages的右键,注意,是Web Pages的右键,而不是WEB-INF/jsp的右键,因为我们现在不是要创建Portlet的视图,而是在Portlet中引用其他的页面,注意到上面这段代码中,Tab里面的URL的上下文都是MyPortlet。分别创建download.jsp,fundamentals.jsp和whatsnew.jsp三个jsp文件。
打开download.jsp,用以下这段代码来替换body里面的代码:
- Downloads for New Developers
Sun SITE下载中心
NetBeans IDE
MySQL Database
打开fundamentals.jsp,把正文部分的
JSP Page
去掉,从组件面板中拖一个jMaki Widgets的Blog List到正文body部分,生成如下代码:
生成的代码只是一些示例的文本,我们把代码替换为以下:
- Java Technology Fundamentals
如果你需要完成RSS订阅的功能,必须把service设置为service="/xhp?id=rss",而每一个使用jMaki框架的应用,在应用上下文中(也就是web.xml)都配置了一个jmaki.xhp.XmlHttpProxyServlet的Servlet,其URL映射为/xhp。因此,我们在请AJAX代理时,一定要引入这个上下文。你可以修改xhp.json文件来自定义需要订阅的内容。打开xhp.json,我们可以看到最后一项数据是:
- {"id": "rss",
- "url":"http://weblogs.java.net/blog/ludo/index.rdf",
- "xslStyleSheet": "rss.xsl"
- }
在这段代码中,url指定了RSS订阅的地址是http://weblogs.java.net/blog/ludo/index.rdf,这里,我们改为:
http://blogs.sun.com/JavaFundamentals/feed/entries/rss
另外,我们还需要在whatsnew页面中订阅另外一个RSS,因此,把原有的那段代码用以下的替换:
- {"id": "rss", "url":"http://blogs.sun.com/JavaFundamentals/feed/entries/rss", "xslStyleSheet": "rss.xsl" }, {"id": "rss2", "url":"http://developers.sun.com.cn/blog/scut/feed/entries/rss", "xslStyleSheet": "rss.xsl" }
注意,两个id之间必须要有个逗号分隔开来。接下来,打开whatsnew.jsp,用以下静态内容替换body部分的代码:What's PopularThe Java Tutorial
Java Technology Fundamentals
Core Tech Tips
Easy Web Site Creation in the NetBeans IDE
The Java EE 5 Tutorial
What's New然后,在组件面板中拖一个Blog list出来,并替换为以下:7、配置Widget的样式。打开resources/jmaki/bloglist/component.css,把height : 75px; 替换为height : 25px; 另外,在component.htm中,把
@{description}
删掉,因为我们只需要保留标题,而不需要显示详细的内容。 8、重新部署项目,点击项目右键,选择Undeploy and deploy,再运行,就可以看到自己定制的Portlet了:
9、再新建一个Portlet,创建的顺序与上一个Portlet相同,在编辑Portlet的View时,简单地拖两个widget进去进行调试,这里,我拖的是Yahoo的Search和Dojo的Clock,部署并运行,我们在Portlet管理页面上就可以同时看到这两个Portlet了:
【编辑推荐】