日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2学习总结一

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2学习总结一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Struts2框架的struts.xml詳解

  • Struts總結一
    • Struts的jar
      • Struts2的簡介
      • Struts2的工作原理
      • 4、Struts2的優點
      • 5、Struts2的第一個案例
        • 5.1、開發環境和導入jar包
        • 5.2、創建Action
        • 5.3、配置struts.xml
        • 5.4、配置web.xml
        • 5.5、success.jsp和實驗結果
      • 6、Struts2配置文件的加載順序
      • 7、Struts2提供的常量(constant)
      • 8、package元素
        • 8.1、對namespace的詳解
      • 9、action元素(動作名稱)
        • 9.1、通配符方法
        • 9.2、Action類的幾種創建方式
        • 9.3、動態方法調用
      • 10、result元素
        • 10.1、param元素(依賴注入:DI)
        • 10.2、自定義結果類型
          • 10.2.1、自定義結果類型的類
          • 10.2.2、在struts.xml中聲明結果類型視圖
          • 10.2.3、在struts.xml中使用結果視圖
          • 10.2.3、訪問路徑
      • 11、default-action-ref元素
      • 12、default-class-ref元素
      • 13、global-results元素
      • 14、global-exception-mapping元素
      • 15、include元素
      • 16、interceptor元素
      • 17、interceptor-ref元素
      • 18、default-interceptor-ref元素
      • 參考

Struts總結一

很久沒更新了,原因是"懶"和"沒時間做筆記"。于是還是做一個小總結吧!(不然容易忘記)

Struts的jar

Struts2下載地址

下載完成后,打開壓縮包中apps目錄下的struts-blank.war包。將得到本次學習的所有jar,如下:


Struts2的簡介

Struts2是Apache發行的MVC開源框架。注意:它只是表現層(MVC)框架。


Struts2的工作原理

在理解下面那幅圖之前,我們先回想一下在學習JavaEE時,Filter和Servlet的區別!

Filter和Servlet的區別:Filter能夠處理(或者說過濾)所有東西,Servlet只能處理Servlet的請求,那么可見,Servlet能做的時候Filter都能做!

那么以下的圖就好理解了,Struts2應用中只有一個Filter,沒錯就是FilterDispatcher過濾器!它將處理所有請求!也就是說,我們將配置web.xml中的一個信息!如下:

<filter><filter-name>struts2Filter</filter-name><!-- 下面這個是Struts2的過濾器 --><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping><filter-name>struts2Filter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

接下來這幅圖可以說是非常容易理解了!

