Struts2的Action控制类的实现
Struts2的应用开发中,Action作为框架的核心类,实现对用户请求的处理,Action类被称为业务逻辑控制器。一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。
实现Action控制类共有3种方式:
(1)POJO的实现
不继承任何父类,也不实现任何借口,仅仅是一个POJO类。只要具有一部分getter/setter方法的类就可以称作POJO。一般在这个POJO类中,要有一个公共的无参的构造方法(采用默认的构造方法就可以)和一个execute()方法。execute()方法是Action类的默认请求处理方法。
execute()方法的要求如下:
1、方法的权限修饰符为public
2、返回一个字符串,就是指示的下一个页面的Result
3、方法没有参数
(2)实现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";
public String execute() throws Exception;
}
实现Action接口后只需要实现execute()方法即可
(3)继承ActionSupport类
继承ActionSupport类重写execute()方法,ActionSupport实现了Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable
等接口。ActionSupport类里面包含很多方法,具体看源码。
在实际开发中,一般会继承ActionSupport类,同时,一个action类一般也会包含很多业务逻辑处理方法,具体需要调用某个action类的哪个方法,可以在配置Action的时候再method属性指定。
Action访问Servlet API
在Struts2中,Action并没有直接和Servlet API进行耦合,即,在Struts2的Action中不能直接访问Servlet API。但是在实际应用中,完全不用Servlet是不可能的。在实际业务逻辑中,经常要访问Servlet中的对象,如session、request和application等。在Struts2中,访问Servlet API有3种方法。
(1)通过ActionContext类访问
ActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象,包括parameters、request、session、application等。
ActionContext类访问Servlet API常用方法:
1、获得当前线程的ActionContext对象:
static ActionContext getContext();
2、一个ActionContext对象就相当于Servlet中的HttpServletRequest对象,即,ActionContext request = ActionContext.getContext();
3、根据第2点,如何向ActionContext对象中的属性赋值呢?也就是模拟Servlet API中的HttpServletRequest的setAttribute()方法:
void put(String key, Object value);
4、根据第2、3点,模拟Servlet API中的HttpServletRequest的getAttribute()方法:
Object get(String key);
5、模拟获取Servlet API中的HttpServletRequest,获取request里面参数的Map:
Map<String, Object> getParameters();
6、获取session和application,这两个对象都是Map对象:
Map<String, Object> getSession();
Map<String, Object> getApplication();
7、设置一个session的值和设置一个application的值:
void setSession(Map<String, Object>);
void setApplication(Map<String, Object>);
(2)通过特定接口访问
上面通过ActionContext类访问Servlet API,但并没有直接操控Servlet实例,而只是通过ActionContext实例操作Servlet 实例。为了可以操作Servlet实例,Struts2提供了4个借口:
1、ServletRequestAware
:直接访问HttpServletRequest实例。
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub
}
2、ServletResponseAware
:直接访问HttpServletResponse实例。
@Override
public void setServletResponse(HttpServletResponse arg0) {
// TODO Auto-generated method stub
}
3、SessionAware
:直接访问HttpSession实例。
@Override
public void setSession(Map<String, Object> arg0) {
// TODO Auto-generated method stub
}
4、SevletContextAware
:直接访问ServletContext实例。
@Override
public void setServletContext(ServletContext arg0) {
// TODO Auto-generated method stub
}
使用这四个接口的时候,先在方法里面定义相应的变量,然后在这些set方法中做(比如)this.request = request
(3)通过ServletActionContext访问
参照图片