日期:2014-05-17  浏览次数:20653 次

struts2的映射文件的一个疑问,求解释
在struts2的配置文件struts.xml中,有些教材给出了如下的配置信息:
XML code

<action name="userAction" class="com.lyq.action.UserAction" method="upload">
<result name="upload">/a.jsp</result>
</action>

<action name="userAction" class="com.lyq.action.UserAction" method="add">
<result name="add">/b.jsp</result>
</action>

<action name="userAction" class="com.lyq.action.UserAction" method="update">
<result name="update">/c.jsp</result>
</action>






上面的配置信息只是个样例,随手写了下,主要说明的问题就是在配置action时,就可以将请求直接交给该action的类中的具体方法。


在此我有两点不理解的:
第一,这些action的name都是一样的,那么请求到来时,struts查找struts.xml中的映射信息时怎么知道该用哪个映射?
第二,假如一开始在请求时使用了动态Action(例如:<form action="userAction!update"> method="post"),那么在请求发出后,就应该不需要在配置文件中做出如上的配置了,因为根据请求中!后面的update应该会去自动找这个对应的方法。
问题是:动态Action和在配置中设置特定的方法这两种是配合使用的吗,还是说他们本来就是两种处理多重业务逻辑的方法。





------解决方案--------------------
struts是根据方法的返回值来返回相应的视图,这么写与你上面那么写的意思是一样的,不写method,struts会自己到action里面寻找对应的方法~~
1.你这么写就只能动态调用了,不使用动态调用还真不知道会不会找到
2.<action name="userAction" class="com.lyq.action.UserAction" >
<result name="upload">/a.jsp</result>
<result name="add">/b.jsp</result>
<result name="update">/c.jsp</result>
</action>

适情况、需求、爱好而论,实际项目中一个action不可能就一个方法的。
PS:官方不推荐使用感叹号进行动态调用
------解决方案--------------------
你这样写估计是不行的 ,
一种是吧method取掉 当你请求的时候告诉他调用哪个方法,
userAction!upload

另一种是吧action name="userAction"设置成不同的
------解决方案--------------------
为什么同一个action要这么写,LZ用通配符比较合适
------解决方案--------------------
上面采用相同actionname指定不同方法名的方法其实跟动态方法调用的意思差不多。
动态方法调用和在action中指定具体方法名的方式,在处理业务逻辑的时候两种都能够满足要求,无非就是配置方式的不同而已,至于混合使用,应该在实际中不要这么做,要么全指定方法名,要么全用动态调用,自己喜欢哪种,就可以在以后的开发中经常使用哪种