- 浏览: 934297 次
文章分类
最新评论
-
kchiu:
说的都是废话
TCP,socket 心跳检测 -
5iu0:
好东东 但是在客户端要如何实现语音播报呢还有声音能在优化下吗
Java文本语音转换组件JTTS发布(eSpeak封装) -
a455642158:
牛逼啊……
java字符串编码类型获取 -
jj7jj7jj:
这篇文章很不错
关于手机(智能机)游戏开发的43条小诀窍 -
hexin3000:
你好,我现在在学习android ,能把这个实例的完整 ...
Android以后台Service的方式获取GPS数据,并定时发送到服务器
基于Struts2构建 WebSphere Portal上的Portlet应用
Struts 2 是 MVC 框架发展的最新阶段。Struts 2 从 WebWork 发展而来,而不是由 Struts 1 演化而来,因此利用 Struts 2 开发和部署应用程序有很多不同于 Struts 1 的地方,尤其是在开发和部署 Porlet 方面,Struts 2 更是有着以往 Portlet 应用程序开发方式所无法比拟的优势。本文的目的就是通过在 IBM 的 WebSphere Portal Server 上开发和部署一个基于 Struts 2 的 Porlet 应用,向读者介绍利用 Struts 2 进行 Portlet 应用开发的优势和关键流程。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
WebSphere Portal Server5.1 及以上版本支持两种 Portlet API:第一种是 IBM Portlet,这种 Portlet API 是 WebSphere Portal Server 专有的一种 Portlet API;第二种是符合 JSR168 标准的 Portlet API。由于 JSR168 是一个开放的标准,因此符合 JSR168 标准的 Portlet 将更易于移植。
IBM 为 IBM Portlet API 和 JSR168API 分别实现了基于 Struts1 的 Portlet 开发框架,由于基于 Struts1,这两种 Portlet 框架 API 同 Portlet API 耦合紧密,尤其需要指出的是由于无论 IBM Portlet 还是在 WebSphere Portal Server 上实现的 JSR168 标准的 Porlet API, 它们的接口都直接依赖于 PortletRequest/PortletResponse 对象,这就使得程序移植和单元测试等变得比较困难。此外,我们在使用 Struts1 开发 Servlet 应用时,习惯于将数据存放在 request 作用域中,通过页面的跳转将数据呈现到 jsp 视图页面。但是,这种做法在 portlet 开发中是不可行的。与 servlet 的生命周期有所不同,portlet 存在操作响应阶段和呈现阶段。 在 portlet 操作响应阶段存放在 request 作用域的变量,在呈现阶段就会失效。在原有 API 上解决这个问题既费时又不优雅,而 Struts 2 对 Portlet 的支持将能够很好的解决这些问题。
本文就是要通过一个简单的示例应用程序的开发和部署过程,来展示 Struts 2 怎样解决旧有的 Portlet API 所无法克服的困难的。
本文的重点不在于开发一个 Struts2 Web 应用程序,而在于开发一个作为 Portlet 的 Struts2 应用程序所需的的实现和配置。读者可以了解到如何利用 Struts 2 来创建一个 Portlet,这个 Portlet 将完全独立于其所开发和部署的平台。
在示例应用程序的开发和部署中用到了下列产品:
- IBM WebSphere Portal Server 集成测试环境 5.1
- IBM WebSphere Application Server Version 5.1
- Struts 2 Full Distribution 2.0.11
- IBM Rational Application developer 7(RAD7)
|
|
示例应用程序是一个简单的用户登录程序。合法的用户将跳转到的登录成功页面,登录失败的用户则跳转到登录失败页面,并被要求输入正确的用户名和密码。用户 可以自由的在 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 应用需要经历以下步骤:
- 使用 RAD7 建立开发环境
- 生成 web.xml 配置文件
- 生成 portlet.xml 配置文件
- 编辑 jsp 文件
- 应用 Struts2
- 部署 Portlet 应用程序
- 访问 Portlet 应用
|
|
在 Rational Application developer 7 中启动一个 Portlet 项目,需要遵循下列步骤:
-
选择新建一个 Portlet 项目,如图 3 所示:
图 3. 新建一个 Portlet 项目
-
输入项目名 Struts2TestPortlet,目标运行时选择 WebSphere Portal
v5.1 或者更高版本,注意 Portlet API 选择 JSR 168 Portlet,
注意勾掉创建 portlet 选项,点击完成按钮。如图 4 所示:
图 4. 设置项目属性
生成 portlet 项目及其结构如图 5 所示:
图 5.portlet 项目及其结构
-
接下来到 Apache 官方网站下载 strtus2 的完整版 (Full Distribution)。将下载到的 Zip 文件解压缩。本文中使用的版本为 struts-2.0.11。将 struts-2.0.11 j4 文件夹下的 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 文件拷贝到 portlet web 工程的 WEB-INF/lib 目录下。
在这里需要注意的是从 j4 文件夹下拷贝过来的 JAR 包,这是因为 WebSphere Portal Sever 5.1 基于 jdk1.4,而 j4 文件夹下的内容就是 Struts2 支持 JDK1.4 的 JAR 文件。
|
|
双击 WEB-INF/web.xml,打开 web 部署描述符界面,如图 6 所示:
图 6.web 部署描述符界面
切换到过滤器选项卡,点击添加按钮,创建一个过滤器,名称设定为 Struts2 Filter, URL 映射为 /*, 并且使用现有的过滤器类 org.apache.struts2.dispatcher.FilterDispatcher,如图 7 所示。点击完成
图 7. 创建一个过滤器
生成的 web.xml 描述文件内容如下所示:
web.xml 描述文件内容
|
|
|
双击 portlet.xml,打开 Portlet 部署描述符界面,切换到 portlet 选项卡,如图 8 所示:
图 8.Portlet 部署描述符界面
点击添加按钮,添加一个 portlet, 输入 portlet 类型 org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher,确定,如图 9 所示:
图 9. 添加 portlet
编辑该 portlet 的其它信息,分别设定 Portlet 名称,显示名称,标题,简短标题,关键字。本示例中均输入 Struts2 Test Portlet。如图 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 相关的参数
/view |
/edit |
/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 相关的参数
view |
edit |
help |
这些参数指定了在 portlet 的三种模式下的默认 aciton 名称,进入 View、Edit、Help 模式分别首先调用名称为 view、edit、help 的 action。
图 12. 编辑 portlet 初始化参数
生成 portlet.xml 文件如下:
portlet.xml 描述文件内容
|
在本清单中 Portlet 类“org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher”在将 Struts2 集成到 Portlet 中起到了关键作用,该类将 Portlet 操作分发给 Struts2。
|
|
在 WEB-INF 下新建 jsp 文件夹,并生成几个 jsp 文件及内容如下 :
input.jsp
|
success.jsp
|
fail.jsp
|
edit.jsp
|
help.jsp
|
|
|
在 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
|
Login.java
|
在实现相同功能的前提下,我们不妨看一下 Struts 1 的相关实现,示例中采用的是 IBM 的 Struts for JSR168 Portlet 实现。
首先,我们必须针对用户输入的表单数据创建一个 ActionForm,当然,您也可以通过 xml 文件配置的方式创建一个 DynamicForm。
java 类 LoginActionForm.java
|
接下来,我们需要实现一个 Action 类。
java 类 LoginAction.java
|
在 Struts1 中,我们习惯使用 JSTL 从 request 作用域中取得数据,呈现到 JSP 页面上,success.jsp 页面被改动如下:
success.jsp
|
由于精通 Struts1 的读者很多,其余相关改动和 struts1 的配置我们不再拗述,请读者查阅相关文献。
从中我们可以看出 struts2 和 struts1 的区别,并从中体会到 Struts2 的优势:
-
捕获输入:
Struts1 使用 ActionForm 对象捕获输入。所有的 ActionForm 必须继承一个基类。因为其他 JavaBean 不能用作 ActionForm,开发者经常创建多余的类捕获输入。当然您也可以使用 xml 文件描述一个 DynamicForm,但工作量并未显著减少。
Struts 2 可以直接使用 Action 属性作为输入属性,消除了对第二个输入对象的需求。当然,Struts2 也支持 ActionForm 模式,用作输入 / 输出对象。 -
Action 类 :
Struts1 要求 Action 类继承一个抽象基类。Struts1 的一个普遍问题是使用抽象类编程而不是接口。
Struts2 Action 类可以实现一个 Action 接口,也可实现其他接口。Struts2 提供一个 ActionSupport 基类去实现常用的接口,但 Action 接口不是必须的,任何有 execute 标识的 POJO 对象都可以用作 Struts2 的 Action 对象。 -
Portlet 依赖 :
Struts1 Action 依赖于 Portlet API , 当一个 Action 被调用时,PorletRequest 和 PortletResponse 被传递给 execute 方法。
Struts2 Action 不依赖于容器,允许 Action 脱离容器单独被测试。如果需要,Struts2 Action 仍然可以访问初始的 request 和 response。但是,其他的元素减少或者消除了直接访问 PorletRequest 和 PortletResponse 的必要性。 -
可测性 :
测试 Struts1 Action 的一个主要问题是 execute 方法暴露了 Portlet API,这使得测试要依赖于容器。
Struts2 Action 可以通过初始化、设置属性、调用方法来测试,使测试更容易。 -
对 Portlet 的支持程度:
Struts1 框架天生并不支持 Portlet, 为了将大批 Struts 程序员吸引到 WebSphere Portal 开发上来,IBM 公司针对自己的两种 Portlet 实现(IBM Portlet 和 JSR168 Portlet), 分别对 Struts 框架进行了扩展,以适应 Portlet 开发。细心的读者一定已经发现了,我们的 LoginAction 类继承的是 com.ibm.portal.struts.action.StrutsAction 这个基类,而不是 Struts1 官方框架中的 Action 类。
Struts1 程序员刚刚进行 Portlet 开发的时候,一般会忽略一个重要的问题。与 servlet 的生命周期有所不同,portlet 存在操作响应 (Action) 阶段和呈现(Render)阶段。 在 portlet 操作响应阶段存放在 request 作用域的数据,在呈现阶段就会失效。为了解决这个问题,一个方案就是把数据放在 session 作用域中,考虑到服务器性能的原因,这个方案显然不被推荐。另一个方案就是使用 IBM 提供的一些特殊的 API, 按照 LoginAction 那样,在将数据放在 request 作用域之前,将数据变量名作为参数传给 StrutsViewCommand 的 addAttributeNameToSave 方法。为了说明这个问题,我们可以将 StrutsViewCommand.addAttributeNameToSave("username") 这行代码删掉,程序运行候就可以发现,success.jsp 将不会呈现 username 变量中保存的数据。
Struts2 的官方框架支持 JSR168 Portlet, 除了前期需要对 web.xml、portlet.xml 和 struts.xml 文件进行少许特殊配置外,程序员不需要考虑 Portlet 和 Servlet 之间的不同,无论是 Action 类的开发还是 JSP 页面中 Struts2 标签的应用,同在 Servlet 容器中用法是完全一样的。
采用 Struts2 的校验框架时,只需为该 Action 指定一个校验文件即可。该文件指定了 Action 的属性必须满足怎样的规则,下面清单即本应用中 Action 的校验文件的代码。Struts2 的校验文件规则与 Struts1 的校验文件设计方式不同,Struts2 中每个 Action 都可以有一个校验文件,该文件的文件名遵守如下规则:
<Action 名字 >-validation.xml
前面的 Action 名是可以改变的,后面的 -validation.xml 部分是固定不变的,且该文件应该被保存于 Action class 文件相同的路径下。如在本例中此校验文件在项目构建后保存在 WEB-INF/classes/Struts2TestPortlet/action/ 下,与 login.class 在同一目录中。
Login-validation.xml
|
|
|
首先在 RAD7 控制台的服务器视图中添加一个可以运行 Portlet 的服务器。该视图中单击鼠标右键,选择新建—> 服务器。如图 13 所示 :
图 13. 新建服务器
在弹出的新建服务器窗口中选择目标运行服务器,在本例中我们选择 WebSphere Portal V5.1 测试环境 , 对话框底部的服务器运行时呈现为 WebSphere Portal V5.1。在服务器主机名中输入 localhost,如图 14 所示。点击下一步,默认端口号为 9081。
图 14. 选择目标运行服务器
继续点击下一步,出现门户网站服务器设置对话框,在这里需要将默认的管理员用户及密码设置成您在安装相应 Portal server 时设置的管理员用户及密码。如图 15 所示:
图 15. 门户网站服务器设置
点击下一步,进入添加项目界面,将 " 可用的项目 " 一栏中的 Portlet 项目添加到右侧 " 已配置项目 " 栏中。点击完成,于是我们就完成了这个 Portlet 项目在 RAD7 中的配置和部署。如图 16 所示:
图 16. 添加 portlet 项目
在启动服务器之前,需要右键点击服务器标签页中的已添加的服务器,选择 " 打开 ",然后进入 " 门户网站 " 标签页,检查确认管理员用户和密码已经被设置成安装 Portal server 时设置的管理员用户,如图 17 所示。以确保 Portal server 启动成功。
图 17. 检查确认管理员用户和密码设置
接下来,右键点击服务器标签页中已添加的服务器,选择 " 启动 ",服务器被启动。您可以从控制台中观察启动过程输出的日志。
图 18. 启动服务器
|
|
打开浏览器网页输入:http://localhost:9081/wps/myportal, 输入管理员用户和密码,进入 Portal。程序转入 portlet view 模式的登录界面。如图 19 所示:
图 19. 登录界面
该 portlet 中用户需要输入自己的用户名和密码,本例中用户名和密码分别为 yanzhid 和 pwd,输入后点击 sign in 后进入成功页面,如图 20 所示:
图 20. 登录成功界面
如果用户未输入合法的用户名和密码,程序将跳转到登录失败页面。如图 21 所示:
图 21. 登录失败界面
通过点击 edit 按钮,potrlet 进入 edit 模式,如图 22 所示:
图 22.edit 模式
通过点击 help 按钮,potrlet 调用 help 模式,弹出 help 窗口,如图 23 所示:
图 23.help 模式
为了使用本例中的 Struts2 的校验功能,返回到登录页面,重新登录。登录时不输入任何用户名和密码,直接点击 "Sign in" 按钮,您会看到用户名和密码文本框上方出现 "Please input username!" 和 "Please input password!" 字样,则说明本例中的校验功能正确执行了。如图 24 所示:
图 24.Struts2 的校验功能
|
|
本文讨论了如何使用 Struts2 在 IBM WebSphere Portal 上来开发和部署一个 Portlet 应用,按照本文讲述的步骤操作,就可以在 WebShere Portal 上建立一个比较完整的 Portlet 应用了。
-
JSR 168: Portlet Specification
:JSR 168 Portlet 规范的描述文档
-
Struts 官方网站
http://struts.apache.org/
:
可以获得最新的 Struts 版本和文档,还可以参与邮件列表进行提问讨论。
-
developerWorks WebSphere Portal 专栏
:
学习 WebSphere Portal 的各种基础知识和应用技巧。
-
开发和部署一个作为 WebSphere Portal V5 Portlet 的 Struts 应用程序
:这篇文章描述并举例说明了如何利用 IBM Struts Portlet Framework 来开发和部署一个作为
Portlet 运行在 IBM WebSphere Portal V5 中的的应用程序。
-
集成 Hibernate,Spring,Struts Portlet 框架构建 Portlet 应用
:这篇文章介绍了流行的 Hibernate、Spring、Struts
Portlet 框架应用到 Portlet 上的时候,遇到的一些细节问题。
-
IBM WebSphere 开发者技术期刊 : 在 IBM WebSphere Portal
的呈现阶段执行 Struts 操作
:这篇文章解答了 Struts1 框架在 Portlet 动作和呈现阶段所遇到的问题以及解决方案。
- IBM Developworks Struts 专题 :了解 Struts 的比较全面的站点。
相关推荐
For portal 6.1 的示例包 博文链接:https://sivyer.iteye.com/blog/335576
websphere portal 7.0 portlet开发最新版本
NULL 博文链接:https://caerun.iteye.com/blog/458460
IBM WebSphere Portal API Portlet v6.0 help
The dictionary defines a portal as a grand or imposing door or entrance; hence, that picture on the cover. In this book, you will learn why the word portal has become a major buzzword in the world of ...
WAS高手资料-基于WAS 6.1的WebSphere Portal 6.1 Cluster配置详解
台湾友人Elvin分享的WebSphere Portal7入门教程
IBM WebSphere Portal 由用于构建和管理安全的企业对企业(B2B)、企业对客户(B2C)和企业对雇员(B2E)门户网站的中间件、应用程序(称为 portlet)和开发工具组成。WebSphere Portal 的基本产品提供个性化、web ...
IBM演示WebSpherePortal教程
WebSphere Portal Server 白皮书
websphere portal开发手册
WebspherePortal中的DB2数据库迁移Oracle
IBM WebSphere Portal 解决方案
8、WEBSPHERE PORTAL调整PORTLET之间的间隙 102 9、PORTAL6.1.0.1配置扩展属性 105 10、内容链接(同服务器或同站区) 120 11、内容链接(不同服务器或不同站区) 120 12、草稿内容阶段的判断、操作和获取(API) 121 ...
WebSphere Portal最佳实践.pdf
ibm websphere portal 学习资料让你对portal 有个入门的了解.写边有一些学习portal 的站点.
IBM WebSphere Portal 介绍,IBM门户解决方案,业务状况分析\门户解决方案
WebSphere Portal 集群详细安装文档。 数据仓库项目,做集群环境配置文档,非常详细!
详细描述IBM WebSphere Portal 6.1的集群配置,包括迁移数据库,配置LDAP安全性以及配置WebServer