Struts2学习笔记(4)-ActionSupport类及Action接口详解

来源:互联网 发布:label mx标签打印软件 编辑:程序博客网 时间:2024/06/06 01:01

一、ActionSupport类

   com.opensymphony.xwork2.ActionSupport类时默认的动作类。   只要某个动作声明没有给出一个动作类,Struts就会替它创建一个这个类的实例。   在编写动作类时也需要对这个类进行扩展。   该类提供了许多默认方法。这些方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。。   如果让开发者的Action类继承该ActionSupport类,就会大大简化Action类的开发。

以下是ActionSupport类的源码:

package com.opensymphony.xwork2;import com.opensymphony.xwork2.inject.Container;import com.opensymphony.xwork2.inject.Inject;import com.opensymphony.xwork2.util.ValueStack;import com.opensymphony.xwork2.util.logging.Logger;import com.opensymphony.xwork2.util.logging.LoggerFactory;import java.io.Serializable;import java.util.Arrays;import java.util.Collection;import java.util.List;import java.util.Locale;import java.util.Map;import java.util.ResourceBundle;public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {    protected static Logger LOG = LoggerFactory.getLogger(ActionSupport.class);    private final ValidationAwareSupport validationAware = new ValidationAwareSupport();    private transient TextProvider textProvider;    private Container container;    public void setActionErrors(Collection<String> errorMessages) {        validationAware.setActionErrors(errorMessages);    }    public Collection<String> getActionErrors() {        return validationAware.getActionErrors();    }    public void setActionMessages(Collection<String> messages) {        validationAware.setActionMessages(messages);    }    public Collection<String> getActionMessages() {        return validationAware.getActionMessages();    }    /**     * @deprecated Use {@link #getActionErrors()}.     */    @Deprecated    public Collection<String> getErrorMessages() {        return getActionErrors();    }    /**     * @deprecated Use {@link #getFieldErrors()}.     */    @Deprecated    public Map<String, List<String>> getErrors() {        return getFieldErrors();    }    /*设置表单域校验错误信息*/    public void setFieldErrors(Map<String, List<String>> errorMap) {        validationAware.setFieldErrors(errorMap);    }    /*返回表单域错误校验信息*/    public Map<String, List<String>> getFieldErrors() {        return validationAware.getFieldErrors();    }    /*控制local的想关信息*/    public Locale getLocale() {        ActionContext ctx = ActionContext.getContext();        if (ctx != null) {            return ctx.getLocale();        } else {            if (LOG.isDebugEnabled()) {            LOG.debug("Action context not initialized");            }            return null;        }    }    public boolean hasKey(String key) {        return getTextProvider().hasKey(key);    }    public String getText(String aTextName) {        return getTextProvider().getText(aTextName);    }    /*返回国际化信息的方法*/    public String getText(String aTextName, String defaultValue) {        return getTextProvider().getText(aTextName, defaultValue);    }    public String getText(String aTextName, String defaultValue, String obj) {        return getTextProvider().getText(aTextName, defaultValue, obj);    }    public String getText(String aTextName, List<?> args) {        return getTextProvider().getText(aTextName, args);    }    public String getText(String key, String[] args) {        return getTextProvider().getText(key, args);    }    public String getText(String aTextName, String defaultValue, List<?> args) {        return getTextProvider().getText(aTextName, defaultValue, args);    }    public String getText(String key, String defaultValue, String[] args) {        return getTextProvider().getText(key, defaultValue, args);    }    public String getText(String key, String defaultValue, List<?> args, ValueStack stack) {        return getTextProvider().getText(key, defaultValue, args, stack);    }    public String getText(String key, String defaultValue, String[] args, ValueStack stack) {        return getTextProvider().getText(key, defaultValue, args, stack);    }    /**     * Dedicated method to support I10N and conversion errors     *     * @param key message which contains formatting string     * @param expr that should be formatted     * @return formatted expr with format specified by key     */    public String getFormatted(String key, String expr) {        Map<String, Object> conversionErrors = ActionContext.getContext().getConversionErrors();        if (conversionErrors.containsKey(expr)) {            String[] vals = (String[]) conversionErrors.get(expr);            return vals[0];        } else {            final ValueStack valueStack = ActionContext.getContext().getValueStack();            final Object val = valueStack.findValue(expr);            return getText(key, Arrays.asList(val));        }    }    /*用于访问国际化资源包的方法*/    public ResourceBundle getTexts() {        return getTextProvider().getTexts();    }    public ResourceBundle getTexts(String aBundleName) {        return getTextProvider().getTexts(aBundleName);    }    /*添加错误信息*/    public void addActionError(String anErrorMessage) {        validationAware.addActionError(anErrorMessage);    }    public void addActionMessage(String aMessage) {        validationAware.addActionMessage(aMessage);    }    /*添加校验字段的错误信息*/    public void addFieldError(String fieldName, String errorMessage) {        validationAware.addFieldError(fieldName, errorMessage);    }    /*默认input方法,访问INPUT字符串*/    public String input() throws Exception {        return INPUT;    }    /*默认处理用户请求的execute方法,直接返回SUCCESS字符串*/    public String execute() throws Exception {        return SUCCESS;    }    public boolean hasActionErrors() {        return validationAware.hasActionErrors();    }    public boolean hasActionMessages() {        return validationAware.hasActionMessages();    }    public boolean hasErrors() {        return validationAware.hasErrors();    }    public boolean hasFieldErrors() {        return validationAware.hasFieldErrors();    }    public void clearFieldErrors() {        validationAware.clearFieldErrors();    }    public void clearActionErrors() {        validationAware.clearActionErrors();    }    public void clearMessages() {        validationAware.clearMessages();    }    public void clearErrors() {        validationAware.clearErrors();    }    /*清空错误信息的方法*/    public void clearErrorsAndMessages() {        validationAware.clearErrorsAndMessages();    }    /*空校验方法*/    public void validate() {    }    @Override    public Object clone() throws CloneNotSupportedException {        return super.clone();    }    public void pause(String result) {    }    private TextProvider getTextProvider() {        if (textProvider == null) {            TextProviderFactory tpf = new TextProviderFactory();            if (container != null) {                container.inject(tpf);            }            textProvider = tpf.createInstance(getClass(), this);        }        return textProvider;    }    @Inject    public void setContainer(Container container) {        this.container = container;    }}
 ActionSupport类中除execute方法以外,还有许多其它方法提供给程序员使用。eg:如果想用自己的代码对用户输入进行验证,你需要覆盖validate方法;如果想从属性文件里提取本地化的消息,可以选用getText方法的众多重载形式中的一种。

二、Action接口

为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范。下面是标准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";     /*定义处理用户请求的execute方法*/    public String execute() throws Exception;}

该接口只定义了一个用于处理用户请求的execute方法和5个静态字段。execute方法必须返回一个字符串。5个静态字段的作用是统一该方法的返回值;

补充:

 如果想自己动手实现Action接口,而不是对ActionSupport类进行扩展,就必须自己提供一个execute方法的实现; 一般来说,对ActionSupport类进行扩展要比自行实现Action接口简单的多。 也即,对ActionSupport类进行扩展有助于编写动作类。