找到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.actionurlbinging,那么就看看有没有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中。
 
评论
发表评论

您还没有登录,请登录后发表评论

jljlpch
搜索本博客
最近加入圈子
存档
最新评论