Struts2的动态方法调用

完整版见https://jadyer.github.io/




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
通常项目经理会指定方法命名规则,较常用的两种方式为addUseruser_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个方法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值