现在项目使用struts2的注解进行action的加载。比如TemplateAction类
@ParentPackage("default")//default继承自struts-default
@Action(name = "template")
@Results( { @Result(name = "doQuery", type = NullResult.class, value = "/jsp/depms/temp/temp_list.jsp", params = {}),
@Result(name = "doQueryCorp", type = NullResult.class, value = "/jsp/depms/temp/temp_list_corp.jsp", params = {}),
@Result(name = "doAdd", type = NullResult.class, value = "/jsp/depms/temp/temp_add.jsp", params = {}),
@Result(name = "doAddCorp", type = NullResult.class, value = "/jsp/depms/temp/temp_add_corp.jsp", params = {}),
@Result(name = "preEdit", type = NullResult.class, value = "/jsp/depms/temp/temp_edit.jsp", params = {}),
@Result(name = "doEditBase", type = NullResult.class, value = "/jsp/depms/temp/temp_edit_base.jsp", params = {}),
@Result(name = "doView", type = NullResult.class, value = "/jsp/depms/temp/temp_view.jsp", params = {}) })
在控制输出了
class:class com.kehaoinfo.khsafe.depms.template.action.TemplateAction parent:null current:com.kehaoinfo.khsafe.depms.template.action如果struts加载成功的情况下在调试模式下查看Dispatcher.configurationManager.configuration.runtimeConfiguration(此类是一个接口)查看内容如下
/dailyCheck //这个为其他action加载的
/templateChapter //这个为其他action加载的
/template
/plan //这个为其他action加载的
前台页面访问template!doQuery.action就可以。struts加载失败 查看内容为
/khsafe/depms/template/action/accImage//这个为其他action加载的
/khsafe/depms/template/action/template
/khsafe/depms/template/action/templateChapter//这个为其他action加载的
前台页面访问进需要加上/khsafe/depms/template/action/template!doQuery.action 才能进行访问。原先以为这个是命名空间的问题,于是乎给templateAction加上了一个
@NameSpace(value="") //指定使用默认命名空间。
还是有问题,于是我在试了一下添加一个命名空间
@NameSpace(value="/test") //指定命名空间需要加上test
原本以为问题能够解决,由于问题随机的(有时候加载成功)。重启了有N次之后。未加载的情况还是出现了。请高手帮办给个思路,正在看struts2.1.6的源代码。头疼先来这上边要个思路

解决方案 »

  1.   

    原来是命名空间的问题。最后还是没知道struts2是怎么加载的。下边是struts2加载的源代码
     org.apache.struts2.config.Action actionAnn = 
                (org.apache.struts2.config.Action) cls.getAnnotation(org.apache.struts2.config.Action.class);
            if (actionAnn != null) { //这里判断是否为空,出现命名空间不正确的原因就是actionAnn为空,但是为什么为空不是很了解。
                actionName = actionAnn.name();
                if (actionAnn.namespace().equals(org.apache.struts2.config.Action.DEFAULT_NAMESPACE)) {
                    actionNamespace = "";
                } else {
                    actionNamespace = actionAnn.namespace();
                }
            } else {
                for (String pkg : pkgs) {
                    if (name.startsWith(pkg)) {
                        if (LOG.isDebugEnabled()) {
                            LOG.debug("ClasspathPackageProvider: Processing class "+name);
                        }
                        name = name.substring(pkg.length() + 1);
        
                        actionNamespace = "";
                        actionName = name;
                        int pos = name.lastIndexOf('.');
                        if (pos > -1) {
                            actionNamespace = "/" + name.substring(0, pos).replace('.','/');
                            actionName = name.substring(pos+1);
                        }
                        break;
                    }
                }
    最后的解决方法在@Action(name = "template")上边添加命名空间为默认
    @Namespace(value="")
    这样访问就正常了。结贴。