日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

基于Struts2構(gòu)建 WebSphere Portal上的Portlet

系統(tǒng) 1905 0
Struts 2 是 MVC 框架發(fā)展的最新階段。Struts 2 從 WebWork 發(fā)展而來(lái),而不是由 Struts 1 演化而來(lái),因此利用 Struts 2 開(kāi)發(fā)和部署應(yīng)用程序有很多不同于 Struts 1 的地方,尤其是在開(kāi)發(fā)和部署 Porlet 方面,Struts 2 更是有著以往 Portlet 應(yīng)用程序開(kāi)發(fā)方式所無(wú)法比擬的優(yōu)勢(shì)。本文的目的就是通過(guò)在 IBM 的 WebSphere Portal Server 上開(kāi)發(fā)和部署一個(gè)基于 Struts 2 的 Porlet 應(yīng)用,向讀者介紹利用 Struts 2 進(jìn)行 Portlet 應(yīng)用開(kāi)發(fā)的優(yōu)勢(shì)和關(guān)鍵流程。
<!--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 專(zhuān)有的一種 Portlet API;第二種是符合 JSR168 標(biāo)準(zhǔn)的 Portlet API。由于 JSR168 是一個(gè)開(kāi)放的標(biāo)準(zhǔn),因此符合 JSR168 標(biāo)準(zhǔn)的 Portlet 將更易于移植。

IBM 為 IBM Portlet API 和 JSR168API 分別實(shí)現(xiàn)了基于 Struts1 的 Portlet 開(kāi)發(fā)框架,由于基于 Struts1,這兩種 Portlet 框架 API 同 Portlet API 耦合緊密,尤其需要指出的是由于無(wú)論 IBM Portlet 還是在 WebSphere Portal Server 上實(shí)現(xiàn)的 JSR168 標(biāo)準(zhǔn)的 Porlet API, 它們的接口都直接依賴(lài)于 PortletRequest/PortletResponse 對(duì)象,這就使得程序移植和單元測(cè)試等變得比較困難。此外,我們?cè)谑褂?Struts1 開(kāi)發(fā) Servlet 應(yīng)用時(shí),習(xí)慣于將數(shù)據(jù)存放在 request 作用域中,通過(guò)頁(yè)面的跳轉(zhuǎn)將數(shù)據(jù)呈現(xiàn)到 jsp 視圖頁(yè)面。但是,這種做法在 portlet 開(kāi)發(fā)中是不可行的。與 servlet 的生命周期有所不同,portlet 存在操作響應(yīng)階段和呈現(xiàn)階段。 在 portlet 操作響應(yīng)階段存放在 request 作用域的變量,在呈現(xiàn)階段就會(huì)失效。在原有 API 上解決這個(gè)問(wèn)題既費(fèi)時(shí)又不優(yōu)雅,而 Struts 2 對(duì) Portlet 的支持將能夠很好的解決這些問(wèn)題。

本文就是要通過(guò)一個(gè)簡(jiǎn)單的示例應(yīng)用程序的開(kāi)發(fā)和部署過(guò)程,來(lái)展示 Struts 2 怎樣解決舊有的 Portlet API 所無(wú)法克服的困難的。


本文的重點(diǎn)不在于開(kāi)發(fā)一個(gè) Struts2 Web 應(yīng)用程序,而在于開(kāi)發(fā)一個(gè)作為 Portlet 的 Struts2 應(yīng)用程序所需的的實(shí)現(xiàn)和配置。讀者可以了解到如何利用 Struts 2 來(lái)創(chuàng)建一個(gè) Portlet,這個(gè) Portlet 將完全獨(dú)立于其所開(kāi)發(fā)和部署的平臺(tái)。

在示例應(yīng)用程序的開(kāi)發(fā)和部署中用到了下列產(chǎn)品:

  • IBM WebSphere Portal Server 集成測(cè)試環(huán)境 5.1
  • IBM WebSphere Application Server Version 5.1
  • Struts 2 Full Distribution 2.0.11
  • IBM Rational Application developer 7(RAD7)







