自己实现Struts2(三)实现ActionContext

自己实现的struts1简易框架 1.能够通过配置定义Action,能够把客户端的参数传递给Action并从Action中取出结果值。 2.JSP页面能获取Action中的结果值。 3.能够实现拦截器。 4.支持文件上传下载 立即下载

上一章自己实现Struts2(二)加载配置文件我把加载配置文件的功能实现好了,现在要实现的是ActionContext类。先来简单介绍一下ActionContext类。

这是其他地方copy下来的,感觉介绍的很到位

ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters, locale等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。因此,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext,也正是由于这个原因,使用者不用去操心让Action是线程安全的。

说白了ActionContext就是一个数据中心,action想要的东西基本上都可以通过它拿到,像什么request、session还有ValueStack等等重要的东西。

#要做怎么样的ActionContext
我自己做的这个ActionContext可以获取下面这些对象

  • request
  • response
  • session
  • application
  • parameters : 存储请求参数
  • ValueStack : 值栈咯

当然了,像实现国际化的locale对象就没有了,没打算做那个功能,还有其它杂七杂八的也没有,就是用来获取上面6个对象,不过也够用了。

#实现ValueStack
要做ActionContext类,先把ValueStack类准备好,在Struts2中,ValueStack是一个接口,真正的实现是OgnlValueStack,不过我自己实现的话就直接把它作为类,而且用jdk提供的java.util.Stack实现,就不去弄什么root对象啦,我也做不出OGNL来。

ValueStack类,简单的很

package edu.jyu.stack;

import java.util.Stack;
/**
 * 值栈对象,将action压入栈
* @author Jason
 */
public class ValueStack {
	private Stack<Object> stack = new Stack<Object>();
	
	public void push(Object o){
		stack.push(o);
	}
	
	public Object pop(){
		return stack.pop();
	}
	
	public Object peek(){
		return stack.peek();
	}
	
}

#实现ActionContext

先把实现好的代码贴上来,然后再讲解

package edu.jyu.context;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import edu.jyu.stack.ValueStack;

/**
 * 数据中心
 * 
 * @author Jason
 */
public class ActionContext {

	public static final String REQUEST = "edu.jyu.request";
	public static final String RESPONSE = "edu.jyu.response";
	public static final String SESSION = "edu.jyu.session";
	public static final String APPLICATION = "edu.jyu.application";
	public static final String PARAMETERS = "edu.jyu.parameters";
	public static final String VALUESTACK = "edu.jyu.valuestack";

	private Map<String, Object> context;
	public static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();

	public ActionContext(HttpServletRequest request, HttpServletResponse response, Object action) {
		context = new HashMap<String, Object>();
		// 准备域
		// request
		context.put(REQUEST, request);
		// response
		context.put(RESPONSE, response);
		// session
		context.put(SESSION, request.getSession());
		// application
		context.put(APPLICATION, request.getSession().getServletContext());
		// parameters
		context.put(PARAMETERS, request.getParameterMap());
		// valuestack
		ValueStack vs = new ValueStack();
		// 将action压入栈顶
		vs.push(action);
		// 将ValueStack放入request域中
		request.setAttribute(VALUESTACK, vs);
		// 将ValueStack放入context域中
		context.put(VALUESTACK, vs);
		// 为当前请求线程设置好ActionContext
		actionContext.set(this);
	}

	/**
	 * @return 当前线程对应的ActionContext对象
	 */
	public static ActionContext getContext() {
		return actionContext.get();
	}

	public HttpServletRequest getRequest() {
		return (HttpServletRequest) context.get(REQUEST);
	}

	public HttpServletResponse getResponse() {
		return (HttpServletResponse) context.get(RESPONSE);
	}

	public HttpSession getSession() {
		return (HttpSession) context.get(SESSION);
	}

	public ServletContext getApplication() {
		return (ServletContext) context.get(APPLICATION);
	}

	public Map<String, String[]> getParams() {
		return (Map<String, String[]>) context.get(PARAMETERS);
	}

	public ValueStack getValueStack() {
		return (ValueStack) context.get(VALUESTACK);
	}

}

一、常量值

大家应该注意到一开始我定义了很多常量值,像public static final String REQUEST = "edu.jyu.request";,这当然也是仿造Struts2中的ActionContext里面的,是为了在后面的Map中获取指定的对象。这也是一个良好的习惯,用常量值去代替字面量或者变量值作为key,不容易错而且方便。

二、核心——context

private Map<String, Object> context;:这个对象无疑就是ActionContext的核心成员了,我们要的对象存放在它里面,然后通过上面的常量值获取对应的对象。

