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)
![]() ![]() |
![]()
|
示例應(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è)面

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

![]() ![]() |
![]()
|
利用 Struts2 實(shí)現(xiàn) Portlet
在本文中,使用 Struts2 開(kāi)發(fā) Portlet 應(yīng)用需要經(jīng)歷以下步驟:
- 使用 RAD7 建立開(kāi)發(fā)環(huán)境
- 生成 web.xml 配置文件
- 生成 portlet.xml 配置文件
- 編輯 jsp 文件
- 應(yīng)用 Struts2
- 部署 Portlet 應(yīng)用程序
- 訪問(wèn) Portlet 應(yīng)用
![]() ![]() |
![]() |
在 Rational Application developer 7 中啟動(dòng)一個(gè) Portlet 項(xiàng)目,需要遵循下列步驟:
-
選擇新建一個(gè) Portlet 項(xiàng)目,如圖 3 所示:
圖 3. 新建一個(gè) Portlet 項(xiàng)目
-
輸入項(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)目屬性
生成 portlet 項(xiàng)目及其結(jié)構(gòu)如圖 5 所示:
圖 5.portlet 項(xiàng)目及其結(jié)構(gòu)
-
接下來(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-INF/web.xml,打開(kāi) web 部署描述符界面,如圖 6 所示:
圖 6.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ò)濾器

生成的 web.xml 描述文件內(nèi)容如下所示:
web.xml 描述文件內(nèi)容
|
![]() ![]() |
![]()
|
雙擊 portlet.xml,打開(kāi) Portlet 部署描述符界面,切換到 portlet 選項(xiàng)卡,如圖 8 所示:
圖 8.Portlet 部署描述符界面

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

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

接下來(lái)在本頁(yè)中編輯受支持的方式 text/html, 添加 portlet 模式 view,edit, help。如圖 11 所示:
圖 11. 添加 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.xml 文件如下:
portlet.xml 描述文件內(nèi)容
|
在本清單中 Portlet 類(lèi)“org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher”在將 Struts2 集成到 Portlet 中起到了關(guān)鍵作用,該類(lèi)將 Portlet 操作分發(fā)給 Struts2。
![]() ![]() |
![]()
|
在 WEB-INF 下新建 jsp 文件夾,并生成幾個(gè) jsp 文件及內(nèi)容如下 :
input.jsp
|
success.jsp
|
fail.jsp
|
edit.jsp
|
help.jsp
|
![]() ![]() |
![]()
|
在 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
|
Login.java
|
在實(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
|
接下來(lái),我們需要實(shí)現(xiàn)一個(gè) Action 類(lèi)。
java 類(lèi) LoginAction.java
|
在 Struts1 中,我們習(xí)慣使用 JSTL 從 request 作用域中取得數(shù)據(jù),呈現(xiàn)到 JSP 頁(yè)面上,success.jsp 頁(yè)面被改動(dòng)如下:
success.jsp
|
由于精通 Struts1 的讀者很多,其余相關(guān)改動(dòng)和 struts1 的配置我們不再拗述,請(qǐng)讀者查閱相關(guān)文獻(xiàn)。
從中我們可以看出 struts2 和 struts1 的區(qū)別,并從中體會(huì)到 Struts2 的優(yōu)勢(shì):
-
捕獲輸入:
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ì)象。 -
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ì)象。 -
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 的必要性。 -
可測(cè)性 :
測(cè)試 Struts1 Action 的一個(gè)主要問(wèn)題是 execute 方法暴露了 Portlet API,這使得測(cè)試要依賴(lài)于容器。
Struts2 Action 可以通過(guò)初始化、設(shè)置屬性、調(diào)用方法來(lái)測(cè)試,使測(cè)試更容易。 -
對(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)框架時(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
|
![]() ![]() |
![]()
|
首先在 RAD7 控制臺(tái)的服務(wù)器視圖中添加一個(gè)可以運(yùn)行 Portlet 的服務(wù)器。該視圖中單擊鼠標(biāo)右鍵,選擇新建—> 服務(wù)器。如圖 13 所示 :
圖 13. 新建服務(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ù)器

繼續(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è)置

點(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)目

在啟動(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è)置

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

![]() ![]() |
![]()
|
打開(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 模式

通過(guò)點(diǎn)擊 help 按鈕,potrlet 調(diào)用 help 模式,彈出 help 窗口,如圖 23 所示:
圖 23.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 在 IBM WebSphere Portal 上來(lái)開(kāi)發(fā)和部署一個(gè) Portlet 應(yīng)用,按照本文講述的步驟操作,就可以在 WebShere Portal 上建立一個(gè)比較完整的 Portlet 應(yīng)用了。
-
JSR 168: Portlet Specification
:JSR 168 Portlet 規(guī)范的描述文檔
-
Struts 官方網(wǎng)站
http://struts.apache.org/
: 可以獲得最新的 Struts 版本和文檔,還可以參與郵件列表進(jìn)行提問(wèn)討論。
-
developerWorks WebSphere Portal 專(zhuān)欄
: 學(xué)習(xí) WebSphere Portal 的各種基礎(chǔ)知識(shí)和應(yīng)用技巧。
-
開(kāi)發(fā)和部署一個(gè)作為 WebSphere Portal V5 Portlet 的 Struts 應(yīng)用程序
:這篇文章描述并舉例說(shuō)明了如何利用 IBM Struts Portlet Framework 來(lái)開(kāi)發(fā)和部署一個(gè)作為 Portlet 運(yùn)行在 IBM WebSphere Portal V5 中的的應(yīng)用程序。
-
集成 Hibernate,Spring,Struts Portlet 框架構(gòu)建 Portlet 應(yīng)用
:這篇文章介紹了流行的 Hibernate、Spring、Struts Portlet 框架應(yīng)用到 Portlet 上的時(shí)候,遇到的一些細(xì)節(jié)問(wèn)題。
-
IBM WebSphere 開(kāi)發(fā)者技術(shù)期刊 : 在 IBM WebSphere Portal 的呈現(xiàn)階段執(zhí)行 Struts 操作
:這篇文章解答了 Struts1 框架在 Portlet 動(dòng)作和呈現(xiàn)階段所遇到的問(wèn)題以及解決方案。
- IBM Developworks Struts 專(zhuān)題 :了解 Struts 的比較全面的站點(diǎn)。
更多文章、技術(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ì)您有幫助就好】元
