在实际应用中,每个action都要处理多个业务,所以每个Action都会包含多个处理业务逻辑的方法,针对不同的客户端请求,Action会调用不同的方法进行处理,就要使用动态方法调用。
方法一:
在使用动态方法调用时,jsp里面Form表单的action属性必须符合如下格式:
<s:form action="Action名字!方法名称">或者<s:form action="Action名字!方法名称.action">
在struts.xml文件中配置如下:
<action name="Action名称" class="包名.Action类名">
<result>视图UR</result>
</action>
这个方法就能让jsp动态访问Action中的不同方法。
方法二:
使用method属性
Action元素除了name,class属性以外,还有一个method属性,该属性用于指定要执行的Action方法,在struts.xml文件中的配置如下:
<action name="Action名字" class="包名.Action类名" method="Action类名中的方法的名称">
<result>视图UR</result>
</action>
因为为每一个action都指定了要处理的方法名称,所以在jsp中form表单action的名称可以直接写struts.xml文件配置的action的名称,格式如下:
<s:form action="action名字.action">或者<s:form action="Action名字">
这种方法对业务逻辑层的每一个方法都要在struts.xml文件设置其对应的action,这种方法虽然简单容易理解,但是为业务逻辑层每一个方法配置都一个action,会使得struts.xml文件过于庞大,如果业务逻辑层要处理的方法特别多时,不推荐使用该方法。
方法三:
使用通配符
为了解决struts.xml过于庞大的问题,struts2推出一种通配符解决这个问题。下面我以一段代码来说明:
<action name="user_*" class="com.test.action.userAction" method="{1}">
<result>/user_{1}.jsp</result>
</action>
几点说明如下:
(1)user_*:user_之后可以匹配任意字符,比如user_add。
(2)method="{1}":表示method属性值匹配的第一个“*”的内容,比如name="user_add",则method=“add”。
(3)user_{1}.jsp:这里的{1}与method属性值中的{1}表示的含义相同,都表示匹配第一“*”的内容,比如name="user_add",则返回的视图为user_add.jsp。
注意:这里的name属性值只有一个“*”,其实还可以有两个,三个或者多个,比如含有两个的name="*_*" ,此时们可以使用{1},{2}来表示每个“*”的内容。
使用通配符时的检索规则,在struts.xml中如果能找到name属性值与请求的Action名完全一致时,则匹配该action元素,而不会匹配使用通配符的配置。如果没有找到,才会匹配通配符。且按照配置文件的配置顺序依次匹配,最先符合的action元素将会被匹配。
另外,这里讲下默认的action配置元素default-action-ref,其作用是当用户找不到对应的action元素值时,系统将调用默认的Action来接受用户请求信息。其配置规则如下:
<default-action-ref name="user"/>
<action name="user" class="com.test.action.userAction" method="userAdd">
<result>/success.jsp</result>
</action>
在上述代码中使用了default-action-ref元素配置了一个默认的Action,该元素只包含一个name属性,属性名字为user,表面默认的Action为user所对应的Action类。在该文件中必须使用action元素对应名称为user的Action进行配置,例如上面的代码action name="user"配置,否则,默认的Action是不起作用的。