Package:
1.用意:用来管理action。
<struts>
<package name="helloworld" namespace="/" extends="struts-default">
<action name="helloWorldAction" class="com.itheima09.struts2.action.HelloWorldAction">
<result name="index">index.jsp</result>
</action>
</package>
</struts>
2.name属性:为包的名字,是唯一的。
3.namespace:为命名空间,是针对访问时的url的。
当namespace="/hello"时,访问的时候需要访问 localhost:8080/项目名/hello/helloWorldAction.action,才能执行action中的execute方法。
而如果浏览器提交一个url为 localhost:8080/项目名/helloWorldAction.action,则url直接从项目到根目录查找,所以找不到。
而如果浏览器提交的是 localhost:8080/项目名/hello/a/helloWorldAction.action,那么会先找hello/a下的action,如果找不到,则查找上一层hello中的action,再找不到则再找上一层,直到找到,如果最上层也找不到,则报错。
当namespace="/"时,上述的命名空间针对的是: localhost:8080/项目名/helloWorldAction.action,只要命名空间后面加一层,最后跳转到相应的jsp的时候也会加上相应的路径去查找,如果找不到则页面会报404错误。
比如:
当namespace="/"时,会直接去WebRoot下查找result标签里面写的路径。
当namespace=“/hello”时,会去WebRoot/hello下查找result标签里面写的路径。
4.extends:
(1)在tomcat启动的时候,不仅加载了struts.xml文件,还加载了struts-default.xml文件而这个文件在classpath下。
该xml文件在struts2-core-2.3.1.2.jar这个包中,在struts-default.xml文件中有如下配置:
<package name="struts-default" abstract="true">
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
<interceptors>
...
</interceptors>
<default-interceptor-ref name="defaultStack"/>
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
</package>
可以看出,在包中继承了name="struts-default"包下的所有内容,而该包中默认的class为com.opensymphony.xwork2.ActionSupport,所以当包中不写class属性时,会默认跳转到ActionSupport类中执行该类中的execute方法,并且返回一个"success"字符串.
注意:
在action标签中,默认的执行方法就是execute()。
<package name="struts-default">是支持struts2底层运行的最核心的包。
5.Result:
代表一种结果集,type为结果集类型。
name属性的值和action中某一个方法的返回值一致(method属性所指定的那个方法,默认为execute方法)。name属性也可以不写,默认为"success"。
type属性不写,则默认和struts-default中的结果集中的default="true"的结果集保持一致,为dispatcher,转发。并且result标签中的内容就是要转发到的页面。