struts2之Action获取web资源

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值