Struts2【配置】知識要點

来源:https://www.cnblogs.com/Java3y/archive/2018/03/10/8542023.html
-Advertisement-
Play Games

前言 上篇Struts博文已經講解了Struts的開發步驟以及執行流程了.....對Struts的配置文件有了瞭解.....本博文繼續講解 Struts在配置的時候一些值得要學習的細節 ... 通配符 為什麼要學習通配符 在講解通配符之前,我們來看一下需求..... 現在我的 Action中有兩個方 ...


前言

上篇Struts博文已經講解了Struts的開發步驟以及執行流程了.....對Struts的配置文件有了瞭解.....本博文繼續講解Struts在配置的時候一些值得要學習的細節...

通配符

為什麼要學習通配符

在講解通配符之前,我們來看一下需求.....

現在我的Action中有兩個方法,處理登陸和處理註冊:


public class PrivilegeAction extends ActionSupport {
    
    public String login() {
        System.out.println("我是登陸");

        return "success";
    }

    public String register() {
        System.out.println("我是註冊");
        return "success";
    }
}

因此,我們就需要在struts.xml文件中配置兩個action節點



    <action name="login" class="privilegeaction.PrivilegeAction" method="login">
        <result name="success">/index.jsp</result>
    </action>

    <action name="register" class="privilegeaction.PrivilegeAction" method="register">
        <result name="success">/index.jsp</result>
    </action>

現在我們發現:它們僅僅只有訪問路徑和方法的名稱是不一樣的....但是這卻要多配置一個action節點,會造成浪費!

於是乎通配符就應運而生了...


使用通配符改造

沒有通配符之前,我們是需要配置兩個action的...有了通配符,我們是這樣做的:


<package name="privilige" extends="struts-default">

    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>
    
</package>

解釋一下:

  • name=privilege_*,我們用了_作為分隔符。*就是我們的通配符
  • {1},就是代表著第一個通配符

我們來看一下效果:

這裡寫圖片描述

同理可得,當我們在地址欄訪問login的時候,就會執行login的方法

這裡寫圖片描述


Struts中路徑的匹配原則

有的時候,我們可能會在package節點中指定namespace名稱空間,我們在訪問對應的資源名稱的時候,就需要在前面加入相對應名稱空間的值...

比如:

名稱空間的值為“/user”

<package name="privilige" extends="struts-default" namespace="/user">
    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>

</package>

那麼在訪問資源的時候,就需要在項目名稱後邊加上名稱空間的值:

這裡寫圖片描述

現在就有一個很奇怪妙的事情發生了:在名稱空間和資源路徑的中間可添加任意的路徑

這裡寫圖片描述

但是呢,不能在名稱空間之前加入不存在的路徑

這裡寫圖片描述


其實這就涉及到了Struts中路徑的匹配原則,我就拿隨便拿個路徑來舉例子http://localhost:8080/user/a/a/privilege_login

  • 首先,Struts會把請求的資源路徑拿到,也就是privilege_login
  • 然後在看看有沒有/user/a/a這個名稱空間;如果有,就返回結果
  • 如果沒有,就看看有沒有/user/a這個名稱空間;如果有,就返回結果
  • 如果沒有,再看看有沒有/user這個名稱空間;如果有,就返回結果
  • 直到最後,如果都沒有找到,就報錯!

看完這個例子,我們就可以知道為啥在名稱空間和資源路徑的中間可添加任意的路徑,而不能在名稱空間之前加入不存在的路徑....這就是Struts的路徑匹配原則..


Struts常量

Struts2預設的訪問尾碼是.action......

這裡寫圖片描述

修改預設訪問路徑

有的時候,可能根據項目的需要...我想尾碼名預設並不是.action,那我該怎麼辦呢??

我們在jar包上找到它的配置文件...

這裡寫圖片描述

我們發現它的預設值是action,,

值得註意的是:兩個逗號並不是多餘的

我們不可能是直接修改jar包中的配置文件的,在struts.xml文件中提供了constant節點供我們修改struts的常量...

這裡寫圖片描述

前面已經說了,兩個逗號並不是多餘的。那麼直接在配置文件中配置action時,會怎麼樣:

<constant name="struts.action.extension" value="action"/>

這裡寫圖片描述

也就是說,“,”號能夠匹配空格鍵

舉例子說明:

  • 如果配置尾碼為action。那麼尾碼一定要寫action
  • 如果配置尾碼為action,do,。那麼尾碼可以是action,可以是do,也可以不寫
  • 如果配置尾碼為action,,。那麼尾碼可以是action,可以不寫

Struts常用的常量

這裡寫圖片描述


<struts>

    <!-- 0. 請求數據編碼 -->
     <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!-- 1. 修改Struts預設的訪問尾碼 -->
    <constant name="struts.action.extension" value="action,do,"></constant>
    <!-- 2. 修改xml自動重新載入 -->
    <constant name="struts.configuration.xml.reload" value="true"/>
    <!-- 3. 開啟動態方法調用 (預設不開啟)-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!-- 4. 修改上傳文件的最大大小為30M -->
    <constant name="struts.multipart.maxSize" value="31457280"/>
    