Porlet 示例程序設(shè)計(jì)概述

示例應(yīng)用程序是一個(gè)簡(jiǎn)單的用戶(hù)登錄程序。合法的用戶(hù)將跳轉(zhuǎn)到的登錄成功頁(yè)面,登錄失敗的用戶(hù)則跳轉(zhuǎn)到登錄失敗頁(yè)面,并被要求輸入正確的用戶(hù)名和密碼。用戶(hù) 可以自由的在 Portlet 的 View、Edit 和 Help 模式之間進(jìn)行切換。應(yīng)用程序視圖部分分為以下幾部分:

  • 登錄頁(yè)面(login.jsp)——提示用戶(hù)輸入正確的用戶(hù)名和密碼,登錄應(yīng)用程序。
  • 登錄成功頁(yè)面(success.jsp)——提示用戶(hù)登錄成功。
  • 登錄失敗頁(yè)面(fail.jsp)——提示用戶(hù)登錄失敗,提示用戶(hù)輸入正確的用戶(hù)名和密碼。
  • Edit 頁(yè)面(edit.jsp)——用戶(hù)進(jìn)入 Edit 模式后的頁(yè)面。
  • Help 頁(yè)面(help.jsp)——用戶(hù)進(jìn)入 Help 模式后的頁(yè)面。
  • 程序主類(lèi)——Login.java。

圖 1. 程序初始頁(yè)面
 程序初始頁(yè)面


下圖是本文示例的 Action 與頁(yè)面的交互圖:


圖 2. Action 與頁(yè)面的交互圖
Action 與頁(yè)面的交互圖







利用 Struts2 實(shí)現(xiàn) Portlet

在本文中,使用 Struts2 開(kāi)發(fā) Portlet 應(yīng)用需要經(jīng)歷以下步驟:

  1. 使用 RAD7 建立開(kāi)發(fā)環(huán)境
  2. 生成 web.xml 配置文件
  3. 生成 portlet.xml 配置文件
  4. 編輯 jsp 文件
  5. 應(yīng)用 Struts2
  6. 部署 Portlet 應(yīng)用程序
  7. 訪問(wèn) Portlet 應(yīng)用






使用 RAD7 建立開(kāi)發(fā)環(huán)境

在 Rational Application developer 7 中啟動(dòng)一個(gè) Portlet 項(xiàng)目,需要遵循下列步驟:

  1. 選擇新建一個(gè) Portlet 項(xiàng)目,如圖 3 所示:

    圖 3. 新建一個(gè) Portlet 項(xiàng)目
     新建一個(gè) Portlet 項(xiàng)目

  2. 輸入項(xiàng)目名 Struts2TestPortlet,目標(biāo)運(yùn)行時(shí)選擇 WebSphere Portal v5.1 或者更高版本,注意 Portlet API 選擇 JSR 168 Portlet, 注意勾掉創(chuàng)建 portlet 選項(xiàng),點(diǎn)擊完成按鈕。如圖 4 所示:

    圖 4. 設(shè)置項(xiàng)目屬性
     設(shè)置項(xiàng)目屬性

    生成 portlet 項(xiàng)目及其結(jié)構(gòu)如圖 5 所示:

    圖 5.portlet 項(xiàng)目及其結(jié)構(gòu)
    portlet 項(xiàng)目及其結(jié)構(gòu)

  3. 接下來(lái)到 Apache 官方網(wǎng)站下載 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 文件夾下拷貝過(guò)來(lái)的 JAR 包,這是因?yàn)?WebSphere Portal Sever 5.1 基于 jdk1.4,而 j4 文件夾下的內(nèi)容就是 Struts2 支持 JDK1.4 的 JAR 文件。








生成 web.xml 配置文件

雙擊 WEB-INF/web.xml,打開(kāi) web 部署描述符界面,如圖 6 所示:


圖 6.web 部署描述符界面
web 部署描述符界面


