1.0          其他語言
 
 

3.3.5 網路請求分發器 URL 管理

 
 

在 VelocityWeb 中,URL 總是像這個樣子http://<server_ip>:<server:port>/<web_app_name>/<url_mapping_path>/ControllerServlet?m1=system&m2=store_main

這個 URL 中,最後部份

?m1=system&m2=store_main

是由 VelocityWeb 的 URL 管理器管理的。為了產生這樣的 URL,我們需要先將 "system" 加入到頂級 URL 中。

public class PetStoreController extends SimpleController {
    ...
    public boolean initApplication() {
	    ...
        // add system dispatchers
        DispatcherTreeManager.addToRoot(SystemDispatcherGroup.class);
	  

這里的 "m1=system" 代表 SystemDispatcherGroup, "m2=store_main" 代表 StoreMainDispatcher.

public class SystemDispatcherGroup extends DispatcherGroup {
    static{
        DispatcherTreeManager.addParentChildrenRelationship(SystemDispatcherGroup.class, StoreMainDispatcher.class);
    }
    
    public SystemDispatcherGroup() {
        this.setPageLayout(new VPetStorePageLayout());
    }

    public String getUrlId() {
        return "system";
    }

}

public class StoreMainDispatcher extends QueryDispatcher {
    public String getUrlId() {
        return "store_main";
    }
    public StoreMainDispatcher() {
this.setHtmlTemplateFileName("system/store_main.htm");
this.setPageTitle("Default Store Home");
} ...

按照這樣的方法,這種 URL 可以表示葉分發器(LeafDispatcher)和分發器組(DispatcherGroup)。

        Root
           |
           |____SystemDispatcherGroup(system)
                                 |
                                 |____StoreMainDispatcher(store_main)
	  

VelocityWeb 中,這種樹型結構的最大層次是沒有限定的。這意味著可以寫這樣的 URL:
?m1=xx&m2=xx&m3=xx&...&m1000=xx

多數應用中, 這種樹型結構的最大層次不超過五。

不使用 XML 檔案來匹配 URL 和分發器的原因在于,當我們使用單一的 XML 檔案來維護這種關連的時候,多個程式員同時維護這種配置檔案會有很大麻煩。好的設計應該避免編程階段,很多程式員持續地修改同一個檔案。

VelocityWeb 嘗試避免集中式配置。從上面的代碼中可以看出,StoreMainDispatcher 指定自己的顯示頁面和對應的 URL ID。其他的分發器也這麼做。 這樣就可以避免同一個檔案被程式員們同時修改,因為應用程式級別的配置檔案,被同時修改的可能性,遠遠超過了單個的請求分發處理器類。