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。其他的分发器也这么做。 这样就可以避免同一个文件被程序员们同时修改,因为应用程序级别的配置文件,被同时修改的可能性,远远超过了单个的请求分发处理器类。