action方法定義在action類裏面,它用來映射url路徑(action path),modvoc 使用命名慣例(CoC)和註解來定義action路徑。默認狀況下,action的路徑映射由包名(package),類(class)和方法名(method)來決定的,它的慣例規則以下: html
path = /action包/action類.action方法.後綴
java
後綴:默認狀況下,後綴的值是.html,能夠經過modvoc全局配置;
web
action方法:action路徑的一部分,默認是方法名;
框架
action類:action路徑的一部分,默認是類名(非大小,多個單詞下排除最後一個單詞,如:類名是userAction,則路徑是user);
ide
action包名:action包名是action路徑可選擇的一部分。
post
默認狀況下,每一個路徑的部分都是來之方法,類和包名的定義,而後,每一個部分均可以明確的用相應註解值來定義。 網站
如下是簡單的實體類和方法: url
@MadvocAction public class HelloAction { @Action public void world() { } }
這個action類和方法映射的路徑是:/hello.world.html。正如上面所說,路徑中的每一個部分均可以明確的用註解值來定義,咱們能夠簡單的修改以下: spa
@MadvocAction("holla") public class HelloAction { @Action("mundo") public void world() { } }
經過以上的註解配置,它的映射的路徑是:/holla.mundo.html。 然而,以上都只是使用了簡單的字符串來定義路徑,咱們能夠經過如下類配置複雜的路徑: .net
@MadvocAction("foo/boo") public class HelloAction { @Action("zoo/hello.exec") public void world() { } }
以上的配置中,它的映射路徑是:/foo/boo.zoo/hello.exec.html 。
在上面的例子中,咱們能夠經過在一個action類寫多個方法類映射多個路徑。
在同一個網站中只有一個後綴是合理的,因此,咱們能夠在modvoc的全局配置來配置默認的後綴。可是,咱們也能夠經過@Action 註解的extension來定義每一個方法映射的後綴:
@MadvocAction public class HelloAction { @Action(extension="jpg") public void world() { } @Action(extension=Action.NONE) public void foo() { } }
因爲madvoc框架很容易擴展,它很合適來爲action路徑和實現自定義行爲 擴展組件。例如:它很容易的爲任何的方法作好比 store... 開頭的擴展,或者 以.do做爲結尾。
經過madvoc的@Action註解,咱們能夠來定義完整的action映射路徑。注意:必須之前綴「/」開頭。以下:
@MadvocAction public class HelloAction { @Action("/bonjour-monde.html") public void world() { } }
明顯地,以上的action映射的路徑是:/bonjour-monde.html。當一個action路徑定義用「/」開頭的時候,則說明它使用了完整的action路徑,忽略了上一級或者幾級的配置(如包名,類名)。
默認狀況下,action包是被忽略的,沒有使用在action路徑中。但儘管如此,在action的包中設置爲路徑的一部分仍是有意義的,madvoc提供了一個方法來設置包爲action路徑的一部分。
首先,這個特徵必須在root package中開啓,這樣會映射到action跟的路徑,這個設置在madvoc初始化的適合被設置,一個方法以下:
public class MyWebApplication extends WebApplication { @Override protected void init(MadvocConfig madvocConfig, ServletContext servletContext) { madvocConfig.getRootPackages().addRootPackageOf(IndexAction.class); } }
root Package 根據包名和路徑定義。在上面的例子中,一個root package(indexAction)會映射到web的跟目錄(/)。
當root package被定義,madvoc則認爲action類的包:來至root package的偏移量(offset)會被當作action路徑的前綴,因此,package會被映射成爲一個文件夾,以下代碼:
package org.jodd.madvoc.doc; @MadvocAction public class HelloAction { @Action public void world() { } }
則會被映射到/doc/hello.world.html ,若是root package被設置到org.jodd.madvoc.的話。若是你指定了多個root package,必定要注意,千萬別重複映射了。
不少時候,咱們想集成一些action類在分開的子包下,可是又不想改變action的路徑(好比根目錄),咱們能夠指定@MadvocAction("/")在子包下,這樣,madvoc會映射這個包下全部的類到跟目錄下:
@MadvocAction("/") package com.....; import jodd.madvoc.meta.MadvocAction;
默認狀況下,madvoc會忽略全部的http請求方法,不管是post,get仍是其餘,映射到的方法都會被執行。可是,madvoc也提供了註解@Action的method來控制http請求,以下代碼:
@MadvocAction public class FormAction { @Action(method = "POST") public void store() { } }
這個方法會映射到路徑:/form.store.html,同時只有是post方法的時候會被執行,get或者其餘方法則出現了404錯誤(page not found)。
經過以上的介紹,顯然的,madvoc使用了action的方法來映射action的路徑。此外,madvoc也考慮了一些路徑和方法的名字是無關的一些默認設置,好比那些咱們經常使用的頁面,好比index.html,about.html,error.html等。madvoc會忽略 execute 和 view的方法名字,因此,一下的action:
@MadvocAction public class IndexAction { @Action public void view() { } }
則會被映射到頁面 /index.html。若是有多個默認的方法被使用,madvoc會選擇最後一個方法來調用,或者拋出一個異常來指明指明action路徑的配置。此外,這些默認的方法名字均可以在madvoc的全局變量中自由的配置。
做爲選擇,註解 @Action能夠被設置爲「忽略」值,這樣,在action路徑映射的時候就會忽略這個方法的名字,所以,如下的代碼中和上面的代碼有相同的映射路徑。
@MadvocAction public class IndexAction { @Action(Action.NONE) public void foo() { } }
接下來咱們經過一個表格來總結下ActionMethodParser 的默認的行爲。