1. 程式人生 > >Struts2 的 struts.xml 配置中 namespace 的使用

Struts2 的 struts.xml 配置中 namespace 的使用

Struts2 的 struts.xml 中是分 package 配置的,可以為 package 設定 namespace 屬性,如

<package namespace="/secure"   ....>
    ......
</package>

如果沒有指定 namespace 屬性,預設 namespace 是 ""。使用 namespace 可以方便於按不同目的規劃對應用的訪問規則。比如不同 namespace 下配置了不同的攔截器就可以實現許可權的控制,如 "/secure" 下已登陸使用者才能訪問,"/public" 下可公開訪問的。

配置了 namespace 直接就是反應在訪問 URL 上,例如 namespace="/secure"  name="test" 的 action



 <package namespace="/secure"   ....>
       <action name="test"  ....
</package>

訪問它的 URL 就是 http://ip:port/context/secure/test.action,那如果在 namespace "/secure" 下沒有 test action 會出現什麼情況呢?Struts 還會嘗試在預設 namespace,即 "" 下找 test。

再舉個例子,URL 是 http://ip:port/context/some/path/test.action 時,如果在 "/some/path" namespace 下找不到 test action,也是到 "" (default namespace) 下找 test action,但不會去 "/some" 下找的。


用標籤 <s:url value="/secure/test.action"/>  對應頁面原始檔是 /context/secure/test.action

稍有麻的就是 <s:form action="/secure/test.action" .... 對應的原始檔是 <form action="/context/secure/test.action" ...

但是後臺會有警告:

警告: No configuration found for the specified action: '/secure/test.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.


Struts2 把 action 屬性值當整一個 Action Name 了,但這也不影響使用,這個 URL 正好能與 (package namespace) + (action name) 合上拍。

但是對於使用了動態方法呼叫(struts.enable.DynamicMethodInvocation = true)就沒這麼幸運了。很容易想當然的

<s:form action="/secure/test!update.action" ....  生成的 HTML 原始檔卻是 action="/TestStruts2/om/test"

同時後臺的警告資訊是:

警告: No configuration found for the specified action: '/secure/test' in namespace: ''. Form action defaulting to 'action' attribute's literal value.

很顯然對於這個 action="/TestStruts2/om/test",提交時是會得到 HTTP Status 404 - /context/secure/test  錯誤。

正確的用法是 <s:action...> 也有一個 namespace 屬性,對了,就是

<s:form namespace="/secure" action="test!login">  生成的 HTML 原始檔是:<form action="/TestStruts2/om/test!login.action" ....>

我們要的就是這個。

如果不配置 namespace 屬性,我們能不能在訪問 action 時也用上目錄層次呢?可以,那是在 struts1 習慣的做法,配置 <action name="secure/test" ....> name 中使用斜槓,但在 Struts2 中 Action Name 中使用斜槓需要設定

struts.enable.SlashesInActionNames=true                      預設為 false

可是 Struts2 大概不贊同這種做法,力挺 namespace 的作用。

對於上面使用了斜框的 Action Name,<s:form 中的寫法要用

<s:form action="secure/test">                 生成 HTML 原始檔:<form action="/context/secure/test.action" .....

<s:form action="secure/test!update">            生成 HTML 原始檔:<form action="/context/secure/test!login.action" .....


上面的 action 後加不加 .action 無所謂,只是要保證 <s:form>  的 action 屬性一定要與 struts.xml 中的 <action> 的 name 匹配上,如果你自作多情的在前面加個斜槓,如寫成了

<s:form action="/secure/test!update"> 、 <s:form action="/secure/test">  或者 <s:form action="/secure/test!update.action">   生成的 HTML 原始檔就都成了:<form action="/context/secure/test" .....

這也是從 Struts1 帶來的弊病,因為 Struts1 中 <html:form> action 屬性對應的是 <action> 的 path,而 Struts2 中 <s:form> 的 action 屬性對應的是 <action> 的 name;name 要完全匹配,path 可以加些層次。

相關推薦

Struts2struts.xml 配置 namespace 的使用

Struts2 的 struts.xml 中是分 package 配置的,可以為 package 設定 namespace 屬性,如<package namespace="/secure"   ....>    ......</package>如果

Struts2在web.xml,struts.xml配置出現404錯誤,解決方案

在JSP開發中使用struts2框架,配置web.xml和struts.xml後,jsp文件執行都是404錯誤 找了很多方法,都不能解決問題,最終發現是struts包的配置問題,最新的struts2.5.8的版本與2.3之前的版本有很大不同 像xwork.core的包就被整

struts2struts.xml配置檔案詳解

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://st

Struts2.5.2使用,web.xmlstruts.xml配置,及執行出現的問題

 <!-- 新增struts2框架的核心控制器 -->  <filter>  <!-- 過濾器名 -->  <filter-name>struts2</filter-name>  <!-- 配置struts2的核心控制器的實現類 org.apa

