当structs.xml解析到Action的时候,默认执行的是此action的execute()方法,但是实际开发中,我们的action中含有很多方法,比如说增删改查的方法,那么structs.xml怎样辨别不同的方法,然后给我们指向正确的方法呢?下面主要介绍三种方法,最后的方法是推荐的方法,前两种作为八卦大家看看即可。
方法一,通过method属性来访问
通过指定methord方法来实现,比如下面
浏览器中我们要访问的网址是:http://localhost:8090/Structs2724/user/useradd
对应的structs.xml的配置行如下
<action name="useradd" class="DMI.UserAddAction" method="Add" > <result name="success"> /adduser.jsp </result>
对应的action.java文件如下
1 package DMI; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class UserAddAction extends ActionSupport { 6 public String Add() { 7 return SUCCESS; 8 } 9 }
structs.xml解析到user的namespace后,发现有一个叫做useradd的action,然后继续解析这个action的属性,发现了一个叫method的属性,哦,原来这个action对应的是这个method啊,然后呢,就开始执行这个Add这个方法,然后返回"success"这样的字符串,这个时候,action从自己的result找对应的result,然后返回给浏览器adduser.jsp这个文件。这样就实现了多调用
方法二,采用!来实现(不推荐使用)
仔细看方法一,发现,如果这个action有很多方法,那么,我们得写很多action,所以有没有一种方法可以匹配所有的action的方法呢?那就用!来实现吧
实现的配置是:在structs.xml文件中开启一个值
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
然后对应的action可以设置为如下
<action name="user" class="DMI.UserAddAction" > <result > /adduser.jsp </result> </action>
然后可以通过下面的网址来访问:
http://localhost:8090/Structs2724/user/user!add
方法三,采用通配符来匹配,最常用,强烈推荐
这个是对方法一的进一步扩充,需要关闭structs.xml的动态匹配,也就是将方法二开启的那个开关给关了,具体的如下所示
<action name="*" class="DMI.UserAddAction" method="{1}"> <result> /{1}.jsp </result> </action>
对应的action如下
public String Add() { return SUCCESS; } public String Addabc(){ return SUCCESS; } public String Add3(){ return SUCCESS; }