Tapestry - 页面加载之一

1.      页面查找

a)        说明:在Tapestry当中,由于我们主要用到的是PageService,所以这里的流程和代码都是参考的PageService

我们根据之前的解释,得到当前要显示的页面名称。首先从缓存当中查找页面是否被加载了。

 

b)        流程图:

c)        代码:

                      i.              IRequestCycle.getPage()

public IPage getPage(String name){

   

if (_loadedPages != null)

result = (IPage) _loadedPages.get(name);

if (result == null){

result = loadPage(name);

if (_loadedPages == null)

_loadedPages = new HashMap();

_loadedPages.put(name, result);

}

return result;

}

 

注:IRequestCycle内部通过Hash做了一个简单的缓存。Hash的主键是需要获得的页面的名字。

 

                   ii.              IPageSource.getPage()

public IPage getPage(IRequestCycle cycle, String pageName, IMonitor monitor){

IEngine engine = cycle.getEngine();

Object key = buildKey(engine, pageName);

IPage result = (IPage) _pool.get(key);

if (result == null){

monitor.pageCreateBegin(pageName);

_pageSpecificationResolver.resolve(cycle, pageName);

 

              result = _loader.loadPage(_pageSpecificationResolver.getSimplePageName(),

                    _pageSpecificationResolver.getNamespace(),

                        cycle,

                         _pageSpecificationResolver.getSpecification());

monitor.pageCreateEnd(pageName);

}else{

result.attach(engine, cycle);

}

return result;

}

 

注:这里的代码首先从缓存中查询对应的页面是否已经加载了,如果没有,则通过PageLoader进行

加载。

这里的缓存跟IRequestCycle的有所不同,首先她使用的是ObjectPool而不是简单的一个Hash

其次,在IRequestCycle内部,我们用来查询的是页面名字,而这里在进行查询时,则同时使用页面

名字和语言。

造成这种区别主要是跟整个请求处理的过程有关,在请求到达时,我们都会创建一个新的IRequestCycle实例,因此,在IRequestCycle内部的缓存竟在一个请求内部有效,而且同一个请求必定使用同一种语言,所以仅使用页面名字即可。而IPageSource的缓存是跨请求的,因此,需要考虑到语言的因素。

    

2.      页面加载

a)        说明:当在缓存当中找不到页面时,表示页面尚未加载,因此需要进行加载。加载时会在不同的目录上进行搜索。

b)        流程图:

c)        代码:

                      i.              PageSpecificationResolver.searchForPage()

private void searchForPage(IRequestCycle cycle){

INamespace namespace = getNamespace();

String expectedName = _simpleName + ".page";

Resource namespaceLocation = namespace.getSpecificationLocation();

if (found(namespaceLocation, expectedName))

return;

if (namespace.isApplicationNamespace()){

if (found(getWebInfAppLocation(), expectedName))

return;

if (found(getWebInfLocation(), expectedName))

return;

if (found(getContextRoot(), expectedName))

return;

}

}

 

注:上述代码演示了,在不同的Context也就是目录下查找要加载的页面。查找的顺序,首先是从应

用程序所在的目录中查找,然后是WEB-INF目录,应用程序部署的目录。如果均没有找到,则尝试作

为框架页面记载。

 
阅读更多
个人分类: Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