Webwork 學習之路【08】結合實戰簡析Controller 配置

来源:http://www.cnblogs.com/java-class/archive/2016/11/11/6051810.html
-Advertisement-
Play Games

雖然現在 MVC 框架層出不窮,但做為 Struts 前身的 webwork。 其經典程度不亞於貝利之於足球,雙 11 之於淘寶特賣。 本篇將結合 webwork controller 配置文件 xwork.xml 的配置項淺析。 來一起看看當年叱吒風雨的 mvc 框架是怎樣滿足變更的業務需求。 1 ...


   雖然現在 MVC 框架層出不窮,但做為 Struts 前身的 webwork。

   其經典程度不亞於貝利之於足球,雙 11 之於淘寶特賣。

   本篇將結合 webwork controller 配置文件 xwork.xml 的配置項淺析。

   來一起看看當年叱吒風雨的 mvc 框架是怎樣滿足變更的業務需求。

1. xwork.xml 主文件

   xwork.xml 是 WebWork 自身的配置文件,實際開發中它是配置文件的主幹骨架。

   xwork 定義了一個 default 包,通過 include 包含 xwork 子文件。如下所示:

<!DOCTYPE xwork
PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
   <include file="webwork-default.xml"/>
   <include file="common.xml"/>
   <include file="user.xml"/>
</xwork>

2. xwork.xml 子文件

   xwork 子文件一方面有效地對大型程式進行分解,符合程式開發的模塊化切分。

   另一方面幫助我們遍歷整個程式,有助於日後的運維。

   由於 webwork 開發過程中 xwork.xml 的結構定義是一致的,保證了較低的學習成本。

<!DOCTYPE xwork
        PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
    <package name="user" extends="webwork-default" systemId="1001" caption="用戶管理">
        <default-interceptor-ref name="defaultStack" />
        
        <action name="dirUser" class="com.rambo.app.base.user.action.DirUser" caption="查詢用戶" event-type="5">
            <result name="success" type="dispatcher">
                <param name="location">/user/diruser.jsp</param>
            </result>
            <result name="error" type="redirect">
                <param name="location">doError.action</param>
            </result>
        </action>
        
        <action name="addUser" class="com.rambo.app.base.user.action.AddUser" caption="添加用戶" event-type="3">
            <result name="success" type="dispatcher">
                <param name="location">/result.jsp</param>
            </result>
            <result name="error" type="dispatcher">
                <param name="location">/result.jsp</param>
            </result>
            <interceptor-ref name="modelDrivenStack" />
        </action>
    </package>
</xwork>

