struts2之Action获取web资源

时间:2021-03-26 13:39:46

在说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接口和之前解耦方式就更类似了,不再赘述。