切換到過(guò)濾器選項(xiàng)卡,點(diǎn)擊添加按鈕,創(chuàng)建一個(gè)過(guò)濾器,名稱(chēng)設(shè)定為 Struts2 Filter, URL 映射為 /*, 并且使用現(xiàn)有的過(guò)濾器類(lèi) org.apache.struts2.dispatcher.FilterDispatcher,如圖 7 所示。點(diǎn)擊完成


圖 7. 創(chuàng)建一個(gè)過(guò)濾器
 創(chuàng)建一個(gè)過(guò)濾器


生成的 web.xml 描述文件內(nèi)容如下所示:


web.xml 描述文件內(nèi)容
            
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
<display-name>Struts2TestPortlet</display-name>
<filter>
<filter-name>Struts2 Filter</filter-name>
<display-name>Struts2 Filter</display-name>
<description>Struts2 Filter</description>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2 Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>








生成 portlet.xml 配置文件

雙擊 portlet.xml,打開(kāi) Portlet 部署描述符界面,切換到 portlet 選項(xiàng)卡,如圖 8 所示:


圖 8.Portlet 部署描述符界面
Portlet 部署描述符界面


點(diǎn)擊添加按鈕,添加一個(gè) portlet, 輸入 portlet 類(lèi)型 org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher,確定,如圖 9 所示:


圖 9. 添加 portlet
 添加 portlet


編輯該 portlet 的其它信息,分別設(shè)定 Portlet 名稱(chēng),顯示名稱(chēng),標(biāo)題,簡(jiǎn)短標(biāo)題,關(guān)鍵字。本示例中均輸入 Struts2 Test Portlet。如圖 10 所示:


圖 10. 編輯 portlet 信息
 編輯 portlet 信息


接下來(lái)在本頁(yè)中編輯受支持的方式 text/html, 添加 portlet 模式 view,edit, help。如圖 11 所示:


圖 11. 添加 portlet 模式
 添加 portlet 模式


Portlet 模式讓 Portlet 決定它該顯示什么內(nèi)容和執(zhí)行什么動(dòng)作。調(diào)用一個(gè) Portlet 的時(shí)候,Portlet 容器會(huì)提供一個(gè) Portlet 模式給那個(gè) Portlet。當(dāng)在處理一個(gè)請(qǐng)求動(dòng)作時(shí),Portlet 的模式是可以用程序來(lái)改變的。

JSR168 規(guī)范定義了三個(gè) Portlet 模式: 瀏覽 (View)、編輯 (Edit) 和幫助 (Help)。Struts2 支持其中的全部三個(gè)模式。同時(shí) Portal 還可以根據(jù)使用者的角色,來(lái)決定是要提供 ( 顯示 ) 哪幾個(gè) Portlet 模式給使用者操作。在我們的例子中就使用了這三個(gè)模式。

繼續(xù)在本頁(yè)中添加初始化參數(shù),首先是 Namespace 相關(guān)的參數(shù)見(jiàn)表 1:


表 1. Namespace 相關(guān)的參數(shù)
名稱(chēng) 值 viewNamespace editNamespace helpNamespace
/view
/edit
/help

考慮到在同一個(gè) Web 應(yīng)用中需要同名 Action,Struts2 以命名空間方式管理 Action。同一個(gè)命名空間里不能有同名的 Action,不同的命名空間里可以有同名的 Action。Struts2 不支持為單獨(dú)的 Action 設(shè)置命名空間,而是通過(guò)為包指定 namespace 屬性來(lái)為下面所有的 Action 指定共同的命名空間。這一點(diǎn)可以從下面的 portlet.xml 清單中看出。Struts2 對(duì) portlet 的三種模式的支持是通過(guò) namespace 體現(xiàn)的。View, Edit, Help 三種模式分別對(duì)應(yīng) ViewNamespace, editNamespace, helpNamespace。

Action 相關(guān)的參數(shù)見(jiàn)表 2:


表 2. Action 相關(guān)的參數(shù)
名稱(chēng) 值 defaultViewAction defaultEditAction defaultHelpAction
view
edit
help

這些參數(shù)指定了在 portlet 的三種模式下的默認(rèn) aciton 名稱(chēng),進(jìn)入 View、Edit、Help 模式分別首先調(diào)用名稱(chēng)為 view、edit、help 的 action。


圖 12. 編輯 portlet 初始化參數(shù)
 編輯 portlet 初始化參數(shù)


生成 portlet.xml 文件如下:


portlet.xml 描述文件內(nèi)容
            
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
id="com.ibm.faces.portlet.FacesPortlet.3ccbdcb861">
<portlet>
<portlet-name>Struts2 Test Portlet</portlet-name>
<display-name>Struts2 Test Portlet</display-name>
<portlet-class>
org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher
</portlet-class>
<init-param>
<name>viewNamespace</name>
<value>/view</value>
</init-param>
<init-param>
<name>editNamespace</name>
<value>/edit</value>
</init-param>
<init-param>
<name>helpNamespace</name>
<value>/help</value>
</init-param>
<init-param>
<name>defaultViewAction</name>
<value>view</value>
</init-param>
<init-param>
<name>defaultEditAction</name>
<value>edit</value>
</init-param>
<init-param>
<name>defaultHelpAction</name>
<value>help</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
<portlet-mode>edit</portlet-mode>
<portlet-mode>help</portlet-mode>
</supports>
<portlet-info>
<title>Struts2 Test Portlet</title>
<short-title>Struts2 Test Portlet</short-title>
<keywords>Struts2 Test Portlet</keywords>
</portlet-info>
</portlet>
</portlet-app>

在本清單中 Portlet 類(lèi)“org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher”在將 Struts2 集成到 Portlet 中起到了關(guān)鍵作用,該類(lèi)將 Portlet 操作分發(fā)給 Struts2。








編輯 jsp 文件

在 WEB-INF 下新建 jsp 文件夾,并生成幾個(gè) jsp 文件及內(nèi)容如下 :


input.jsp
            
<%@ taglib prefix="s" uri="/struts-tags"%>

<H2>Please sign in</H2>
<s:form action="login" method="POST">
<s:textfield label="User Name" name="username" value="%{username}" />
<s:password label="Password" name="password" value="%{password}" />
<s:submit value="Sign in" />
</s:form>


success.jsp
            
<%@ taglib prefix="s" uri="/struts-tags"%>

<H2>Welcome <s:property value="username" /></H2>
<p /><a href="<s:url action="view"/>">Back to sign in page</a>


fail.jsp
            
<%@ taglib prefix="s" uri="/struts-tags"%>

<H2>Invalid username or password!</H2>
<p /><a href="<s:url action="view"/>">Back to sign in page</a>


edit.jsp
            
<%@ taglib prefix="s" uri="/struts-tags"%>

<H2>This is edit page!</H2>


help.jsp
            
<%@ taglib prefix="s" uri="/struts-tags"%>

<H2>This is help page!</H2>







應(yīng)用 Struts2

建立 Struts2 配置文件 struts.xml

在 src 目錄下建立 struts.xml,工程構(gòu)建之后 struts.xml 會(huì)被置于 WEB-INF/classes 下,這也是 Struts2 默認(rèn)的配置文件路徑。

struts.xml 文件是基于 Struts2 的項(xiàng)目的核心配置文件。在 portlet 開(kāi)發(fā)過(guò)程最重要的內(nèi)容就是要將 "struts-portlet-default.xml" 包含進(jìn)來(lái),這個(gè) xml 文件存在于前面步驟中我們拷貝過(guò)來(lái)的 struts2-core-j4-2.0.11.jar 中,只有把它包含進(jìn)來(lái)我們才能使 Struts2 支持 portlet。接下來(lái)描述的內(nèi)容就是將前面定義的 action 和頁(yè)面關(guān)聯(lián)起來(lái)。從中可以看出我們定義的 login 這個(gè) actoin 的輸入界面是 input.jsp,如果成功則會(huì)被轉(zhuǎn)向 success.jsp,失敗則會(huì)被轉(zhuǎn)向 fail.jsp。


struts.xml
            
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-portlet-default.xml" />
<package name="view" extends="struts-portlet-default"
namespace="/view">
<action name="view">
<result>/WEB-INF/jsp/input.jsp</result>
</action>
<action name="login" class="struts2TestPortlet.action.Login">
<result name="input">/WEB-INF/jsp/input.jsp</result>
<result name="success">/WEB-INF/jsp/success.jsp</result>
<result name="fail">/WEB-INF/jsp/fail.jsp</result>
</action>
</package>
<package name="edit" extends="struts-portlet-default"
namespace="/edit">
<action name="edit">
<result>/WEB-INF/jsp/edit.jsp</result>
</action>
</package>
<package name="help" extends="struts-portlet-default"
namespace="/help">
<action name="help">
<result>/WEB-INF/jsp/help.jsp</result>
</action>
</package>
</struts>

新建 java 類(lèi) Login.java


Login.java
            
package struts2TestPortlet.action;

public class Login extends ActionSupport {
String username;

String password;

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String execute() throws Exception {
if (username.equals("yanzhid") && password.equals("pwd")) {
return "success";
} else {
return "fail";
}
}
}

同 Struts1 的比較

在實(shí)現(xiàn)相同功能的前提下,我們不妨看一下 Struts 1 的相關(guān)實(shí)現(xiàn),示例中采用的是 IBM 的 Struts for JSR168 Portlet 實(shí)現(xiàn)。

首先,我們必須針對(duì)用戶(hù)輸入的表單數(shù)據(jù)創(chuàng)建一個(gè) ActionForm,當(dāng)然,您也可以通過(guò) xml 文件配置的方式創(chuàng)建一個(gè) DynamicForm。


java 類(lèi) LoginActionForm.java
            
public class LoginActionForm extends ActionForm {
String username;

String password;

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getUsername() {
return username;

}

public void setUsername(String username) {
this.username = username;
}

public void reset(ActionMapping mapping, HttpServletRequest request) {

username = null;
password = null;

}

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {

ActionErrors errors = new ActionErrors();
return errors;
}
}

接下來(lái),我們需要實(shí)現(xiàn)一個(gè) Action 類(lèi)。


java 類(lèi) LoginAction.java
            
public class LoginAction extends com.ibm.portal.struts.action.StrutsAction {
public ActionForward execute(ActionMapping mapping, ActionForm form,
PortletRequest request, PortletResponse response) throws Exception {
<!-- code sample is too wide --> LoginActionForm loginActionForm = (LoginActionForm) form;
String username = loginActionForm.getUsername();
String password = loginActionForm.getPassword();
if (username.equals("yanzhid") && password.equals("pwd")) {
StrutsViewCommand.addAttributeNameToSave("username");
request.setAttribute("username", username);
return mapping.findForward("success");
} else {
return mapping.findForward("fail");
}
}
}

在 Struts1 中,我們習(xí)慣使用 JSTL 從 request 作用域中取得數(shù)據(jù),呈現(xiàn)到 JSP 頁(yè)面上,success.jsp 頁(yè)面被改動(dòng)如下:


success.jsp
            
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<portlet:defineObjects />
<H2>Welcome <c:out value="${username}"/></H2>

由于精通 Struts1 的讀者很多,其余相關(guān)改動(dòng)和 struts1 的配置我們不再拗述,請(qǐng)讀者查閱相關(guān)文獻(xiàn)。

從中我們可以看出 struts2 和 struts1 的區(qū)別,并從中體會(huì)到 Struts2 的優(yōu)勢(shì):

  1. 捕獲輸入:
    Struts1 使用 ActionForm 對(duì)象捕獲輸入。所有的 ActionForm 必須繼承一個(gè)基類(lèi)。因?yàn)槠渌?JavaBean 不能用作 ActionForm,開(kāi)發(fā)者經(jīng)常創(chuàng)建多余的類(lèi)捕獲輸入。當(dāng)然您也可以使用 xml 文件描述一個(gè) DynamicForm,但工作量并未顯著減少。
    Struts 2 可以直接使用 Action 屬性作為輸入屬性,消除了對(duì)第二個(gè)輸入對(duì)象的需求。當(dāng)然,Struts2 也支持 ActionForm 模式,用作輸入 / 輸出對(duì)象。
  2. Action 類(lèi) :
    Struts1 要求 Action 類(lèi)繼承一個(gè)抽象基類(lèi)。Struts1 的一個(gè)普遍問(wèn)題是使用抽象類(lèi)編程而不是接口。
    Struts2 Action 類(lèi)可以實(shí)現(xiàn)一個(gè) Action 接口,也可實(shí)現(xiàn)其他接口。Struts2 提供一個(gè) ActionSupport 基類(lèi)去實(shí)現(xiàn)常用的接口,但 Action 接口不是必須的,任何有 execute 標(biāo)識(shí)的 POJO 對(duì)象都可以用作 Struts2 的 Action 對(duì)象。
  3. Portlet 依賴(lài) :
    Struts1 Action 依賴(lài)于 Portlet API , 當(dāng)一個(gè) Action 被調(diào)用時(shí),PorletRequest 和 PortletResponse 被傳遞給 execute 方法。
    Struts2 Action 不依賴(lài)于容器,允許 Action 脫離容器單獨(dú)被測(cè)試。如果需要,Struts2 Action 仍然可以訪問(wèn)初始的 request 和 response。但是,其他的元素減少或者消除了直接訪問(wèn) PorletRequest 和 PortletResponse 的必要性。
  4. 可測(cè)性 :
    測(cè)試 Struts1 Action 的一個(gè)主要問(wèn)題是 execute 方法暴露了 Portlet API,這使得測(cè)試要依賴(lài)于容器。
    Struts2 Action 可以通過(guò)初始化、設(shè)置屬性、調(diào)用方法來(lái)測(cè)試,使測(cè)試更容易。
  5. 對(duì) Portlet 的支持程度:
    Struts1 框架天生并不支持 Portlet, 為了將大批 Struts 程序員吸引到 WebSphere Portal 開(kāi)發(fā)上來(lái),IBM 公司針對(duì)自己的兩種 Portlet 實(shí)現(xiàn)(IBM Portlet 和 JSR168 Portlet), 分別對(duì) Struts 框架進(jìn)行了擴(kuò)展,以適應(yīng) Portlet 開(kāi)發(fā)。細(xì)心的讀者一定已經(jīng)發(fā)現(xiàn)了,我們的 LoginAction 類(lèi)繼承的是 com.ibm.portal.struts.action.StrutsAction 這個(gè)基類(lèi),而不是 Struts1 官方框架中的 Action 類(lèi)。
    Struts1 程序員剛剛進(jìn)行 Portlet 開(kāi)發(fā)的時(shí)候,一般會(huì)忽略一個(gè)重要的問(wèn)題。與 servlet 的生命周期有所不同,portlet 存在操作響應(yīng) (Action) 階段和呈現(xiàn)(Render)階段。 在 portlet 操作響應(yīng)階段存放在 request 作用域的數(shù)據(jù),在呈現(xiàn)階段就會(huì)失效。為了解決這個(gè)問(wèn)題,一個(gè)方案就是把數(shù)據(jù)放在 session 作用域中,考慮到服務(wù)器性能的原因,這個(gè)方案顯然不被推薦。另一個(gè)方案就是使用 IBM 提供的一些特殊的 API, 按照 LoginAction 那樣,在將數(shù)據(jù)放在 request 作用域之前,將數(shù)據(jù)變量名作為參數(shù)傳給 StrutsViewCommand 的 addAttributeNameToSave 方法。為了說(shuō)明這個(gè)問(wèn)題,我們可以將 StrutsViewCommand.addAttributeNameToSave("username") 這行代碼刪掉,程序運(yùn)行候就可以發(fā)現(xiàn),success.jsp 將不會(huì)呈現(xiàn) username 變量中保存的數(shù)據(jù)。
    Struts2 的官方框架支持 JSR168 Portlet, 除了前期需要對(duì) web.xml、portlet.xml 和 struts.xml 文件進(jìn)行少許特殊配置外,程序員不需要考慮 Portlet 和 Servlet 之間的不同,無(wú)論是 Action 類(lèi)的開(kāi)發(fā)還是 JSP 頁(yè)面中 Struts2 標(biāo)簽的應(yīng)用,同在 Servlet 容器中用法是完全一樣的。

Struts2 的驗(yàn)證功能

采用 Struts2 的校驗(yàn)框架時(shí),只需為該 Action 指定一個(gè)校驗(yàn)文件即可。該文件指定了 Action 的屬性必須滿足怎樣的規(guī)則,下面清單即本應(yīng)用中 Action 的校驗(yàn)文件的代碼。Struts2 的校驗(yàn)文件規(guī)則與 Struts1 的校驗(yàn)文件設(shè)計(jì)方式不同,Struts2 中每個(gè) Action 都可以有一個(gè)校驗(yàn)文件,該文件的文件名遵守如下規(guī)則:

<Action 名字 >-validation.xml

前面的 Action 名是可以改變的,后面的 -validation.xml 部分是固定不變的,且該文件應(yīng)該被保存于 Action class 文件相同的路徑下。如在本例中此校驗(yàn)文件在項(xiàng)目構(gòu)建后保存在 WEB-INF/classes/Struts2TestPortlet/action/ 下,與 login.class 在同一目錄中。


Login-validation.xml
            
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>Please input username!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>Please input password!</message>
</field-validator>
</field>
</validators>








部署 Portlet 應(yīng)用程序

首先在 RAD7 控制臺(tái)的服務(wù)器視圖中添加一個(gè)可以運(yùn)行 Portlet 的服務(wù)器。該視圖中單擊鼠標(biāo)右鍵,選擇新建—> 服務(wù)器。如圖 13 所示 :


圖 13. 新建服務(wù)器
 新建服務(wù)器


在彈出的新建服務(wù)器窗口中選擇目標(biāo)運(yùn)行服務(wù)器,在本例中我們選擇 WebSphere Portal V5.1 測(cè)試環(huán)境 , 對(duì)話框底部的服務(wù)器運(yùn)行時(shí)呈現(xiàn)為 WebSphere Portal V5.1。在服務(wù)器主機(jī)名中輸入 localhost,如圖 14 所示。點(diǎn)擊下一步,默認(rèn)端口號(hào)為 9081。


圖 14. 選擇目標(biāo)運(yùn)行服務(wù)器
 選擇目標(biāo)運(yùn)行服務(wù)器


繼續(xù)點(diǎn)擊下一步,出現(xiàn)門(mén)戶(hù)網(wǎng)站服務(wù)器設(shè)置對(duì)話框,在這里需要將默認(rèn)的管理員用戶(hù)及密碼設(shè)置成您在安裝相應(yīng) Portal server 時(shí)設(shè)置的管理員用戶(hù)及密碼。如圖 15 所示:


圖 15. 門(mén)戶(hù)網(wǎng)站服務(wù)器設(shè)置
 門(mén)戶(hù)網(wǎng)站服務(wù)器設(shè)置


點(diǎn)擊下一步,進(jìn)入添加項(xiàng)目界面,將 " 可用的項(xiàng)目 " 一欄中的 Portlet 項(xiàng)目添加到右側(cè) " 已配置項(xiàng)目 " 欄中。點(diǎn)擊完成,于是我們就完成了這個(gè) Portlet 項(xiàng)目在 RAD7 中的配置和部署。如圖 16 所示:


圖 16. 添加 portlet 項(xiàng)目
 添加 portlet 項(xiàng)目


在啟動(dòng)服務(wù)器之前,需要右鍵點(diǎn)擊服務(wù)器標(biāo)簽頁(yè)中的已添加的服務(wù)器,選擇 " 打開(kāi) ",然后進(jìn)入 " 門(mén)戶(hù)網(wǎng)站 " 標(biāo)簽頁(yè),檢查確認(rèn)管理員用戶(hù)和密碼已經(jīng)被設(shè)置成安裝 Portal server 時(shí)設(shè)置的管理員用戶(hù),如圖 17 所示。以確保 Portal server 啟動(dòng)成功。


圖 17. 檢查確認(rèn)管理員用戶(hù)和密碼設(shè)置
 檢查確認(rèn)管理員用戶(hù)和密碼設(shè)置


接下來(lái),右鍵點(diǎn)擊服務(wù)器標(biāo)簽頁(yè)中已添加的服務(wù)器,選擇 " 啟動(dòng) ",服務(wù)器被啟動(dòng)。您可以從控制臺(tái)中觀察啟動(dòng)過(guò)程輸出的日志。


圖 18. 啟動(dòng)服務(wù)器
 啟動(dòng)服務(wù)器







訪問(wèn) Portlet 應(yīng)用

打開(kāi)瀏覽器網(wǎng)頁(yè)輸入:http://localhost:9081/wps/myportal, 輸入管理員用戶(hù)和密碼,進(jìn)入 Portal。程序轉(zhuǎn)入 portlet view 模式的登錄界面。如圖 19 所示:


圖 19. 登錄界面
 登錄界面


該 portlet 中用戶(hù)需要輸入自己的用戶(hù)名和密碼,本例中用戶(hù)名和密碼分別為 yanzhid 和 pwd,輸入后點(diǎn)擊 sign in 后進(jìn)入成功頁(yè)面,如圖 20 所示:


圖 20. 登錄成功界面
 登錄成功界面


如果用戶(hù)未輸入合法的用戶(hù)名和密碼,程序?qū)⑻D(zhuǎn)到登錄失敗頁(yè)面。如圖 21 所示:


圖 21. 登錄失敗界面
 登錄失敗界面


通過(guò)點(diǎn)擊 edit 按鈕,potrlet 進(jìn)入 edit 模式,如圖 22 所示:


圖 22.edit 模式
edit 模式


通過(guò)點(diǎn)擊 help 按鈕,potrlet 調(diào)用 help 模式,彈出 help 窗口,如圖 23 所示:


圖 23.help 模式
help 模式


為了使用本例中的 Struts2 的校驗(yàn)功能,返回到登錄頁(yè)面,重新登錄。登錄時(shí)不輸入任何用戶(hù)名和密碼,直接點(diǎn)擊 "Sign in" 按鈕,您會(huì)看到用戶(hù)名和密碼文本框上方出現(xiàn) "Please input username!" 和 "Please input password!" 字樣,則說(shuō)明本例中的校驗(yàn)功能正確執(zhí)行了。如圖 24 所示:


圖 24.Struts2 的校驗(yàn)功能
Struts2 的校驗(yàn)功能








結(jié)束語(yǔ)

本文討論了如何使用 Struts2 在 IBM WebSphere Portal 上來(lái)開(kāi)發(fā)和部署一個(gè) Portlet 應(yīng)用,按照本文講述的步驟操作,就可以在 WebShere Portal 上建立一個(gè)比較完整的 Portlet 應(yīng)用了。



參考資料


基于Struts2構(gòu)建 WebSphere Portal上的Portlet應(yīng)用


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 化德县| 陇川县| 靖安县| 龙胜| 阳信县| 大余县| 宁陵县| 峨眉山市| 永新县| 大宁县| 墨竹工卡县| 迭部县| 新沂市| 讷河市| 全南县| 刚察县| 金沙县| 松原市| 社会| 柞水县| 桐城市| 紫阳县| 沛县| 和林格尔县| 巴中市| 西安市| 当雄县| 新绛县| 方正县| 泉州市| 都昌县| 临澧县| 永州市| 绵阳市| 天峨县| 台前县| 扎兰屯市| 锦州市| 都匀市| 青田县| 普兰店市|