</struts>

只有動態方法調用是我們沒有接觸過的。
那動態方法調用是怎麼回事呢???這是樣的:在action節點不配置method屬性,在地址欄使用資源名稱!方法名的方式去調用業務方法

這裡寫圖片描述


跳轉全局視圖

為什麼需要跳轉全局視圖?

首先,我們還是來看一個需求:現在我有兩個Action,PrivilegeAction和CategoryAction

  • PrivilegeAction
    ```java

public class PrivilegeAction extends ActionSupport {

public String login() {
    System.out.println("我是登陸");

    return "success";
}

public String register() {
    System.out.println("我是註冊");
    return "success";
}

}
```

  • CategoryAction


public class CategoryAction extends ActionSupport {

    public String add() {
        System.out.println("我是添加");

        return "success";
    }

    public String find() {
        System.out.println("我是查找");
        return "success";
    }
}
  • 在struts.xml文件中配置

    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>
    
    <action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
        <result name="success">/index.jsp</result>
    </action>

我們發現一個問題,只要是方法返回值是success,那麼就跳轉到首頁....如果有大量Action方法返回的都是success,那麼就要寫很多很多個result節點了..

使用跳轉全局視圖

  • 代碼就可以變成是這樣子了,註意:global-results節點需要在action節點的上面

<package name="privilige" extends="struts-default" >

    <global-results>
        <result name="success">/index.jsp</result>
    </global-results>

    <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
    </action>

    <action name="category_*" class="privilegeaction.CategoryAction" method="{1}">
    </action>


</package>
  • 效果:

這裡寫圖片描述


Action節點中的預設配置

一份相對完整的action節點是這樣子的:

        <action name="privilege_*" class="privilegeaction.PrivilegeAction" method="{1}">
        </action>

method

如果我們不寫method的話,預設執行的是execute()方法,execute()方法預設返回值是SUCCESS


public class BBAtion extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("我是execute()");

        return SUCCESS;
    }
}

這裡寫圖片描述


class

如果不寫class,class預設執行的action在struts-default有配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

什麼時候會不寫class?就是需要跳轉到WEB-INF目錄下的資源的時候.....這就類似與Servlet需要跳轉到WEB-INF下的資源。【Tomcat不允許直接訪問WEB-INF資源】


        <!-- 什麼情況不配置class? 即處理的aciton -->
        <!-- 答案: 當只是需要跳轉到WEB-INF下資源的時候。 -->
         <action name="test2">
            <result name="success" >/WEB-INF/index.jsp</result>
         </action>

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關註微信公眾號:Java3y


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

-Advertisement-
Play Games
更多相關文章
  • 由於要學習dubbo,需要用到zookeeper,所以這裡記錄一下linux的zookeeper安裝與配置 一、下載zookeeper的包:官方地址 二、把包上傳到linux上,同樣也是放到 /usr/local 目錄下,當然同樣也是放在哪裡都行,最後解壓到 /usr/local/zookeeper ...
  • 在開發中,網路請求和json解析使用的頻率是一樣高的,因為網路請求返回來的一般都是json(當然還有xml),這裡討論的是json,網路請求的工具類前面我的博客已經寫過了,這裡給出網址:http://blog.csdn.net/u014727709/article/details/53389840 ...
  • ArrayList是一個容量能夠動態增漲的數組,它是java集合框架中一個重要的類,繼承抽象類AbstractList,實現了List介面。 實現了RandomAccess介面,該介面為標記介面,即提供了隨機訪問功能。 實現了Cloneable介面,可以調用Object的clone方法,返回對象的淺 ...
  • 實際情況是: .h文件一直報錯source file is not valid utf-8的錯誤, 原因就是: 文件中出現了一個中文的“;”導致的。總結就是:如出現此類錯誤,可能是字元不夠標準。 ...
  • JWT是一種用於雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規範。JWT作為一個開放的標準(RFC 7519),定義了一種簡潔的,自包含的方法用於通信雙方之間以Json對象的形式安全的傳遞信息。因為數字簽名的存在,這些信息是可信的,JWT可以使用HMAC演算法或者是RSA的公私秘鑰對進行簽名。 ...
  • 一、三次握手 TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立可靠連接,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號並交換TCP視窗大 小信息。 第一次握手:建立連接。客戶端發送連接請求報文段,將SYN設置為1,Seq設置為x,然後,客戶端進 ...
  • 4805: 歐拉函數求和 Description 給出一個數字N,求sigma(phi(i)),1<=i<=N 給出一個數字N,求sigma(phi(i)),1<=i<=N Input 正整數N。N<=2*10^9 正整數N。N<=2*10^9 Output 輸出答案。 輸出答案。 Sample I ...
  • 題目描述 給定一個正整數N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1​=∑i=1n​ϕ(i),ans2​=∑i=1n​μ(i) 輸入輸出格式 輸入格式: 一共T+1行 第1行為數據 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...