struts1

来源:https://www.cnblogs.com/scmath/archive/2018/08/30/9557934.html
-Advertisement-
Play Games

Struts就是一個MVC框架,下麵Struts1 是如何實現MVC 的。參考圖如下: M主要是ActionForm和JavaBean。負責程式的數據收集和業務處理,ActionForm屬於Struts的框架的,這裡的JavaBean是應用本身的業務邏輯。 V層主要是Jsp。主要用於動態頁面的顯示, ...


 Struts就是一個MVC框架,下麵Struts1 是如何實現MVC 的。參考圖如下:

M主要是ActionForm和JavaBean。負責程式的數據收集和業務處理,ActionForm屬於Struts的框架的,這裡的JavaBean是應用本身的業務邏輯。

V層主要是Jsp。主要用於動態頁面的顯示,Struts本身是沒有V層的,作為一個框架只是一個大體結構。這個V層是由開發人員補全的

C層是Struts的主要部分,包含了Struts框架本身的很多大部分內容,有:

                 struts-config.xml      Struts框架自身的配置文件,包含了很多配置信息。

                 ActionServlet            Struts框架核心控制類(替代servlet實現的抽象物)。

                 RequestProcessor    配合ActionServlet完成截取URL功能。

Struts通過內部對象及配置文件的協同工作,完成了對頁面和Action靈活控制。從而實現Model和View的分離,降低他們之間的耦合程度。

 

一、配置ActionServlet (web.xml)
Struts 最核心的控制器,ActionServlet 是一個標準的Servlet ,在web.xml 文件中配置,該Servlet 用於攔所有的HTTP 請求,井將用戶請求轉入到Struts 體系內。因此,應將該Servlet 配置成自啟動Servlet ,即為該Servlet 配置load-on-startup 屬性。
註意:在應用Struts 的很多場景下,為Servlet 配直load-on-startup 屬性都是必需的。因此,筆者建議應為ServletAction 配直load-an-startup 屬性,關於load-an-startup請詳見load-an-startup的作用。 

<!-- 將ActionServlet配置成自啟動的Servlet -->  
<servlet>  
      <!-- 指定Servlet 的名字 -->  
    <servlet-name>actionSevlet</servlet-name>  
      <!-- 指定該Servlet 的實現類 -->  
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
      <!-- 配置自啟動的級別 -->  
    <load-on-startup>2</load-on-startup>  
</servlet>  
<servlet-mapping>  
      <!-- 配置ActionServlet的URL 映射 -->  
    <servlet-name>actionSevlet</servlet-name>  
      <!-- 所有以.do 結尾的請求由ActionServlet攔截 -->  
    <url-pattern>*.do</url-pattern>  
</servlet-mapping>

下麵的配置片段中指定了兩個配置文件:struts-config1.xml 和struts-config2.xml 文件。這兩個配置文件分別被配置到config 和config/wawa 的路徑下。

表明將struts-config1.xml 中的Action 映射到應用的根路徑下,而struts-config2.xml 文件中的Action 則被映射到應用的wawa 子路徑下。也就是說wawa 將作為系統的一個模塊使用。

<servlet>  
        <!-- ActionServlet 的名 -->  
        <servlet-name>actionSevlet</servlet-name>  
        <!-- 配置Servlet 的實現類 -->  
        <servlet-class>  
            org.apache.struts.action.ActionServlet  
        </servlet-class>  
        <!-- 指定Struts 的第一個配置文件 -->  
        <init-param>  
            <!-- 指定配置文件的映射 -->  
            <param-name>config</param-name>  
            <param-value>/WEB-INF/struts-configl.xml</param-value>  
        </init-param>  
        <!-- 指定Struts 的第二個配置文件 -->  
        <init-param>  
            <!-- 指定配置文件的映射 -->  
            <param-name>config/wawa</param-name>  
            <param-value>/WEB-INF/struts-config2.xml</param-value>  
        </init-param>  
        <!-- 將ActionServlet配置成自啟動Servlet -->  
        <load-on-startup>2</load-on-startup>  
    </servlet>

二、配置ActionForm類 (JavaBean)
配置ActionForm ,必須包含ActionForm 類才行。Struts 要求ActionForm 必須繼承Struts 的基類: org.apache.struts.action.ActionForm,ActionForm 的實現非常簡單,該類只是一個普通的JavaBean,只要為每個屬性提供對應的setter 和getter 方法即可。根據前面的講解, ActionForm 用於封裝用戶的請求參數,而請求參數是通過JSP 頁面的表單域傳遞過來的。因此應保證ActionForm 的參數與表單域的名字相同。 
註意: JavaB ean 的參數是根據getter 、setter 方法確定的。如果希望有一個A 的屬性,則應該提供getA 和setA 的方法。 

