在读取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呢?****
我自己找到了答案了~自己回复~
通配符的读取在Proxy建立的时候完成,proxy做准备工作的时候,就已经能完成读取配置文件中通配符的信息, config = configuration.getRuntimeConfiguration().getActionConfig(namespace, actionName);
在运行期的时候完成配置文件的读取,然后在DefaultActionInvocation.init()的时候获取代理对象中信息的提取完成真正的action的建立,然后当执行这些真正的action,利用拦截器的机制,(反射机制),完成调用~