Struts2中可以通过三种方式实现Dynamic Method Invocation
①method属性
②页面中指定
③使用通配符
第一种:在struts.xml的<action/>中指定method属性
如果将<action/>中的method属性设置为method="abc"的话,具体执行过程如下
如果一个<s:form action="login">,那么就会生成LoginAction类的一个实例
接着就会由abc()方法来进行处理表单的请求,而不会自动的调用execute()方法了
而abc()与execute()的写法是相同的,如public String abc() throws Exception {}
如果没有method属性,Struts2就会自动调用LoginAction的execute()方法
很显然这里使用到了Java的反射机制,否则也不可能通过方法名来调用方法
这就是在Struts2中通过一个Action来实现多个业务逻辑的方式,它完全对应Struts1.X中的DispatchAction
另外如果Action中仅仅存在doAbc()方法,而不存在abc()方法的话
那么实际上Struts2仍会根据method="abc"去调用Action中的doAbc()方法
由于在Action中为方法命名时不允许使用关键字,所以Struts2为避免为method命名时而误用关键字
所以提供了这种可以调用doXxx()方法的机制。这种机制仅供了解,无需深究
第二种:在页面中指定调用Action类中的具体的方法
在前台页面中设定成<s:form action="login!hello.action">
在struts.xml中为<action name="login" class="com.jadyer.action.LoginAction">
这样当发送请求时,就会自动跳转到LoginAction中,然后执行里面的hello()方法
这种方式的作用与第一种设定method属性的方式,最终实现的效果都是一样的
第三种:使用通配符通过模糊匹配的方式调用Action的方法
符号有三种,分别为 * ** /
其中 * 代表零个或多个字符,不包括"/"根
而 ** 代表零到多个字符,并且包括根
最后的 / 是转义符。其中 * 用得最多
在struts.xml中设定为<action name="*User" class="...UserAction" method="{1}">
假设在前台页面中设定成<s:form action="addUser">
执行时若没有在struts.xml中找到名为addUser的<action/>的话,则会找到*User
这是一种模糊匹配,匹配成功后,流程则进入名为*User的<action/>中,即UserAction
其中method的{1}对应 * 号,即此时将由UserAction中的add()方法执行addUser的请求
若写成<result>/{1}UserSuc.jsp</result>,那么执行add()成功后将转到addUserSuc.jsp中
通常项目经理会指定方法命名规则,较常用的两种方式为addUser和user_add
<action name="*_*" class="...{1}Action" method="{2}"><result>/{1}_{2}Suc.jsp</result></action>
另外可以使用{0}代表完整的*_*,即<result/>中可以用/{0}Suc.jsp代替/{1}_{2}Suc.jsp
这时前台页面中就需要写成类似于<a href="User_add.action">添加用户</a>的样式
注意User_add.action里的User首字母必须大写,因为它将来需要匹配UserAction类
其中{1}代表前面的星号,而{2}代表后面的星号
通常前面的星号代表数据表,后面的星号代表方法,当然具体由公司决定
也就是说,约定好项目中文件的命名规范后,只写一个Action就能匹配N个表的N个方法