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目录,应用程序部署的目录。如果均没有找到,则尝试作
为框架页面记载。