基于 Struts 2 构建 WebSphere Portal 上的 Portlet 应用.docx
《基于 Struts 2 构建 WebSphere Portal 上的 Portlet 应用.docx》由会员分享,可在线阅读,更多相关《基于 Struts 2 构建 WebSphere Portal 上的 Portlet 应用.docx(36页珍藏版)》请在冰豆网上搜索。
基于Struts2构建WebSpherePortal上的Portlet应用
2008年2月28日
Struts2是MVC框架发展的最新阶段。
Struts2从WebWork发展而来,而不是由Struts1演化而来,因此利用Struts2开发和部署应用程序有很多不同于Struts1的地方,尤其是在开发和部署Porlet方面,Struts2更是有着以往Portlet应用程序开发方式所无法比拟的优势。
本文的目的就是通过在IBM的WebSpherePortalServer上开发和部署一个基于Struts2的Porlet应用,向读者介绍利用Struts2进行Portlet应用开发的优势和关键流程。
概述
WebSpherePortalServer5.1及以上版本支持两种PortletAPI:
第一种是IBMPortlet,这种PortletAPI是WebSpherePortalServer专有的一种PortletAPI;第二种是符合JSR168标准的PortletAPI。
由于JSR168是一个开放的标准,因此符合JSR168标准的Portlet将更易于移植。
IBM为IBMPortletAPI和JSR168API分别实现了基于Struts1的Portlet开发框架,由于基于Struts1,这两种Portlet框架API同PortletAPI耦合紧密,尤其需要指出的是由于无论IBMPortlet还是在WebSpherePortalServer上实现的JSR168标准的PorletAPI,它们的接口都直接依赖于PortletRequest/PortletResponse对象,这就使得程序移植和单元测试等变得比较困难。
此外,我们在使用Struts1开发Servlet应用时,习惯于将数据存放在request作用域中,通过页面的跳转将数据呈现到jsp视图页面。
但是,这种做法在portlet开发中是不可行的。
与servlet的生命周期有所不同,portlet存在操作响应阶段和呈现阶段。
在portlet操作响应阶段存放在request作用域的变量,在呈现阶段就会失效。
在原有API上解决这个问题既费时又不优雅,而Struts2对Portlet的支持将能够很好的解决这些问题。
本文就是要通过一个简单的示例应用程序的开发和部署过程,来展示Struts2怎样解决旧有的PortletAPI所无法克服的困难的。
本文的重点不在于开发一个Struts2Web应用程序,而在于开发一个作为Portlet的Struts2应用程序所需的的实现和配置。
读者可以了解到如何利用Struts2来创建一个Portlet,这个Portlet将完全独立于其所开发和部署的平台。
在示例应用程序的开发和部署中用到了下列产品:
∙IBMWebSpherePortalServer集成测试环境5.1
∙IBMWebSphereApplicationServerVersion5.1
∙Struts2FullDistribution2.0.11
∙IBMRationalApplicationdeveloper7(RAD7)
Porlet示例程序设计概述
示例应用程序是一个简单的用户登录程序。
合法的用户将跳转到的登录成功页面,登录失败的用户则跳转到登录失败页面,并被要求输入正确的用户名和密码。
用户可以自由的在Portlet的View、Edit和Help模式之间进行切换。
应用程序视图部分分为以下几部分:
∙登录页面(login.jsp)——提示用户输入正确的用户名和密码,登录应用程序。
∙登录成功页面(success.jsp)——提示用户登录成功。
∙登录失败页面(fail.jsp)——提示用户登录失败,提示用户输入正确的用户名和密码。
∙Edit页面(edit.jsp)——用户进入Edit模式后的页面。
∙Help页面(help.jsp)——用户进入Help模式后的页面。
∙程序主类——Login.java。
图1.程序初始页面
下图是本文示例的Action与页面的交互图:
图2.Action与页面的交互图
利用Struts2实现Portlet
在本文中,使用Struts2开发Portlet应用需要经历以下步骤:
1.使用RAD7建立开发环境
2.生成web.xml配置文件
3.生成portlet.xml配置文件
4.编辑jsp文件
5.应用Struts2
6.部署Portlet应用程序
7.访问Portlet应用
使用RAD7建立开发环境
在RationalApplicationdeveloper7中启动一个Portlet项目,需要遵循下列步骤:
1.选择新建一个Portlet项目,如图3所示:
图3.新建一个Portlet项目
2.输入项目名Struts2TestPortlet,目标运行时选择WebSpherePortalv5.1或者更高版本,注意PortletAPI选择JSR168Portlet,注意勾掉创建portlet选项,点击完成按钮。
如图4所示:
图4.设置项目属性
生成portlet项目及其结构如图5所示:
图5.portlet项目及其结构
3.接下来到Apache官方网站下载strtus2的完整版(FullDistribution)。
将下载到的Zip文件解压缩。
本文中使用的版本为struts-2.0.11。
将struts-2.0.11j4文件夹下的backport-util-concurrent-3.0.jar,retrotranslator-runtime-1.2.2.jar,struts2-core-j4-2.0.11.jar,xwork-j4-2.0.4.jar和lib目录下的ognl-2.6.11.jar,freemarker-2.3.8.jar文件拷贝到portletweb工程的WEB-INF/lib目录下。
在这里需要注意的是从j4文件夹下拷贝过来的JAR包,这是因为WebSpherePortalSever5.1基于jdk1.4,而j4文件夹下的内容就是Struts2支持JDK1.4的JAR文件。
生成web.xml配置文件
双击WEB-INF/web.xml,打开web部署描述符界面,如图6所示:
图6.web部署描述符界面
切换到过滤器选项卡,点击添加按钮,创建一个过滤器,名称设定为Struts2Filter,URL映射为/*,并且使用现有的过滤器类org.apache.struts2.dispatcher.FilterDispatcher,如图7所示。
点击完成
图7.创建一个过滤器
生成的web.xml描述文件内容如下所示:
web.xml描述文件内容
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"
"
Struts2TestPortlet
Struts2Filter
Struts2Filter
Struts2Filter
org.apache.struts2.dispatcher.FilterDispatcher
Struts2Filter
/*
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
生成portlet.xml配置文件
双击portlet.xml,打开Portlet部署描述符界面,切换到portlet选项卡,如图8所示:
图8.Portlet部署描述符界面
点击添加按钮,添加一个portlet,输入portlet类型org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher,确定,如图9所示:
图9.添加portlet
编辑该portlet的其它信息,分别设定Portlet名称,显示名称,标题,简短标题,关键字。
本示例中均输入Struts2TestPortlet。
如图10所示:
图10.编辑portlet信息
接下来在本页中编辑受支持的方式text/html,添加portlet模式view,edit,help。
如图11所示:
图11.添加portlet模式
Portlet模式让Portlet决定它该显示什么内容和执行什么动作。
调用一个Portlet的时候,Portlet容器会提供一个Portlet模式给那个Portlet。
当在处理一个请求动作时,Portlet的模式是可以用程序来改变的。
JSR168规范定义了三个Portlet模式:
浏览(View)、编辑(Edit)和帮助(Help)。
Struts2支持其中的全部三个模式。
同时Portal还可以根据使用者的角色,来决定是要提供(显示)哪几个Portlet模式给使用者操作。
在我们的例子中就使用了这三个模式。
继续在本页中添加初始化参数,首先是Namespace相关的参数见表1:
表1.Namespace相关的参数
名称
值
viewNamespace
/view
editNamespace
/edit
helpNamespace
/help
考虑到在同一个Web应用中需要同名Action,Struts2以命名空间方式管理Action。
同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。
Struts2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为下面所有的Action指定共同的命名空间。
这一点可以从下面的portlet.xml清单中看出。
Struts2对portlet的三种模式的支持是通过namespace体现的。
View,Edit,Help三种模式分别对应ViewNamespace,editNamespace,helpNamespace。
Action相关的参数见表2:
表2.Action相关的参数
名称
值
defaultViewAction
view
defaultEditAction
edit
defaultHelpAction
help
这些参数指定了在portlet的三种模式下的默认aciton名称,进入View、Edit、Help模式分别首先调用名称为view、edit、help的action。
图12.编辑portlet初始化参数
生成portlet.xml文件如下:
portlet.xml描述文件内容
xmlversion="1.0"encoding="UTF-8"?
>
xmlns="
version="1.0"xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
id="com.ibm.faces.portlet.FacesPortlet.3ccbdcb861">
Struts2TestPortlet
Struts2TestPortlet
org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher
viewNamespace
/view
editNamespace
/edit
helpNamespace
/help
defaultViewAction
view
defaultEditAction
edit
defaultHelpAction
help
text/html
view
edit
help
Struts2TestPortlet
Struts2TestPortlet
Struts2TestPortlet
在本清单中Portlet类“org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher”在将Struts2集成到Portlet中起到了关键作用,该类将Portlet操作分发给Struts2。
编辑jsp文件
在WEB-INF下新建jsp文件夹,并生成几个jsp文件及内容如下:
input.jsp
<%@taglibprefix="s"uri="/struts-tags"%>
Pleasesignin
formaction="login"method="POST">
textfieldlabel="UserName"name="username"value="%{username}"/>
passwordlabel="Password"name="password"value="%{password}"/>
submitvalue="Signin"/>
form>
success.jsp
<%@taglibprefix="s"uri="/struts-tags"%>
Welcomepropertyvalue="username"/>
urlaction="view"/>">Backtosigninpage
fail.jsp
<%@taglibprefix="s"uri="/struts-tags"%>
Invalidusernameorpassword!
urlaction="view"/>">Backtosigninpage
edit.jsp
<%@taglibprefix="s"uri="/struts-tags"%>
Thisiseditpage!
help.jsp
<%@taglibprefix="s"uri="/struts-tags"%>
Thisishelppage!
应用Struts2
建立Struts2配置文件struts.xml
在src目录下建立struts.xml,工程构建之后struts.xml会被置于WEB-INF/classes下,这也是Struts2默认的配置文件路径。
struts.xml文件是基于Struts2的项目的核心配置文件。
在portlet开发过程最重要的内容就是要将"struts-portlet-default.xml"包含进来,这个xml文件存在于前面步骤中我们拷贝过来的struts2-core-j4-2.0.11.jar中,只有把它包含进来我们才能使Struts2支持portlet。
接下来描述的内容就是将前面定义的action和页面关联起来。
从中可以看出我们定义的login这个actoin的输入界面是input.jsp,如果成功则会被转向success.jsp,失败则会被转向fail.jsp。
struts.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
namespace="/view">
/WEB-INF/jsp/input.jsp
/WEB-INF/jsp/input.jsp
/WEB-INF/jsp/success.jsp
/WEB-INF/jsp/fail.jsp
namespace="/edit">
/WEB-INF/jsp/edit.jsp
namespace="/help">
/WEB-INF/jsp/help.jsp
新建java类Login.java
Login.java
packagestruts2TestPortlet.action;
publicclassLoginextendsActionSupport{
Stringusername;
Stringpassword;
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}