本文主要介紹在 IBM 產品平台上開發基於 Struts 2 的 Web 應用。Struts 2 與傳統的 Struts 1 已經有了本質區別,例如在 Struts 2 中不再需要 ActionForm,任何 Java Bean 都可以用來捕獲 form 表單輸入參數等。本文將首先介紹如何利用 Rational Software Architect 7(RSA 7)以及 WebSphere Application Server 6.1(WAS 6.1)搭建 Struts 2 開發環境,然後通過一個實例介紹如何開發 Struts 2 應用。
引言
作為 Java Web 應用的典型框架,Struts 一直受到 Java 開發者的青睞,Struts 2 作為 Struts 發展的又一個里程碑,以 WebWork 為基礎,提供了更易於使用,功能更強的 MVC 框架。同時它可以幫助開發人員更快速、高效、方便地實現一個 Java Web 應用系統。
對於開發人員來講,不同的項目可能需要不同的開發和運行 Struts 2 的平台,Struts 2 需要以下環境:Servlet API 2.4, JSP API 2.0, Java 5。IBM WebSphere Application Server 6.1(以下簡稱 WAS 6.1) 符合 Sturts 2 對運行環境的所有要求。另外,IBM Rational Software Architect 7(以下簡稱 RSA)提供了設計、開發各種應用的工具,其中包括創建和開發 Web 應用。二者的組合將是開發 Struts 2 的理想平台。
基於 RSA 及 WAS 搭建 Struts 2 開發平台
首先我們使用 RSA 創建一個動態 Web 項目,我們假設 RSA 中已經創建了一個 WAS 6.1 的伺服器:
在創建該項目的過程中,需要注意正確設置“目標運行時伺服器”以及“動態 Web 模塊 版本“, 如下圖:
其他按默認配置,點擊”完成”。創建完項目后,項目的基本包結構會自動生成,為了使該 Web 項目使用 Struts 2 框架,我們需要做一下配置:
配置 Struts 2 類庫
本示例使用 Struts 2.1.6 版本 , 所使用的類庫可以從 http://apache.etoak.com/struts/library/struts-2.1.6-lib.zip下載,如下圖,拷貝相應 jar 包到 Sample/WebContent/WEB-INF/lib 下。注意,本示例只拷貝了一些基本 jar 包,對於需要使用到 Struts 2 複雜功能的應用,需要另外拷貝相應 jar 包。
配置 web.xml
為了讓所有 web 請求通過 struts 2 框架處理,我們需要在 web.xml 中設置相應的 filter 以及 filter mapping, 對於 struts 2.1.6, 應設置成如下圖高亮部分:
對於 Struts 2 早期版本(2.1.3 之前),一般設置 filter 為 FilterDispatcher,具體如下:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Stuts 2 的 taglib 已經自動包含在 struts-core.jar, 伺服器會自動找到相應 taglib,所以 web.xml 中不再需要設置 taglib。
配置 Web 容器
當在 WAS 6.1 上運行 struts 2 應用程序時,需要另外設置 web 容器的一個定製屬性:
com.ibm.ws.webcontainer.invokefilterscompatibility=true, 否則,所有 Struts 2 Action 不起作用。該設置可以在 WAS 控制台上設置如下:
以上步驟完成了開發 struts 2 應用的準備工作,下面我們開發一個示例。
示例開發
該示例包括兩個頁面,第一個是管理員瀏覽所有系統用戶(userList.jsp),第二個是管理員創建一個新用戶(user.jsp)。圖 6 和圖 7 分別是兩個示例的應用截圖。
點擊“提交”,如果通過校驗,則返回到第一個頁面,如果校驗失敗,仍回到當前頁面,並提示錯誤信息。
下面我們開發該應用的各個組件:
創建 Action
創建基類
通過基類實現 SessionAware, ServletRequestAware, ServletResponseAware 介面,可以使用 IOC 方式初始化 session, request 和 response。這種實現可以方便所有子類訪問 session, request 和 response。
import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; public class BaseAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware{ private Map sessionMap; private HttpServletRequest request; private HttpServletResponse response; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public void setSession(Map map){ this.sessionMap=map; } public HttpServletRequest getHttpServletRequest(){ return request; } public HttpServletResponse getHttpServletResponse(){ return response; } public Map getSession(){ return sessionMap; } } |
創建 , 配置 Action
在該示例中,所有 form 表單提交使用一個 Action 類,該類的不同方法將作為不同表單提交的 Action。在該示例中,execute(), createOrEditUser(), submitUser(), deleteUser() 對應於不同表單對應的 action。
在 Struts 2 應用中,action 的配置文件應該位於類根路徑下,一個 Struts 2 應用中可以存在多個 action 配置文件,但這些文件需要在 struts.xml 中引用,本例所有 action 在 struts-user.xml 中定義,struts.xml 引用 struts-user.xml。
在 struts-user.xml 中可以看到不同的類方法被配置成不同的 Action, 如果沒有指定方法,那麼 struts 2 框架會默認調用 execute(), 例如:”showUserList”
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="user" extends="struts-default" namespace="/admin"> …………… <!-- user list --> <action name="showUserList" class="sample.action.UserAction"> <result>/WEB-INF/page/userList.jsp</result> </action> <!-- add user --> <action name="createOrEditUser" class="sample.action.UserAction" method="createOrEditUser"> <result>/WEB-INF/page/user.jsp</result> </action> <action name="submitUser" class="sample.action.UserAction" method="submitUser"> <result name="input">/WEB-INF/page/user.jsp</result> <result name="userList" type="chain">showUserList</result> </action> …………… </package> </struts> |
在 Struts 2 中,如果一個 Action 需要調用另一個 Action, 可以設置 result 的 type 為 chain, 如前面代碼片段中的 <result name="userList"type="chain">showUserList</result>
開發頁面
在開發 Struts 2 應用時,不可避免會使用大量的 Struts 2 標籤,默認 Struts 2 解釋這些標籤生成 HTML 代碼時會加上一些額外的代碼,例如可能把 <tr><td> 自動加上,如果我們選擇自己靈活控制代碼格式,可以參考本示例在 struts.properties 里設置 struts.ui.theme=simple, struts.properties 同樣位於類根路徑下:
[火星人 ] 基於 Struts 2 開發 Web 應用已經有764次圍觀