上圖是 Struts2 的體系結構。一個請求在 Struts2 框架中的處理大概會經過以下幾個步驟:

  • 客戶端發出一個指向 Servlet 容器(例如Tomcat)的請求
  • 這個請求會經過幾個過濾器 Filter(ActionContextCleanUp 可選過濾器、其他 Web 過濾器如 SiteMesh 等),最后到達 FilterDispatcher 過濾器
  • 接著 FilterDispatcher 過濾器被調用,FilterDispatcher 詢問 ActionMapper 來決定這個請求是否需要調用某個 Action
  • 如果 ActionMapper 決定需要調用某個 Action,FilterDispatcher 把請求的處理交給 Action 對象的代理(ActionProxy)
  • ActionProxy 通過配置管理器(Configuration Manager)讀取框架的相關配置文件(struts.xml 以及它包含的 *.xml 配置文件),找到需要調用的 Action 類
  • 找到需要調用的 Action 類后,ActionProxy 會創建一個 ActionInvocation 的實例
  • ActionInvocation 在調用 Action 的過程之前,會先依次調用相關配置攔截器(Intercepter),執行結果返回 結果字符串
  • ActionInvocation 負責查找 結果字符串 對應的 Result,然后執行這個 Result,再返回對應的結果視圖(如JSP等等)來呈現頁面
  • 再次調用所用的配置攔截器(調用順序與第7步相反),然后響應(HttpServletResponse)被返回給瀏覽器
  • 舉個例子,如下圖:


    4、Struts2的優點

    下面列舉 Struts2 的一些主要優點:

  • Struts2 是非侵入式設計,即不依賴于Servlet API 和 Struts API.
  • Struts2 提供了強大的攔截器,利用攔截器可以進行 AOP編程(面向切面的編程),實現如權限攔截等功能。
  • Struts2 提供了類型轉換器,可以很方便地進行類型轉換,例如將特殊的請求參數轉換成需要的類型。
  • Struts2 支持多種表現層技術,如 JSP、FreeMarker、Velocity 等。
  • Struts2 的輸入驗證可以對指定的方法進行驗證。

  • 5、Struts2的第一個案例

    第一個案例步驟如下:

  • 開發環境和導入Struts2的jar
  • 創建一個Action
  • 配置struts.xml
  • 配置web.xml
  • 5.1、開發環境和導入jar包

    5.2、創建Action

    5.3、配置struts.xml


    源代碼:

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><!-- 包名,其實也就是命名空間 --><package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action></package> </struts>

    5.4、配置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"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><!-- 配置struts2過濾器 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><!-- 處理所有路徑 --><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping> </web-app>

    5.5、success.jsp和實驗結果



    6、Struts2配置文件的加載順序

    順序配置文件名所在位置說明
    1default.propertiesstruts2-core-2.3.15.3.jar\org\apache\struts2不能修改
    2struts-default.xmlstruts2-core-2.3.15.3.jar不能修改
    3strtuts-plugin.xml在struts2提供的插件jar包中不能修改
    4struts.xml我們的應用中我們能修改的
    5struts.propertiesstruts2-core-2.3.15.3.jar我們能修改的
    6web.xml我們的應用中 我們修改的可以給過濾器配置參數

    7、Struts2提供的常量(constant)

    常量名常量值說明
    struts.i18n.encodingUTF-8應用中使用的編碼
    struts.objectFactory.spring.autoWirename和spring框架整合有關
    struts.multipart.parserjakarta指定文件上傳用的組件
    struts.multipart.maxSize2097152文件上傳總文件大小限制:2M
    struts.action.extensionaction能進入Struts2框架內部的url地址后綴名。多個值用逗號分隔
    struts.enable.DynamicMethodInvocationfalse是否允許動態方法調用
    struts.devModefalse是否是開發模式。開發模式:改了配置文件,不需要重啟。輸出更多的錯誤信息。開發階段建議為true。
    struts.ui.themexhtml頁面展示用的主題

    例如(在struts.xml中配置):

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><!-- 開發模式 --><constant name="struts.devMode" value="true"></constant> </struts>

    8、package元素

    在struts中,package用來管理action、result、interceptor、interceptor-stack等配置信息,它的屬性如下:

    屬性是否必須含義
    name包名,唯一標記,其他package可以利用name來引用
    extends設置繼承其它package,會繼承父package的所有配置屬性(例如action、result等等);默認繼承自struts-default.xml
    namespacepackage的命名空間,會改變url訪問地址,主要是針對比較大型的項目以方便管理action,因為不同namespace中的action可以同名,從而解決action重名的問題。
    abstract是否設置為抽象包

    例如(在struts.xml中配置):

    <!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>

    8.1、對namespace的詳解

    namespace的默認值:"",而不是"/"

    動作類的搜索順序(重點):
    如果請求訪問的服務在訪問指定的namespace下不存在,則默認依次將訪問的namespace縮短一級尋找,如果該namespace存在則在其下尋找服務,如果依次縮短尋找的namespace還是找不到對應的namespace則在名為"/"的namespace下尋找,找到了就訪問,找不到就返回找不到。


    9、action元素(動作名稱)

    屬性是否必須含義
    nameaction的名稱
    classaction對應的JAVA類
    method類中的具體方法
    converter類型轉換器

    如果沒有為action指定class,默認的是ActionSupport

    如果沒有為action指定method,默認執行action中的execute()方法

    例如(在struts.xml中配置):

    <!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>

    9.1、通配符方法

    例如(在struts.xml中配置):

    <!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="*_*" class="com.csa.action.HelloAction" method="{1}{2}"><!-- 查找相應結果的字符串的result --><result name="success">/{1}{2}.jsp</result></action> </package>

    9.2、Action類的幾種創建方式

    動作類的幾種創建方式:

  • 動作類就是一個POJO。
  • 動作類實現com.opensymphony.xwork2.Action接口。
  • 動作類繼承com.opensymphony.xwork2.ActionSupport(一般使用這種方法)。
  • 9.3、動態方法調用

    例如(在struts.xml中配置):

    <!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>

    url訪問方式:http://ip:prot/web應用/命名空間/動作名稱!方法名.action


    10、result元素

    屬性是否必須含義
    nameAction對應返回的邏輯響應視圖,默認是success。
    type返回結果的類型,默認為dispatcher

    例如(在struts.xml中配置):

    <!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action> </package>

    10.1、param元素(依賴注入:DI)

    <!-- 包名,其實也就是命名空間 --><package name="hello" extends="struts-default" namespace="/hello"><!-- action處理類 --><action name="hello" class="com.csa.action.HelloAction" method="hello"><!-- 查找相應結果的字符串的result --><result type="redirectAction(或者其他自定義結果類型)"><param name="namespace(或者自定義結果類型的參數)">/world</param><param name="actionName(或者自定義結果類型的參數)">world</param></result></action></package>

    10.2、自定義結果類型

    自定義結果類型需要做的有以下幾步:

  • 自定義一個類,繼承org.apache.struts2.dispatcher.StrutsResultSupport類。
  • 在struts.xml的package中聲明結果類型視圖。
  • 在struts.xml的action中使用結果類型。
  • 10.2.1、自定義結果類型的類
    package com.csa.type;import org.apache.struts2.dispatcher.StrutsResultSupport; import com.opensymphony.xwork2.ActionInvocation;public class CaptchaResult extends StrutsResultSupport {private Integer width;private Integer height;public void setWidth(Integer width) {this.width = width;}public void setHeight(Integer height) {this.height = height;}@Overrideprotected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {//以下是生成驗證碼的算法!省略不寫。width和height決定寬度和高度}}
    10.2.2、在struts.xml中聲明結果類型視圖
    <!-- 下面的內容省略掉 --> <package ...><!-- 聲明結果類型 --><result-types><result-type name="captcha" class="com.csa.type.CaptchaResult"></result-type></result-types> </package>
    10.2.3、在struts.xml中使用結果視圖
    <!-- 沒有class是執行默認的ActionSupport,沒有方法是默認執行execute() --> <action name="captchaAction"><result name="success" type="captcha"><!-- 設置驗證碼的寬和高度分別為200和100 --><param name="width">200</param><param name="height">100</param></result> </action>
    10.2.3、訪問路徑

    http://ip:port/web應用/命名空間/動作名稱,這樣就可以得到以上的自定義結果類型的東西的。在這里我們得到的是驗證碼!


    11、default-action-ref元素

    如果找不到項目請求的action,就會報出404錯誤,而且這種錯誤不可避免,所以我們可以使用 default-action-ref 來指定一個默認的action,如果系統出現找不到action的情況,就會來調用這個默認的action。
    例如:

    <!-- 包名,其實也就是命名空間 --> <package name="hello" extends="struts-default" namespace="/hello"><default-action-ref name="hello"></default-action-ref><!-- action處理類 --><action name="hello"><!-- 查找相應結果的字符串的result --><result name="success">/success.jsp</result></action></package>

    訪問路徑:http://ip:port/web應用/命名空間/任意名稱會發現,最后返回的都會是/success.jsp的內容!

    12、default-class-ref元素

    與action的一毛一樣,不做闡述!

    <!-- 指定默認class為Test --> <default-class-ref class="com.csa.action.HelloAction"/>

    13、global-results元素

    設置package范圍內的全局響應結果。在多個action都返回同一個邏輯視圖(通常為某個jsp頁面)的情況下,可以通過該標簽來統一配置。
    例如:

    <package ...><!-- 全局結果視圖 --><global-results><result name="success">/success.jsp</result><result name="error">/error.jsp</result></global-results><action name="hello"><!-- 局部結果視圖 --><result name="hello">/hello.jsp</result></action> </package>

    這樣子,只要在同一個包下的所有動作(action)返回的字符串都將先去匹配局部結果視圖,如果找不到對應的字符串,再去全局結果視圖中尋找有無對應的字符串。如果有,則返回相應的結果視圖,如果沒有,則404!


    14、global-exception-mapping元素

    配置發生異常時的視圖信息。exception-mapping是控制action范圍內的,而global-exception-mapping是控制package范圍內的。兩個都配置時,exception-mapping的優先級更高。

    屬性是否必須含義
    nameexception名稱
    result設置異常相應結果的視圖信息
    exception設置異常類型

    這里已經很詳細(跟result一毛一樣)了,就不需要在說明了!


    15、include元素

    你還可以使用 include 來引入外部配置文件,直接給出 url 即可:

    <include file="**/**/***.xml" />

    使用 include 的好處在于,例如當我們開發一個比較大型的項目的時候,配置文件肯定會寫一大堆。如果寫在一個配置文件里就不好查看和修改,不便于維護;所以使用 include 后可以根據模塊、也可以根據功能來劃分,這樣就比較清晰,方便管理和維護。


    16、interceptor元素

    通過該標簽可以向Struts2框架中注冊攔截器或者攔截器棧,一般多用于自定義攔截器或攔截器棧的注冊。該標簽使用方法如下:

    <package ...><interceptors><interceptor name="攔截器名" class="攔截器類"/><interceptor-stack name="攔截器棧名"><interceptor-ref name="攔截器名"></interceptor-stack></interceptors> </package>

    17、interceptor-ref元素

    通過該標簽可以為其所在的Action添加攔截器功能。當為某個Action單獨添加攔截器功能后,中所指定的攔截器將不再對這個Action起作用。

    <action name="hello"><interceptor-ref name="攔截器名(或者攔截器棧名)"><param name="參數名">參數值</param></interceptor-ref><result name="success">/success.jsp</result> </action>

    18、default-interceptor-ref元素

    該標簽用來設置整個包范圍內所有Action所要應用的默認攔截器信息。事實上我們的包繼承了struts-default包以后,使用的是Struts的默認設置。我們可以在struts-default.xml中找到相關配置:

    <package ...><default-interceptor-ref name="defaultStack"/> </package>

    在實際開發過程中,如果我們有特殊的需求是可以改變默認攔截器配置的。當時一旦更改這個配置,“defaultStack”將不再被引用,需要手動最加

    如下:

    <action name="hello"><interceptor-ref name="攔截器名(或者攔截器棧名)"><param name="參數名">參數值</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref><result name="success">/success.jsp</result> </action>

    參考

    實驗樓的Struts2教程
    還有黑馬的word筆記!這里木得url!

    總結

    以上是生活随笔為你收集整理的Struts2学习总结一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。