2008-03-26
解析resolveHandler。
找到actionbean类,并建立了路径与类的对应关系,建立了类与类的处理事件方法的map关系,现在要找的就是 resolveHandler。怎么解析呢?DispatchHelper类的resolveHandler(final ExecutionContext ctx)就是做这项工作的。它首先通过 String eventName = resolver.getEventName(bean.getClass(), context);从actionbean类和ExcuteContext取得事件名。
public String getEventName(Class<? extends ActionBean> bean, ActionBeanContext context) {
String event = getEventNameFromRequestAttribute(bean, context);
if (event == null) event = getEventNameFromRequestParams(bean, context);
if (event == null) event = getEventNameFromPath(bean, context);
if (event == null) event = getEventNameFromEventNameParam(bean, context);
return event; }
有三种取得事件的方法,首先从请求的参数里看看有没有参数名和这个actionbean类的处理事件方法对应。没有就从路径中看看有没有,没有就找有没有命名的事件处理方法。
protected String getEventNameFromRequestParams(Class<? extends ActionBean> bean, ActionBeanContext context) {
Map<String,String[]> parameterMap = context.getRequest().getParameterMap();
for (String event : this.eventMappings.get(bean).keySet()) {
if (parameterMap.containsKey(event) || parameterMap.containsKey(event + ".x")) {
return event; } }
return null; }
从所有的事件处理方法中找到第一个与事件对应的同名事件。
没有找到就:
protected String getEventNameFromPath(Class<? extends ActionBean> bean, ActionBeanContext context) {
Map<String,Method> mappings = this.eventMappings.get(bean);
String path = getRequestedPath(context.getRequest());
String binding = getUrlBindingFromPath(path);
if (binding != null && path.length() != binding.length()) {
String extra = path.substring(binding.length() + 1);
String event = extra.substring(0, Math.max(extra.indexOf("/"), extra.length()));
if (mappings.containsKey(event)) {
return event; } } return null;
}
从路径中找,例如:/user/register.action/view是路径,而/user/register.action是urlbinging,那么就看看有没有view这个事件处理方法。
protected String getEventNameFromEventNameParam(Class<? extends ActionBean> bean, ActionBeanContext context) {
String[] name = context.getRequest().getParameterValues(StripesConstants.URL_KEY_EVENT_NAME);
if (name != null && name.length == 1 && this.eventMappings.get(bean).containsKey(name[0])) {
return name[0]; }
return null;
}
从请求的参数中_eventName=“XX”看看没有XX这个处理事件访求。如果找到事件名,再看看能不能找到对应的事件处理方法。如果没有找到事件名,就找缺省的事件处理名。之后把事件名放在ExcuteContext中。
发表评论
- 浏览: 6321 次
- 性别:

- 来自: 南昌

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
jquery core 源码分析
樓主夠狠,通讀了源代碼。肯定獲益非淺。
-- by zhouyrt -
Ext.template分析
for指令,if指令等 在 Ext.XTemplate 中实现了
-- by xxf_cz -
jquery core 源码分析
打倒标题党.
-- by jonee -
Ext.Event分析(二)
var args = Array.prototype.slice.call(ar ...
-- by jljlpch -
Ext.Event分析(三)
请排一下版,看起来太费劲了
-- by cagway






评论排行榜