2 linyufengs linyufengs 于 2014.09.02 21:15 提问

我在读取Struts2源码的时候,不了解ActionMapper怎样读取通配符的?

在读取Struts2源码的时候~
public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) {
ActionMapping mapping = new ActionMapping();
String uri = RequestUtils.getUri(request);

    int indexOfSemicolon = uri.indexOf(";");
    uri = (indexOfSemicolon > -1) ? uri.substring(0, indexOfSemicolon) : uri;
    //去掉后缀
    uri = dropExtension(uri, mapping);
    if (uri == null) {
        return null;
    }
     //解析出方法名和命名空间
    parseNameAndNamespace(uri, mapping, configManager);
    //处理特殊的传递的参数,清除最后以。x或者。y作为后缀的属性,这个是为什么。难道是敏感词么?
    handleSpecialParameters(request, mapping);
    //最后返回过滤好的action的一些信息~这样的话,就能获取到Action的名称方法
    return parseActionName(mapping);
}

protected ActionMapping parseActionName(ActionMapping mapping) {
if (mapping.getName() == null) {
return null;
}
//这个的意思是获取index!getindex.action的时候获取Action 的名称与方法
//现在我想问一下如果是通配符的时候怎样处理呢?
//难道是需要通过读取struts.xml文件然后需找规律
if (allowDynamicMethodCalls) {
// handle "name!method" convention.
String name = mapping.getName();
int exclamation = name.lastIndexOf("!");
if (exclamation != -1) {
mapping.setName(name.substring(0, exclamation));

            mapping.setMethod(name.substring(exclamation + 1));
        }
    }
    return mapping;
}

****这个方法是解决 index!getindex.action的时候获取Action 的名称与方法的方法
但是如果配置文件中如果是
action name="user_*" class="com.test.action.UserAction" method="{1}">
/user_{1}.jsp

这样的情况下呢?怎样获取action 与MethodName呢?****

2个回答

linyufengs
linyufengs   2014.09.03 15:24

我自己找到了答案了~自己回复~

linyufengs
linyufengs   2014.09.04 15:32

通配符的读取在Proxy建立的时候完成,proxy做准备工作的时候,就已经能完成读取配置文件中通配符的信息, config = configuration.getRuntimeConfiguration().getActionConfig(namespace, actionName);
在运行期的时候完成配置文件的读取,然后在DefaultActionInvocation.init()的时候获取代理对象中信息的提取完成真正的action的建立,然后当执行这些真正的action,利用拦截器的机制,(反射机制),完成调用~

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!