2.1 package

   包: package,包的名稱可以理解為模塊的名稱(各子文件包名稱不能重覆)。所有的 action 定義在包的下一層。

   命名空間:namespace,如:namespace="/user",描述子模塊 jsp 文件的所在路徑,同時明確了請求訪問時的 url 網址:/user/*.action。

   命名空間為空則請求訪問時的 url 網址:/*.action。

   命名空間的好處:

   1) 體現模塊化

   2) 命名空間為空,則訪問請求的 url 網址均為/*.action,容易衝突

2.2 action

   action name:對應請求的名稱,如 dirUser,url:/user/dirUser.action

   action class:com.rambo.app.base.user.action.DirUser 後臺接收請求對應的 java 處理類

   action.result.location:diruser.jsp 對處理結果進行展示,文件所在目錄位置為 /user/diruser.jsp

2.3 result

   ServletDispatcher 是 WebWork 框架機制的核心。它和 Action 在 MVC 模式中,扮演著控制器的角色,MVC 模式通過控制器實現了模型和視圖的分離。

   Xwork 文件中的 Result 是 Action 執行完返回的一個字元串常量,它表示Action 執行完成的狀態,比如:執行成功、執行失敗等。

   WebWork 的 Action 提供了預設的幾種(包括:success、error、login、none、input 等)另外 Result 完全可以自己定義,只要是一個字元串常量就可以了。

   Result 標簽定義中 name 為返回的字元串常量值,如:name="success"表示

   Action 執行成功,返回結果就將根據此標簽的具體配置進行視圖輸出。

   type 對應 Result Type 類,它在 Action 執行完成並返回 Result 之後,決定採用哪一種視圖技術,將執行結果展現給用戶,主要包括:

type 參數 描述
dispatcher

location(必須)
parse

調度到 jsp 頁面展現,其中 Action 請求對應 java 處理程式中的
的數據可以被頁面直接使用

redirect location(必須)
parse

將響應重定向到瀏覽器指定的位置,它將會導致 Action 執行完成
的數據丟失或不再可用。將響應定向到參數 location 指定的、新的 url 中

chain

actionName(必須)
namespace

Action Chaining:一種特殊的視圖結果,將 Action 執行完之後鏈接到另一個
Action 中繼續執行。新的 Action 使用上一個 Action 的上下文(ActionContext)

1. type = dispatcher
<result name="success" type="dispatcher">
    <param name="location">userinfo.jsp</param>
</result>

簡寫:<result name="success" type="dispatcher">userinfo.jsp</result>
 
2.  type = redirect
<result name="error" type="redirect">
    <param name="location">../userinfo.jsp</param>
</result>

簡寫:<result name="error" type="redirect">../userinfo.jsp</result>

3. type = chain
<result name="success" type="chain">
   <param name="actionName">rambo</param>
</result>

Action:
<action name="rambo" class="myPackage.barAction">
   ...
</action>

2.4 interceptor

  WebWork 截獲 Action 請求,在 Action 執行之前或之後調用攔截器方法。這樣,可以用插拔的方式將功能註入 Action 中。

  實際開發中最常用攔截器主要封裝了對錶單參數提交時的處理,如對象化等,包括如下三類:

1) 預設攔截器 <interceptor-ref name="defaultStack"/>

2) 支持模型驅動攔截器 <interceptor-ref name="modelStack"/>

3) 支持文件上傳攔截器 <interceptor-ref name="uploadStack"/>

2.4.1 defaultStack 預設攔截器

  預設的表單處理攔截器。Xwork.xml 定義的 Action 只要繼承 ActionSupport類,通過預設攔截器就可以自動將 jsp 表單數據轉換為 java 文件定義的相應變數。

  註意:jsp 文件表單 input 中的 name 名要與 java 文件中的變數名相對應。

  如下麵示例中的 sysId 和 gUser 對象。

  前端:

<form name="form1" id="form1" action="login.action" method="post">
    <input type="hidden" name="sysId" id="sysId"/><br/>
    用戶名:<input name="gUser.email" id="gUser.email"/><br/>
    密碼:<input name="gUser.password" id="gUser.password" type="password"/><br/>
    <input name="login" type="submit" value="登錄"/></p>
</form>

  Xwork.xml:

       <action name="login" class="com.rambo.app.user.login.LoginAction">
            <result name="success" type="redirect">
                <param name="location">user/dirUser.action</param>
            </result>
            <result name="error" type="redirect">
                <param name="location">doError.action</param>
            </result>
            <interceptor-ref name="defaultStack"/>
        </action>

   Java 端:

public class LoginAction extends ActionSupport{
    private Integer sysId;
    public GUser gUser = new GUser();
    public LoginAction() {
    }
    public String execute() {

        //業務處理......
        return Action.SUCCESS;
    }

      //getter/setter......
}

2.4.2 modelStack 模型驅動攔截器

   Xwork.xml 定義的 Action 在繼承 ActionSupport 類的同時需要實現 ModelDriven(模型驅動)介面中的 Object getModel()方法,通過這個方法返回的就是要接收的模型對象。

   就可以直接將 jsp 表單數據轉換為 java 文件定義的相應對象。

   如下麵 Java 示例中的 info 對象。註意:jsp 文件表單 input 中的 name 應該與 java 文件中 info 對象所對應 User 類中的屬性相對應。

   前端:

<form name="form1" id="form1" action="editUserInfo.action" method="post">
    <input type="hidden" name="id" id="id"/>
    <div>郵箱:<input readonly name="email" id="email"/></div>
    <div>姓名:<input name="realName" id="realName" /></div>
    <div>電話:<input name="phone" id="phone"/></div>
    <div><input type="submit" value="保存"/></div>
</form>

  Xwork.xml:

        <action name="editUserInfo" class="com.rambo.app.user.info.EditUserInfo">
            <result name="success" type="dispatcher">
                <param name="location">../resultjson.jsp</param>
            </result>
            <result name="error" type="dispatcher">
                <param name="location">../resultjson.jsp</param>
            </result>
            <interceptor-ref name="modelStack"/>
        </action>

  Java 端:

public class EditUserInfo extends ActionSupport implements ModelDriven{
    private GUser info = new GUser();
    public Object getModel() {
        return info;
    }
    public EditUserInfo() {
    }
    protected String execute() {
       //業務處理.....

        return Action.SUCCESS;
    }

    //getter/setter......
}

2.4.3 uploadStack 上傳攔截器

   Xwork.xml 定義的 Action需要繼承 ActionSupport 類,通過文件上傳攔截器就可以自動將 jsp 表單數據及二 進位文件數轉換為 java 文件定義的相應變數各文件對象,如下麵示例中的 userId 和 uploadFile 對象。

   註意:jsp 文件表單 input 中的 name 名要與 java 文件中的變數名相對應。

   前端:

<form name="form1" action="uploadUserImg.action" method="post"  ENCTYPE="multipart/form-data" >
    <input type="hidden" name="userId" id="userId" value="1" />
    上傳附件:<input type="file" name="uploadFile" id="uploadFile">
    <input type="submit" value="上傳">
</form>

  Xwork.xml:

        <action name="uploadUserImg" class="com.rambo.app.user.info.UploadUserImg">
            <result name="success" type="dispatcher">
                <param name="location">../resultxml.jsp</param>
            </result>
            <result name="error" type="dispatcher">
                <param name="location">../resultxml.jsp</param>
            </result>
            <interceptor-ref name="uploadStack"/>
        </action>

  Java 端:

public class UploadUserImg extends ActionSupport {
    private Integer userId;
    private File uploadFile;

    public UploadUserImg() {
    }

    public String execute() {
        if (uploadFile == null || userId == null)
            return Action.ERROR;

    //業務處理......
        return Action.SUCCESS;
    }

    //getter/setter.....
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Qt的網路操作類是非同步(非阻塞的),但有時想做一些阻塞的事情就不方便了,可用如下幾行代碼輕鬆實現: 當然如上方式不支持重定向(301等),因為暫時用不上,如果要支持,還要在return前判斷並迴圈或遞歸。 另外如果出現error,現在的方式會把伺服器返回的錯誤信息直接返回,後面再更新一版,支持判斷錯 ...
  • 上一篇 "《學習AOP之認識一下SpringAOP》" 中大體的瞭解了代理、動態代理及SpringAop的知識。因為寫的篇幅長了點所以還是再寫一篇吧。接下來開始深入一點Spring aop的一些實現機制。 上篇中最後有那段代碼使用了一個ProxyFactory類來完成代理的工作,從而實現了Aop的A ...
  • 結論:通過super調用基類構造方法,必須是子類構造方法中的第一個語句。 子類必須先調用父類的構造方法是因為: 示例中,main方法實際上調用的是: public void println(Object x),這一方法內部調用了String類的valueOf方法。 valueOf方法內部又調用Obj ...
  • 前期準備 搭建solr服務 參考上一篇,搭建solr搜索服務。 添加依賴 maven工程的話,添加如下依賴, 也可以自己導入jar包 在solr安裝目錄下,找到solr-5.5.3\dist\solrj-lib路徑,添加裡面所有的jar包到自己的工程,別忘了在外面的文件夾還有個solr-solrj- ...
  • 前段時間公司要求做一個統計,用swift3.0寫的,因此整理了一下demo,直接上圖 代碼下載地址:https://github.com/minyahui/MYHChartView ...
  • 項目中需要對定義錯誤日誌及時處理, 那麼就需要修改自定義錯誤日誌的輸出方式(寫日誌、發郵件、發簡訊) 一. register_shutdown_function(array('phperror','shutdown_function')); //定義PHP程式執行完成後執行的函數 函數可實現當程式執 ...
  • ApplicationContext是對BeanFactory的擴展,實現BeanFactory的所有功能,並添加了事件傳播,國際化,資源文件處理等。 configure locations:(CONFIG_LOCATION_DELIMITERS = ",; \t\n" )分割多個配置文件。 ref ...
  • 項目中一直有用到fastcgi_finish_request,感覺很實用。 用法: if(function_exists('fastcgi_finish_request')) fastcgi_finish_request(); 只要代碼運行到這個位置,就已經斷開請求返回參數給客戶端了。 接下來的代碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...