<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>struts.action,demo.actions2</param-value>
</init-param>
</filter>
//说明1
Struts2扫描到Action后,从actionPackages指定的包开始,子包名会成为这个Action的namespace,而Action的name则由这个Action的类名决定。
action名字的规则是这样的:将action name从任何“Action”后缀前面截取掉,如果action name含有“/”的话,那么将最后一个“/”后面的第一个字母变为小写。
举例明:
如果我们的actionPackages参数是struts.action,我们的Action类是struts.action.manager.UsersAction, 那么我们可以通过下面的url来访问这个类:http://localhost:8080/Struts2CM/manager/users.action . 也就是子包(subpackage)将成为namespace,而action类名将成为action name。如果类名有一个“Action”后缀,那么它将被去掉。 //说明2 Controller从actionPackages参数所指向的包struts.action,demo.actions2这两个包中去寻找action,具体的流程是这样的: 1.系统首先通过web.xml文件装载FilterDispatcher类,它要有actionPackages参数 2.FilterDispatcher会初始化一个Dispatcher,并传递actionPackages的值 3.Dispatcher会初始化一个ClasspathConfigurationProvider对象,用它来存放一个或多个Configuration Providers 4.Dispatcher给ConfigurationManager对象增加一个ClasspathConfigurationProvider来处理actionPackages参数 5.Someone会调用ClasspathConfigurationProvider的loadpackages方法 6.Loadpackages会首先利用ResolverUtil从所列package(就是actionPackages参数的值)中找到所有实现了Action接口和名字带有Action后缀的类,然后这些类会集中放入一个Set集合中,然后这个Set中的每个类都会被传递给processActionClass方法 7.processActionClass首先确定命名空间,然后捕捉任何ParentPackage和Results类型的Annotation,接着创建一个ActionConfig,设置action name,package name以及results。 |