三、保证线程安全——actionContext

public static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();:这个actionContext是一个ThreadLocal对象,而且里面存放的值是ActionContext类型的,将每个请求的线程的ActionContext对象存放到这个actionContext的属性中,这样每个线程通过getContext()方法访问到的ActionContext对象都是自己的那份,从而保证了数据安全。

四、添加数据——构造方法

大家可以注意到除去getter方法,整个ActionContext类最多处理的是在构造方法中。我写的这个ActionContext类的构造方法跟Struts2里面的ActionContext类不同,Struts2里面的是这样的

public ActionContext(Map<String, Object> context) {
     this.context = context;
}

它里面的核心context是直接传进来的,而我是自己在构造方法中new出来的,只需要传进三个对象

  1. request
  2. response
  3. action

三个足以,session和parameters可以通过request获得,application可以通过session获得,ValueStack自己创建,全部数据都可以搞定了。

需要注意的几点:

  1. action要压入ValueStack中。
  2. ValueStack要放入request域中,在Struts2中是可以通过request域获取到ValueStack对象的。
  3. actionContext.set(this);即为当前请求线程设置好它的ActionContext对象,也可以说是将ActionContext对象绑定到当前线程上。

好了,ActionContext大功告成,项目已经上传到Github上
https://github.com/HuangFromJYU/JStruts2

如果大家有什么问题或者发现什么错误可以发邮件到jasonwong_hjj@qq.com,共同学习共同进步

自己实现struts 自己动手实现的struts的基本功能,主要用到了反射了xml的解析 立即下载

相关推荐

mtk-drm初始化

mtk-drm初始化走读

zhexingsunba的博客 4931

Struts2原理分析,自己实现一个struts2

今天没有时间继续撰写关于osworkflow的源码剖析文章了,换一个思路,写一下struts2相关的东西,先来说说为什么要写这样的一个东西,公司有一套自主研发的云服务平台,CTO告诉我站在用户的角度,从头到尾部署自己的应用,让我写一个基于php的http应用和基于j2ee的http应用,php的昨天已经写完并且顺利部署,照常运行,今天本来要写java的,开始动手之前,我纠结一件事情,第一现在的ja

清心寡欲,做一个专注的程序员 2146

手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

weixin_37584728的博客 2934

关于ActionContext.getContext()的用法心得

    这个也是我在另外一位仁兄的博客中看到的,原博客的有点长,我把它精简了一下,算看起来比较方便吧。    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。(一)通过Actio

smcfy的专栏 7万+

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4690

逆向工程视角:MFI芯片通信协议在Linux环境下的行为分析

本文从逆向工程角度深入分析了MFI芯片在Linux环境下的通信协议行为,重点探讨了树莓派与MFI芯片通过I2C接口交互的技术细节。文章详细介绍了信号捕获、协议栈逆向、动态调试技巧以及安全机制分析,为开发者提供了在Linux驱动层面实现MFI认证的实用方法。

time3的博客 176

Struts2三种共享数据的方式

在web项目中都是使用域对象来共享数据 在struts2中有三种方法实现数据共享 使用request,session,servletContext域对象共享 //获取request HttpServletRequest request = ServletActionContext.getRequest(); //获取session ...

xiezhi_1130的博客 780

知识图谱的数据挖掘与分析

1. 背景介绍 1.1 数据挖掘的崛起 随着互联网的普及和大数据技术的发展,数据挖掘已经成为了计算机科学领域的热门研究方向。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过计算机科学、统计学、信息论等多学科交叉的方法,挖掘出有用信息和知识的过程。数据挖掘的目标是从数据中发现有

AI天才研究院 1600

struts2访问三大域和参数

