在说Action类之前先引入一个小action的概念,大家都知道struts2的默认请求格式是以 .action结尾或者不加(默认
常量配置在org.apache.struts2包下的default.properties文件中)。
那么我们就可以理解为一个action代表一个struts2的请求,是应用程序可以完成的一个操作。
Action类:普通的java类,可以有属性和方法,但必须遵守下面规则:
能够处理struts2请求的类
1.属性命名方法与JavaBeans相同2.必须有一个无参的构造器(方便通过反射创建实例)
3.至少有一个Action执行的调用的方法
4.同一个Action可以包含多个Action方法
5.struts为每一个http请求都创建一个新的请求,Action不是单例,线程安全
那么如何来配置一个action?
要在struts.xml文件中配置 如:
<action name="" class="" method="">
<result name=""></result>
</action>
name是请求的url也就是action,class是所对应的Action类,method是请求完要执行的方法;
result 是 action 节点的子节点,代表 action 方法执行后, 可能去的一个目的地,
一个 action 节点可以配置多个 result 子节点.
result 的 name 属性值对应着 action 方法可能有的一个返回值.
接下来说说 Action是如何访问web资源的:
1.什么是web资源?HttpServletRequest、HttpSession、ServletContext 等原生的servlet Api
2.为什么访问?
B/S应用中必定要访问web资源,例如:对象读写、获取path
3.怎么访问?
1)和servlet API解耦的方式:只能访问有限的Servlet API对象,只能访问有限的方法(读取请求参数)> 使用ActionContext;
> 实现XxxAware接口;
选用建议:若一个Action中有多个action方法都要使用Map或Parameters 就用Aware接口方式
session实际上是SessionMap对象,强转后调用invalidate方法可使session失效
2)和servlet Api耦合的方法:可以访问更多的Servlet API对象,用更多的原生方法
> 使用ServletActionContext;
> 实现ServletAxxAware接口;
其实解耦和耦合方式的实现很类似,在这里就只列出解耦的代码:
package com.orange.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
/**
* @author zx
* 解耦方式: 使用ActionContext获取web资源
*/
public class TestActionContextAction {
public String execute() {
/**
* 1.通过工厂模式获得ActionContext
* ActionContext是Action的上下文对象,可以获取当前Action的一切信息
*
* 2.获取application Map
*
* 3.获取session Map
*
* 4.获取参数paramsMap
* 注意:
* 1.getParameters()方法返回的Map类型是<String,Object>不是<String,String[]>
* 2.得到的map对象只能读取数据,不能写入数据
*
* 5.获取request Map
* request map与之前有点不一样,ActionContext中并没有封装这个方法,
* 需要调用get();方法然后强转就可以了
*
*/
ActionContext context = ActionContext.getContext();
Map<String, Object> applicationMap = context.getApplication();
applicationMap.put("applicationKey", "applicationValue");
Object date = applicationMap.get("date");
System.out.println(date.toString());
Map<String,Object> sessionMap = context.getSession();
sessionMap.put("sessionKey", "sessionValue");
Map<String,Object> paramsMap = context.getParameters();
paramsMap = context.getParameters();
String name = ((String[])paramsMap.get("name"))[0];
System.out.println("name="+name);
@SuppressWarnings("unchecked")
Map<String,Object> requestMap = (Map<String, Object>) context.get("request");
requestMap.put("requestKey", "requestValue");
return "success";
}
}
package com.orange.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
/**
*
* @author zx
*解耦方式: 实现XxxAware接口接口获取web资源
*
*/
public class TestAwareAction implements ApplicationAware,SessionAware,
RequestAware,ParameterAware{
private Map<String,Object> applicationMap, sessionMap,requestMap;
private Map<String, String[]> parametersMap;
public String execute(){
System.out.println(applicationMap);
System.out.println(sessionMap);
System.out.println(requestMap);
System.out.println(parametersMap);
return "success";
}
//注意:此方式得到parameter Map是<String, String[]>类型的
@Override
public void setParameters(Map<String, String[]> map) {
parametersMap = map;
}
@Override
public void setRequest(Map<String, Object> map) {
requestMap = map;
}
@Override
public void setSession(Map<String, Object> map) {
sessionMap = map;
}
@Override
public void setApplication(Map<String, Object> map) {
applicationMap = map;
}
}
至于耦合的方式:
1. ServletActionContext 获取相应的ServletContext、HttpServletRequest、HttpServletResponse对象
HttpSession对象可以由HttpServletRequest对象通过getSession()方法获取;
2. 实现ServletAxxAware接口和之前解耦方式就更类似了,不再赘述。