所有的ActionForm 都被配置在struts-config.xml 文件中,該文件包括了一個form-beans 的元素,該元素內定義了所有的ActionForm,每個ActionForm 對應一個form-bean 元素。 
為了定義LoginForm. 必須在struts-config.xml文件中增加如下代碼: 

<!-- 用於定義所有的ActionForm -->  
<form-beans>  
      <!-- 定義ActionForm,至少指定兩個屬性: name , type-->  
    <form-bean name="loginForm" type="com.entity.User" />  
</form-beans> 

配置ActionForm非常簡單,只需指定ActionForm 的name 屬性即可。該屬性定義了ActionForm的id. 用於標識該Form; 另外還需要一個type 屬性,該屬性定義了ActionForm的實現類。 

三、配置Action 
Action 的配置比ActionForm 相對複雜一點,因為Action 負責管理與之關聯的ActionForm. 它不僅需要配置實現類,還需要配置Action 的path 屬性,該屬性用於被用 
戶請求。對於只需在本Action 內有效的Forward. 還應在Action 元素內配置局部Forward。 
(1)Action 的實現 

package com.struts.action;
/**
 * @struts.action path="/login" name="loginForm" input="/login.jsp"
 *                scope="request" validate="true"
 */
public class LoginAction extends Action {
    /*
     * 登錄界面的Action
     */
  // 必須重寫該核心方法,該方法actionForm 將表單的請求參數封裝成值對象 
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {

        //將ActionForm強制類型轉換為LoginForm  
        User loginForm = (User) form;

        UserDAO userdao = new UserDAO();
        User user = userdao.login(loginForm.getUser_name(),
                loginForm.getUser_password());

        if (user != null) {
            System.out.println("用戶存在 登入成功,跳轉至pro.do");
            return mapping.findForward("success");
        } else {
            System.out.println("用戶不存在 登入失敗,跳轉至login.jsp");
            return mapping.findForward("error");
        }
    }
}                

實際的過程是: ActionServlet 攔截到用戶請求後,根據用戶的請求,在配置文件中查找對應的Action , Action 的name 屬性指定了用於封裝請求參數的ActionForm; 然後ActionServlet 將創建預設的ActionForm 實例,並調用對應的setter 方法完成ActionForm的初始化。 
ActionServlet 在分發用戶請求時,也將對應ActionForm 的實例一同分發過來。

(2)Action 的配置 
Action 需要配置如下幾個方面。 

  • Action 的path: ActionServlet 根據該屬性來轉發用戶的請求,即將用戶請求轉發與之同名的Action 。同名的意思是:將請求的.do 尾碼去掉,匹配Action 的path屬性值。 
  • Action 的name: 此處的name 屬性並不是Action 本身的名字,而是與Action 關聯的ActionForm(javabean)。因此該name 屬性必須是前面存在的ActionForm 名。 
  • Action 的type: 該屬性用於指定Action 的實現類,也就是負責處理用戶請求的業務控制器。
  • 局部Forward: Action 的轉發並沒有轉發到實際的JSP 資源,而是轉發到邏輯名,即Forward 名。在Action 內配置的Forward 都是局部Forward (該Forward 只在該Action 內有效)。  
<action-mappings >
    <action name="loginForm" path="/login" scope="request"
              attribute="loginForm" input="/login.jsp"
              type="com.struts.action.LoginAction">
      <set-property property="cancellable" value="false" />
      <forward name="error" path="/login.jsp" redirect="true" />
      <forward name="success" path="/pro.do?func=select" redirect="true" />
    </action>
    
    <action name="pro" parameter="func" path="/pro" 
            type="com.struts.action.ProAction">
      <forward name="success" path="/success.jsp" redirect="false" />
    </action>
  </action-mappings>

四、配置Forward 
正如前面所講, Forward 分局部Forward 和全局Forward 兩種。前者在Action 里配置,僅對該Action 有效:後者單獨配置,對所有的Action 都有效。 
配置Forward 非常簡單,主要需要指定以下三個屬性。 

  • name: 該Forward 的邏輯名。 
  • path: 該Forward 映射到的JSP 資源。 
  • redirect: 是否使用重定向。 

局部Forward 作為Action 的子元素配置;全局Forward 配置在global-forwards 元素里。 
下麵是配置全局Forward 的代碼: 

<!-- 配置全局Forward -->  
    <global-forwards>  
        <!-- 配置Forward對象的name 和path 屬性 -->  
        <forward name="error" path="/WEB-INF/jsp/error.jsp" />  
    </global-forwards> 