@Override public String execute() throws Exception { //在action中访问三大域和参数 简化开发 //思想上的问题 松耦合 防侵入 //获得request Map requestScope=(Map) ActionContext.getContext().get("request"); //获得session

参与感 1546

LPDDR6 tdbR2dbR_L cross row技术探讨

LPDDR6 tdbR2dbR_L cross row技术探讨

zilan23的博客 47

188、LLC谐振变换器的样机调试实战(EMI测试)

本文分享了LLC谐振变换器EMI调试的实战经验。作者通过300W电源案例,指出LLC的EMI问题主要来自谐振腔共模电流和死区振铃,并提出三板斧解决方案:优化功率回路布局、合理选择共模电感、正确配置X/Y电容。文章详细分析了谐振电容位置、MOSFET走线、变压器屏蔽等关键设计要点,并列举示波器探头、滤波器接地等常见误区。最后强调EMI调试70%依赖布局优化,建议预扫测试、数据记录并保留6dB余量。全文以实际案例贯穿,为LLC电源EMI设计提供了实用指导。

Jack010169的博客 55

struts2中访问ServletAPI的方式

1、使用struts2提供的一个ServletActionContext工具类,在该类中包含了一系列相对应的静态方法,可以直接获取。 该类包含了一下几个静态方法: static PageContext getPageContext():取得Web应用的PageContext对象。 static HttpServletRequest getRequest():取得Web应用的...

Gray_humor的博客 286

出现 Error:Unable to access jarfile xxxx\target\nacos-server.jar 解决方法

Nacos中的 2.x执行步骤如上,如果需要安装下载1.x版本,执行该步骤之后 自动更新下载的是2.x版本 对此如果需要下载安装1.x的版本,可通过如下连接(windows版本)

码农研究僧的博客 5699

Struts2学习笔记(五) 访问servlet的api的三种方式

方法1:完全解耦和的方式访问 简介:解耦和也就是说在action中,没有像servlet那样,传递过来的参数中有request和response这两个对象可以直接使用,action中没有任何参数。但很多时候我们又需要使用这两个对象,所以我们需要学习在action如何使用这两个对象。这时我们可以使用action中的ActionContext对象,但是它也有局限性就是只能对域中的数据进行操作,而不能获...

showadwalker的博客 302

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Struts2访问web元素的各种方法

1、通过RequestAware,SessionAware,ApplicationAware获取: 在Struts2中不能直接访问Request,Session,Application元素,但是可以使用Struts2中提供的RequestAware,SessionAware,ApplicationAware。在这里要分别为三个对象提供setter方法,以便让struts自动执行,使用IoC(控制...

weixin_30484247的博客 93

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

struts中访问Servlet api

访问Servlet api 一.完全解耦,但只能操作作用域 1、不使用曾经学习过的servlet知识,可以去操作三个作用域 2、ActionContext 工具类(Struts2的数据中心),action上下文对象 获得实例:ActionContext.getContext() api: ac.put(key,value), 相当于操...

hongcaixia的博客 491

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

struts2中 ServletActionContext与ActionContext区别

1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作. 我们需要在Action中取得request请求参数

1万+

Struts2中ActionContext介紹 && Struts2如何获得request

1. ActionContext在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作. 我们需要在Action中取得request请求参数

Forrest He的专栏 1万+

java actioncontext_关于struts2中ActionContext的实现原理

北京,雾霾天气阻止了今天的马拉松之行,蜗居一天。为一个问题“struts2如何保证ActionContext每次取的都是本次请求所对应的实例?”,给一个网友解释了半天。首先,我们知道,struts2和struts1的一个重要区别就是它进行了Action类和Servlet的解耦。而又提供了获取Servlet API的其它通道,就是ActionContext(别跟我说还有个ServletActionC...

weixin_33700809的博客 255

struts2 值栈 与actionContext

1、值栈的简单定义:       (1)简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action、Result、Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱。       (2)当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的,不同的请求,值栈也不一样, 而值栈封装了一次请

听风暖的博客 1万+

Struts2中的ActionContext

在做完的SSH网上商城项目中,在各个的action中都用到了ActionContext,例如往session中存值,往值栈中存值等,那么到底什么是ActionContext呢?         ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放

772

Struts2之ActionContext理解

在Strust2中,有一个内置对象叫ActionContext,通过该对象可以获得之前Servlet中的对象,比如:requst对象,response对象... 那么为什么可以通过ActionContext获得那些对象呢? 那是因为在ActionContext内容引用了那些对象,也就是在ActionContext内部记录了那些对象的地址,看下图 上图就是简单理解为什么通过Action

qishubiao的博客 1万+

struts2中ActionContext是什么

form URL: http://apps.hi.baidu.com/share/detail/16057446 ActionContext(Action上下文) ActionContext介绍 通过上面用户注册例子的学习,我们知道Xwork与Web无关性,我们的Action不用去依赖于任何Web容器,不用和那些JavaServlet复杂的请求(Request)、响应(Respons

说:/~不了的专栏 579

Struts2中ActionContext介绍

本文转自互联网,并整理。     在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息,,甚至需要直接对JavaServlet Http的请求(HttpServ

虽然我很菜 1038

Struts2 的ActionContext 详解

转自:http://www.cnblogs.com/shaohz2014/p/3962779.html ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters, locale等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程...

153
上一篇: 自己实现Struts2(二)加载配置文件
下一篇: 自己实现Struts2(四)实现ActionInvocation
腹黑大壁花
博客等级 码龄12年 157粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值