struts2入門 struts2struts.xml配置檔案詳解

一、struts2的功能 Struts2是一個優秀的MVC框架,大大降低了各個層之間的耦合度,具有很好的擴充套件性。 傳統的servlet + jsp實現了MVC架構,其執行機制是:jsp頁面(檢視view)傳送訊息到servlet(控制器Controller),servlet獲取請求資料,處理業務邏輯,

struts2配置多個struts.xml配置檔案

  一般來說我們在做開發的時候,是一個團隊,我們可能會按照人來分不同的模組,每個人維護自己不同的struts配置檔案,但在最後整合的時候,一定要把各人所用到的配置檔案都整合進來,這裡有一個方法,用是在你寫的主要的配置檔案中把別的配置檔案導進來,   在struts.

struts2xml配置struts-2.3.15)

names end action apache .org ctype extends fault default <!-- 約束文件 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//D

Struts2框架使用(三)之struts.xml配置

package row port dtd tac 結構 www. turn doc 在Struts2的配置文件中,可以采用分模塊的方法來配置,在功能復雜的系統中,使用分模塊方法,可以使結構更清晰。 例如: 下面,有車輛模塊以及資產模塊,將其分為兩個xml文件。 <?

Struts2筆記(三)、struts.xml配置

1、package配置 <package name="default" namespace="/test" extends="struts-default"> <action name="login" class="com.project.actions

Struts2struts.xml配置檔案的配置

<package>標籤,如果要配置Action的標籤,那麼必須要先配置<package>標籤,代表的包的概念 包的屬性 ** name----包的名稱,要求是唯一的,管理action配置 ** extends—繼續,可以繼承其他的包,只要繼

Struts2學習之1(Struts2的工作流程,動作類的編寫,struts.xml配置檔案的編寫)

Struts2的開始 Struts2的作用 現在專案一般都是按照三層架構來開發的,表現層,業務邏輯層,資料訪問層,Struts2就是用來代替servlet處理表現層的一種框架,用來處理頁面的請求跳轉與資料顯示等,Struts2裡面還是用servlet來實

Struts2.5版本以上的struts.xml配置

由於Struts2的版本在不斷的更新,對檔案的配置要求也有了一些改變。 對於Struts2.5以上的版本如果需要url+!+方法訪問Action某個方法的話需要在struts.xml加入如下語句 &

幫你徹底解決eclipse(myeclipse)struts.xml配置檔案

網上看了下,全是用不了的方法,下面分享我的方法,環境是macOS10.13.1 eclipse 1.preferences 裡查詢xml,選擇xml Catalog,點選右邊User Specified Entries,點選add 2.左邊選擇第一個Catalog Ent

struts.xml配置檔案各個標籤的含義,已經知識點記錄

struts.xml中使用<constant name="" value=""></constant>元素進行覆蓋<constant name="struts.devMode" value="true"></constant>這

Struts2框架學習系列(二) Action --struts.xml配置檔案詳解

  注意:有一部份的朋友在某個自定義的action中定義default-action-ref這個配置的時候,認為在位址列中輸入地址如http://localhost:8080/project的時候(project為專案名),如果該專案後面不輸入任何名字或者輸錯地址,則會自動進入default-action-r

修改Struts2struts.xml配置檔案位置和名稱-重點是init-param引數用來切換載入的路徑

預設情況下,Struts2的配置檔名稱為struts.xml,且該檔案放在src根目錄下。專案載入時會自動載入該struts.xml,如下圖所示: 如果需要修改struts.xml的位置,例如把struts.xml放到struts2資料夾下,結構如下圖所示,該怎麼辦

struts2struts.xml配置文件

xtend 其他 fig constant light 是否 默認 The 處理 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software

Action的實現方式和struts.xml配置的詳細解釋,Struts2的簡單執行過程(二)

我把你的頭像,設定成我的名字,此刻你便與我同在。我把你的名字,寫進我的程式碼裡面,以後,我的世界便存在著你。         “兩個蝴蝶飛”特別喜歡"java1234知識分享網"小峰的實用主義,所以本文及其系列文章均是採用實用主義,

struts.xml配置解釋

包名 src method pac -1 pan mage name屬性 默認 1.struts.xml配置文件中的<package>中的name表示包名,可以看成是一個模塊名稱,   name屬性必需,用於被其他的包引用當前包2.extends默認我們會繼承s

struts.xml配置詳解(名稱空間、約束、動態代理)

1、package 元素: 1.1 作用:方便分模組化開發 1.2 屬性: name:必須有。唯一。標識一個包, 好有一定的含義。 extends:繼承。一般要求必須繼承struts-default的包。不繼承該包,將無法使用struts2提供的一些核心功能。stru