一、Action的说明:
Struts2的核心功能就是action,对于开发者,使用Struct2框架的主要工作就是编写Action类来实现业务。action类可以不用继承任何父类和实现任何接口,但是在开发中通过实现com.opensymphony.xwork2.Action接口(下文中以Action来替代)或者继承com.opensymphony.xwork2.ActionSupport(下文中以ActionSupport来替代),可以简化action的开发。
对于Action,有5个很重要的字符串常量(一般性约定的视图)和一个抽象方法需要说明:
public static final String SUCCESS = "success"; // 数据处理成功 (成功页面)
public static final String NONE = "none"; //页面不跳转 return null; 效果一样,常用于ajax请求时
public static final String ERROR = "error"; //数据处理发送错误 (错误页面)
public static final String INPUT = "input"; //用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = "login"; //主要权限认证不通过 (登陆页面)
public String execute() throws Exception; //action如果不指定method的属性值,默认将执行execute方法
在实际开发中,很少直接实现Action接口,一般都是通过继承ActionSupport类,来极大地简化开发。ActionSupport已经帮我们完成了一些常用的功能,如:输入验证、错误信息存取以及国际化等。继承ActionSupport,即可继承这些功能。
二、Action的配置:
对于开发好的action,需要在struts.xml文件中进行配置,告诉Struts2框架该action负责处理哪一个(些)的URL请求。
属性 | 是否必要 | 说明 |
name | 是 | action的名字,用于匹配URL请求 |
class | 否 | Action实现类的完整类名 |
method | 否 | 执行action时调用的方法 |
converter | 否 | 应用于action的类型转换器的完整类名 |
/index.jsp
1、name属性:
name属性是必须的,name属性的值默认是不允许出现斜杠(/)的,如果需要name中使用斜杠,就需要在struts.xml文件中通过指定
2、method属性:
如果不指定method属性值,在执行action时,默认是调用execute()方法。如果指定了相应action的method的属性值,将执行指定method的方法。对于action的method的定义,需要遵循一定的规则(和Action接口中的execute()方法格式一样):
(1)方法全选必须是public
(2)方法的返回值必须是String类型
(3)方法签名必须为空
3、class属性:
class属性的属性值为action类完整类名,如果省略,默认的class的属性值将是ActionSupport的完整类名。当然这个class的属性值基本上都会填写开发人员编写的action类,否则就没有必要编写action类了。
三、Action的动态方法调用:
默认情况下,开发人员编写的action类中的方法都需要定义一个对应的action(一般是方法名就是action的name属性的属性值),若是开发人员编写的action方法很多,那么在struts.xml文件中定义相应的action,那么应该算上苦力活了。如:
public class UserAction extends ActionSupport{
public String login() {
//....
}
public String regist(){
//....
}
public String logout(){
//....
}
//....
}
相应的在struts.xml文件中,需要声明action:
可以使用
Action的动态方法调用来简化action的配置。其中有两种方式实现动态方法调用:
(1)使用感叹号(!)来标识要调用的方法名,其语法格式如下:
actionName!methodName.action
在struts.xml文件中的配置方式如下:
当请求user!login.action时,将调用UserBean的login()方法,这样就能简化开发人员编写的action的配置。
(2)使用通配符(*):
当请求的是user_login,这时就会调用UserAction类中的login()方法。上面的代码中,其中的第一个通配符代表Action类的User,第二个通配符代表method的方法名。使用通配符时,需要遵循统一的命名规范。通配符可以定义多个,不过一般定义最好是两个以内,以便可读性。
一个通配符的情况也很常见(更便于阅读和修改struts.xml文件):
/.../{1}.jsp
四、默认的action:
如果请求一个不存在的action,那么结果将是HTTP 404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行,一般配置于默认空间中,因为在相应的命名空间中没有action匹配,将会在默认空间中匹配,默认空间中没有action匹配,才调用默认空间的默认action。
/.../{1}.jsp