一. Action的作用和意义
对于Struts2框架来说,Action作为其业务控制器,是应用的核心.开发者需要完成的是Action类的编写和配置.
二. Action的分类和配置
分类:
1. 最基本的Action类
2.继承自框架提供的类或接口的Action类
1) 继承自Action接口
2)继承自ActionSupport类
3.包含多个控制器方法的Action类
1)通过uri来指定具体执行的方法
2)通过配置文件指定执行的方法
3)使用通配符
4.默认的Action类
================================================================
1. 最基本的Action类
编写最基本的Action类需关注2部分内容编写: 一.属性及其对应的get和set方法; 二.execute方法的编写
一.属性及其对应的get和set方法
哪些内容应作为属性呢? 其一是用于封装请求参数(直白点就是属性对应form表单中各表单域),其二是用于输出结果(即在结果页面中显示的内容也可以通过属性进行传递,当然有些人不习惯这样做也可以通过其它方式实现.)
二.execute()方法的编写需要注意哪些?
1)方法签名:public String execute(){}
1)方法的返回值:必须对应有效的<result>标签的name属性值,在方法中以String类型返回
2)方法体的编写:
方法体中如何访问Servlet API?
前置条件:Struts2框架为了进一步解耦,Action类已经成为一个普通的java类,因此在Action中无法直接调用Servlet API,Struts2框架提供了自己的方式来间接访问Servlet API,关键类ActionContext
具体应用:
ActionContext context = ActionContext.getContext();
//模拟:request.setAttribute("attributeName","value");
Map request =(Map)context.get("request");
request.put("attributeName","value");
//模拟:session.setAttribute("attributeName","value");
Map session=context.getSession();
session.put("attributeName","value");
//模拟:application.setAttribute("attributeName","value");
Map application=context.getApplication();
application.put("attributeName","value");
在struts.xml文件中配置Action类
属性 | 是否必需 | 说明 |
name | 是 | action的名字,用于匹配请求URI |
class | 否 | Action实现类的完整类名 |
method | 否 | 执行Action时调用的方法 |
converter | 否 | 应用于action的类型转换器的完整类名 |
属性 | 是否必需 | 说明 |
name | 否 | 指定result的逻辑名 |
type | 否 | 指定result的类型,不同类型的result代表了不同类型结果输出 |
================================================================
2.继承自框架提供的类或接口的Action类
1) 继承自Action接口
Action接口都定义了什么?
public interface Action{
public static String SUCCESS ="success";
public static String NONE="none";
public static String ERROR="error";
public static String INPUT="input";
public static String LOGIN="login";
public String execute()throws Exception;
}
编写的Action类继承Action接口的优势?
(1)接口中定义了5个常量,用于execute方法的返回值,可以起到规范代码的作用
(2)接口中预先定义好了execute方法,防止编写时方法签名出错.
2)继承自ActionSupport类
ActionSupport类实现了Action接口和Validatable等接口,因此继承该类与继承Action接口相比功能更加强大,而且编码更加简单.该类是Struts2默认的Action处理类,即配置文件<action>没有指定class属性时,默认值为ActionSupport类
public class ActionSupport implementsAction, LocaleProvider, TextProvider, Validateable, ValidationAware, Serializable
{
//添加错误信息
public void addActionError(String anErrorMessage) {}
//添加一般信息
public void addActionMessage(String aMessage)
//添加字段校验失败的错误信息
public void addFieldError(String fieldName, String errorMessage)
//清除Action的错误信息
public void clearActionErrors()
//清除所有的错误信息
public void clearErrors()
//清除所有的错误信息和普通文本信息
public void clearErrorsAndMessages()
//清除字段校验错误信息
public void clearFieldErrors()
//清除文本信息
public void clearMessages()
//方法的实现,该方法仅返回"success",除此之外什么都没做
public String execute()
//获取提供的Locale对象
public Locale getLocale()
//用于在实现类中(通常是在action中)访问国际化资源包
public ResourceBundle getTexts()
//通过名字返回国际化资源包
public ResourceBundle getTexts(String aBundleName)
//包含空的输入校验方法
public void validate()
//默认的input方法,直接返回INPUT
public String input()
//检查信息是否存在
public boolean hasActionErrors()
public boolean hasActionMessages()
public boolean hasErrors()
public boolean hasFieldErrors()
public boolean hasKey(String key)
//获取信息
public Collection<String> getActionErrors()
public Collection<String> getActionMessages()
public Map<String,List<String>> getFieldErrors()
// 过时的方法,替代方法 getActionErrors().
public Collection<String> getErrorMessages()
//过时的方法,替代方法 getFieldErrors().
public Map<String,List<String>> getErrors()
//设置信息
public void setActionErrors(Collection<String> errorMessages)
public void setActionMessages(Collection<String> messages)
public void setFieldErrors(Map<String,List<String>> errorMap)
//返回国际化信息的方法
public String getText(String aTextName)
public String getText(String aTextName, List<Object> args)
public String getText(String aTextName, String defaultValue)
public String getText(String key, String[] args)
public String getText(String aTextName, String defaultValue, List<Object> args)
public String getText(String key, String defaultValue, List<Object> args, ValueStack stack)
public String getText(String aTextName, String defaultValue, String obj)
public String getText(String key, String defaultValue, String[] args)
public String getText(String key, String defaultValue, String[] args, ValueStack stack)
public void pause(String result)
public Object clone()
public String doDefault()
}