上面的配置代碼中,配置了一個全局Forward,該Forward 可以被所有的Action 訪問。通常,只將全局資源配置成全局Forward。當每個Action 在轉發時,首先在局部Forward 中查找與之對應的Forward,如果在局部Forward 中找不到對應的Forward 對象,才會到全局Forward 中查找。因此,局部Forward 可以覆蓋全局Forward。 

下麵提供了web.xml文件的全部源代碼(參考): 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>user-pro-bills</display-name>
  
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>
web.xml

下麵提供了struts-config.xml文件的全部源代碼(參考): 

<?xml version="1.0" encoding="UTF-8"?>  
    <!-- Struts 配置文件的文件頭,包含DTD 等信息 -->  
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">  
    <!--Struts 配置文件的根元素 -->  
    <struts-config>  
        <!--配置所有的ActionForm -->  
        <form-beans>  
            <!--配置第一個ActionForm,指定ActionForm的name 和type 屬性 -->  
            <form-bean name="loginForm" type="lee.LoginForm" />  
        </form-beans>  
        <!--配置全局Forward對象 -->  
        <global-forwards>  
            <!--該Forward對象的name 屬性為error. 映射資源為/WEB-INF/jsp/error.jsp -->  
            <forward name="error" path="/WEB-INF/jsp/error.jsp" />  
        </global-forwards>  
        <!--此處配置所有的Action 映射-->  
        <action-mappings>  
            <!--配置Action 的path. type 屬性name 屬性配置Action 對應的ActionForm-->  
            <action path="/login" type="lee.LoginAction" name="loginForm">  
                <!--還配置了兩個局部Forward. 這兩個局部Forward僅對該Action有效-->  
                <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />  
                <forward name="input" path="/login.jsp" />  
            </action>  
        </action-mappings>  
    </struts-config>
struts-config.xml

 


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

-Advertisement-
Play Games
更多相關文章
  • 面試中2次被問到過這個知識點,實際開發中,應用事件委托也比較常見。JS中事件委托的實現主要依賴於 事件冒泡 。那什麼是事件冒泡?就是事件從最深的節點開始,然後逐步向上傳播事件,舉個例子:頁面上有這麼一個節點樹,div>ul>li>a;比如給最裡面的a加一個click點擊事件,那麼這個事件就會一層一層 ...
  • 近年來,一些動態特性開始作為規範的一部分,出現在CSS語言中。在本文,你將學會如何使用CSS變數,並把它集成到你的CSS開發流程中,讓你的樣式表更好維護,且減少重覆。 ...
  • 我們知道關鍵字function用來定義函數;函數定義可以寫成函數定義表達式,也可以寫成語句的形式。例如下麵的兩種寫法 儘管函數聲明語句和函數定義表達式包含相同的函數名;但它們之間還是有區別的。 相同點:兩種方式都創建了新的函數對象;兩者都會被“提前”(函數語句中定義的函數被顯示的提前到腳本或則函數的 ...
  • 目錄 簡介 持久化 主從複製 高可用 Redis Sentinel .NET Core開發 分散式 Redis Cluster 配置說明 常見問題 簡介 本節內容基於 CentOS 7.4.1708,Redis 3.2.12 環境實驗。 Redis 是一個開源的高性能鍵值對資料庫。 安裝: 特性: ...
  • 近期公司在做架構梳理已經項目架構方向,不知不覺就引起了使用“work”跑數據還是用“MQ”進行跑數據的爭論! 對於爭論這件事在各行各業都有,其實我覺得針對“爭論”這個詞的根源在於一件事情有很多解決方案,每個人的認知不同, 給出的解決方案也不同。然而如果有一個對實際情況都瞭解和對解決問題有充足認知的情 ...
  • Java 語言中,無論新菜鳥,還是老司機,真正瞭解String記憶體的很少。關於String 的試題,花樣很多。== 在什麼情況下是true,什麼情況是false。我總結出如下3點讓你徹底結束對String的模糊感。無論怎麼變化,都離不開以下3種類型: 1、常量池存取(同一引用): String st ...
  • 構造一個線程池為什麼需要幾個參數?如果避免線程池出現OOM?`Runnable`和`Callable`的區別是什麼?本文將對這些問題一一解答,同時還將給出使用線程池的常見場景和代碼片段。`Executors`為我們提供了構造線程池的便捷方法,對於伺服器程式我們應該杜絕使用這些便捷方法,而是直接使用線... ...
  • 1、List介面 2、Set介面 3、判斷集合唯一性原理 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...