1.Struts2的配置文件
Struts2启动的时候加载了3个配置文件:struts.xml struts-default.xml struts-plugin.xml
(1).struts.xml和struts-default.xml用的是同一个DTD,且这两个都在classpath下面
(2).struts-default.xml很重要,涵盖了Struts2的所有基本用法
(3).前两者只有一份,struts-plugin.xml有很多份,有的在WEB-INF/classes,有的在lib/下面
2.packege
<package name="aa" namespace="/bb" extends="struts-default">
(1).namespace:命名空间
^1.命名空间的意义:程序员开发的时候用到<package>时,通过name来定位。
用户进入时,则是通过namespcae来定位<package>,使用户操作更方便
^2.如果命名空间不写,默认为"/"
(2).extends
Struts2中的包具有继承机制,而struts-default.xml中基本涵盖了所有用法,所以只要继承struts-default就可以使用Struts2中定义好的很多东西,很方便
其中最显著的一个方便点是,struts-default.xml中的定义好的结果集我们的包就可以直接用了,结果集有:
dispatcher,redirect,redirectAction,httpheader,stream,chain,xslt,plainText,celocity,freemarker
3.action:用来处理用户请求,并且返回数据
(1).action的写法有四种
^1.最普通写法:<action name="aa" method="bb" class="XXX"></action>
name:给客户用的,客户输入url通过name来查找对应的action
class:action既然是处理用户请求的,肯定有逻辑在里面,写逻辑就需要一个类,这个类就在class下
method:调用类中的哪个方法用这个控制
很多时候,我们一个action就是专门解决一个问题,其中并没有很多方法,每次写method麻烦,所以又有两种写法
^2.实现Action:<action name="aa" class="XXX"></action>
因为implements Action,所以自带了execute方法,所以不需要method
^3.基础ActionSupport:<action name="aa" class="XXX"></action>
因为继承了ActionSupport,所以只需要重写execute方法即可,所以不需要method
^2和^3都可以不用method,当我们不需要自定义method的时候该用什么好呢?
建议用^3,因为ActionSupport里自带了很多操作,如验证器,国际化等,很方便
^2和^3是省掉了method,因为name是要给客户查找用的,不能省,那么class可以省嘛?答案是可以的“”
^4:若连class属性都没有,Struts2会根据struts-default.xml中的<default-class-ref class="XXXX.ActionSupport">去查找
(2).总而言之,<action>的意义在于,根据用户输入的url中的内容查找对应的action标签,根据标签查找需要的class和method,运行找到的method。
但是运行完之后,一般method会有返回值,返回值可能需要跳转其他的action去处理其他的逻辑,或者直接跳到jsp页面展示新的东西,那么怎么处理这些返回值呢,就用到了下面的Result结果集
(3).请求几次action就会创建几次对象,所以action创建的是原型模式,也叫多例模式
4.Result:结果集
<result name="dis" type="dispatcher" >aa!bb.action</result>
(1).name属性
我们知道,action处理完逻辑之后可能会返回一些结果集,而且很多时候一个action会根据不同的逻辑判断返回不同的结果集,我们怎么知道谁是谁呢?result中的name属性可以帮助我们。name里的内容就是action返回的值,如果两个一样,就配对成功。
(2).type属性
既然根据name属性我们知道了对应action的哪一种返回值,一般不同返回值会有不同的后续操作。比如如果返回SUCCESS,跳转成功页面;如果返回ERROR,跳转失败页面;如果是一些自定义的可能还需要跳转其他action进行其他逻辑操作。因此,接下来怎么做,type属性可以帮助我们。type属性说明了我们应该如何操作这些action的返回值,是跳转,还是重定向,还是其他等等,而具体有哪些操作其实struts-default.xml也帮我们写好了:
dispatcher,redirect,redirectAction,httpheader,stream,chain,xslt,plainText,celocity,freemarker
(3).跳转的地方
aa!bb.action对应<action>标签里name为aa,method为bb的action
至此,一套基本的输入url,然后根据其中命名空间查找对应包,根据对应name查找action标签,然后根据action标签里的class和method找到对应的方法,执行完方法,根据result中的name和返回值的比较找到对应的result,然后根据type的知道该怎么处置操作这些result,并进行操作
5.通配符
<package name="pattern" namespace="/" extends="struts-default">
<action name="TeacherAction_*" method="{1}" class="TeacherAction">
</action>
</package>
第一个*对应{1},第二个*对应{2}
6.全局结果集
当很多action都返回同一个值跳到同一个页面,则将其设为全局结果集,放在package最上面
<global-results>
<result name="SUCCESS">index.jsp</result>
</global-results>