使用Struts2动作 - Struts2教程
在Struts2中,会花大部分的时间用在用动作来处理工作。动作类包含业务逻辑,获取资源包,保存数据,验证,并选择应发回给用户的视图的结果页面。这是Struts2的核心,所以必须要了解动作的基本概念。
1. 动作 - Action
Struts 2动作不强迫你实现任何接口或扩展类,它只是需要你实现一个 execute()方法返回一个字符串来表示其应该返回的结果页面。
package com.yiibai.user.action;
public class LoginAction{
//business logic
public String execute() {
return "success";
}
}
在struts.xml中,配置使用Action类动作(action)标记和类属性。定义结果页面用结果的标签和动作名称返回给用户,可以用它来访问动作类的名称属性。
<package name="user" namespace="/User" extends="struts-default">
<action name="validateUser" class="com.yiibai.user.action.LoginAction">
<result name="success">pages/welcome.jsp</result>
</action>
<package>
现在,可以通过 .action 扩展名后缀访问动作。
http://localhost:8080/Struts2Example/User/validateUser.action
默认.action是可配置的,只需要设置“struts.action.extension”的值,以满足您的需要。
2. 可选动作接口
Struts 2带有一个可选的动作接口(com.opensymphony.xwork2.Action)。通过实现这个接口,它带来了一些方便和好处,看下面的源代码:
package com.opensymphony.xwork2;
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
这个接口是非常简单的,配有5常用常数值:success, error, none, input and logic。现在的动作类可以直接使用常量。
package com.yiibai.user.action;
import com.opensymphony.xwork2.Action;
public class LoginAction{
//business logic
public String execute() {
return SUCCESS;
}
}
不明白为什么很多Struts开发人员喜欢实现此动作接口,它更好地扩展了ActionSupport。
3. ActionSupport
Support 类,通常的做法是提供接口的默认实现。
ActionSupport (com.opensymphony.xwork2.ActionSupport), 一个非常强大和方便的类,它提供了几个重要接口的缺省实现:
public class ActionSupport implements Action, Validateable,
ValidationAware, TextProvider, LocaleProvider, Serializable {
...
}
ActionSupport 类提供一些功能:
1. 验证 – 声明一个validate()方法,并在里面实现验证代码。
- 文字本地化 – 使用gettext()方法来获得资源包的消息。
package com.yiibai.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
//business logic
public String execute() {
return "SUCCESS";
}
//simple validation
public void validate(){
if("".equals(getUsername())){
addFieldError("username", getText("username.required"));
}
if("".equals(getPassword())){
addFieldError("password", getText("password.required"));
}
}
}
在大多数情况下,应该扩展此类妥当,方便提供功能,除非你有理由不这样做。这也是一个很不错的学习类,以了解如何做一些重要的Struts2接口的实现。
4. 动作注释
Struts 2对注解有很好的支持,你可以摆脱XML文件,并使用@action在动作类上替换。
package com.yiibai.user.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import com.opensymphony.xwork2.ActionSupport;
@Namespace("/User")
@ResultPath(value="/")
public class ValidateUserAction extends ActionSupport{
@Action(value="Welcome", results={
@Result(name="success",location="pages/welcome_user.jsp")
})
public String execute() {
return SUCCESS;
}
}
总结
扩展ActionSupport类,它适合在大多数情况下。