Struts2 动态方法调用
Struts2一个Action内包含多个请求处理方法的处理(三种方式)
Struts1提供了DispatchAction,从而允许一个Action内包含多个请求处理方法。Struts2也提供了类似的功能。处理方式主要有以下三种方式:
1.1. 动态方法调用:
DMI:Dynamic Method Invocation 动态方法调用。
动态方法调用是指:表单元素的action不直接等于某个Action的名字,而是以如下形式来指定对应的动作名:
<form method="post" action="userOpt!login.action">
则用户的请求将提交到名为”userOpt”的Action实例,Action实例将调用名为”login”方法来处理请求。同时login方法的签名也是跟execute()一样,即为public String login() throws Exception。
注意:要使用动态方法调用,必须设置Struts2允许动态方法调用,通过设置struts.enable.DynamicMethodInvocation常量来完成,该常量属性的默认值是true。
Struts 2 动态方法调用
1.在jsp中如何得到Action的属性:
(1).${requestScope.tip}
(2).ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
vs.findValue("tip")
2.动态方法调用
动态方法调用是指,表单元素的action并不是直接等于某个Action的名字,而是以action='ActionName!methodName.action'来指定Form的属性.
Action里可以包含一个execute()方法和多个其它逻辑.
3.为action元素指定method属性
即是将一个Action处理类定义成多个逻辑Action,指定action的method属性,则可以让action类来调用不同的方法.
特点是只有一个action类,action类里有几个处理逻辑struts.xml里就包含着几个<action... />片断.也就是Action类的每个处理方法被映射成一个逻辑Action.
缺点是多个action里定义的方法绝大部分相同,这种定义是相当冗余的.
4.使用通配符
在配置<action .../>元素时,需要指定name,class,method属性都可支持通配符,这种使用通配符的方式是另一种形式的动态方法调用.
当我们使用通配符定义Action的name属性时,就相当于一个元素action定义了多个逻辑Action.
(1).<action name="*Action" class="lee.loginRegistAction" method="{1}">....</action>
只要URL是*Action.
action的模式,都可以能过该Action类处理.
但该method属性使用了一个表达式{0},该表达式的值就是name属性值中的第一个*的值.
(2).<action name="*Action" class="lee.{1}Action">....</action>
只要URL是*Action.action的模式,都能通过相应的ation类处理.
如:URL为registAction.action,则调用lee.registAction类的excute方法来处理