struts中的action_type object has no attribute

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在Strust2中,有一个内置对象叫ActionContext,通过该对象可以获得之前Servlet中的对象,比如:requst对象,response对象…

那么为什么可以通过ActionContext获得那些对象呢?

那是因为在ActionContext内容引用了那些对象,也就是在ActionContext内部记录了那些对象的地址,看下图

struts中的action_type object has no attribute

上图就是简单理解为什么通过ActionContext可以获得request等对象,其实request和response还是Servlet中我们用的那个对象,只是在ActionContext中被引用了。

从图中也可以看出ActionContext其实就是一个Map集合。

由于requst的生命周期是一次请求,该请求结束后request就会结束,那么ActionContext中的requst自然也就没了,那么ActionContext的生命周期是如何呢?其实每次发出请求时都会创建一个ActionContext,也就是说,ActionContext的生命周期是和request相同的,证明很简单,既然ActionContext是一个Map集合,

那么我们就可以自己向里面添加数据

ActionContext.getContext().put("test", "哈哈");

我们在一个请求中执行上面代码,就是向ActionContext这个Map集合中放一个数据,我们在另一个请求中是否能获得该数据?

ActionContext.getContext().get("test");

上面代码是从ActionContext这个Map集合中获得数据,在测试时获得的数据为null,有兴趣的同学可以自己试一试。

从这也就可以看出,两次请求中是不同的ActionContext,

就可以下结论说ActionContext的生命周期是一次请求,也就是同request一样


那么问题来了

我们都知道request这个对象内部就提供了一个域也是一个Map,那么既然ActionContext这个Map和request内部的Map生命周期一样,是不是就可以用ActionContext代替request中的Map域呢?

其实在Strus2设计的时候,本意就是想用ActionContext来替换request 来存储数据,所以ActionContext的确可以代替request来存储数据,至于具体使用哪一个更好,其实没什么区别,看个人习惯和喜好吧,无论使用哪一个,要记得他们是两个不同的域,虽然生命周期一样,但是放在request中的数据,是不能从ActionContext这个Map中得到的,可以通过ActionContext先获得request对象再用request来获得数据。

从ActionContext中获得原生对象

ActionContext有个子类叫ServletActionContext,是通过ServletActionContext来获得那些内置对象的,

struts中的action_type object has no attribute

从图中可以看到我们熟悉的API:PageContext,Request,Response,ServletContext

从ActionContext中获得解耦域对象

我们知道request,session,application内部都封装了一个域对象,用来存储数据,

requst的域我们上面可以通过获得request对象就可以获得域对象,

那么session和application的域对象怎么获得呢,当然通过requst对象可以获得session对象也可以获得session的域对象,

那么感觉就太麻烦了

在ActionContext中就提供了直接获得域对象的API:

Map<String, Object> session = ActionContext.getContext().getSession();
Map<String, Object> application = ActionContext.getContext().getApplication();

上面的代码就是获得session和application的域对象,可以看出返回值都是一个Map,这个Map就是它们的域对象,

操作这个Map就是操作域对象,

session.put(“key”,”value”);就是向session域中存数据

session.get(“key”);就是从session域中取数据

但是却没有提供直接获得requst域对象的方法,在上面我说过struts2想用ActionContext代替request的域对象,

所以就没有提供获得request域对象的方法。

其实也是在ActionContext这个Map中存放了session和application的Map的引用而已

struts中的action_type object has no attribute

回到一开始说ActionContext的生命周期是和requst一样的,就是每次访问Action时都会创建一个新的ActionContext这个Map对象,

也是因为它只是引用了其他对象,所以,ActionContext消失的时候其他的对象还是存在的,

那么当ActionContext创建的时候是怎么再次获得那些引用的呢,让我们想想我们在使用Servlet的时候我们是怎么获得的那些对象的呢,是通过request对象,只要request对象存在就可以获得那些对象的引用,

所以,ActionContext也是在它创建的时候使用每次的request对象来重新引用那些对象。

让我们总结一下:

一》:ActionContext生命周期是一次请求,每次发出请求都会创建一个新的ActionContext,就和request一样,每次创建新的ActionContext时会重新引用那些对象。

二》:而且不只生命周期一样,它本身也具备了request域的功能,可以从后台携带数据到前台,也和request一样

三》:通过ActionContext的子类ServletActionContext可以获得那些对象

四》:通过ActionContext可以直接获得session和application各自的域对象,操作时更方便

五》:最重要一点是:ActionContext本身是一个Map,它存储了很多的对象例如request,response,当然除了这些我们见过的,还有很多我们没见过的对象

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195484.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 图解Linux命令之–dos2unix命令

    图解Linux命令之–dos2unix命令dos2unix命令–&gt;DostoUNIX的缩写,用来将DOS格式的文本文件转换为UNIX格式find.-typef-execdos2unix{}\;find.-typef|xargs|dos2unix备注:1)为什么需要用dos2unix进行格式转换在Linux系统下经常会出现下列提示:/bin/sh^M:badinter…

  • 常用的Java工具,16个

    常用的Java工具,16个在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码。一.org.apache.commons.io.IOUtilscloseQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块toString:转换IO流、Uri、byte[]为Stringcopy:IO流数据复制,从输入流写到输出流中,最大支持2GB

  • 记一次CTF的USB流量分析

    记一次CTF的USB流量分析最近在研究鼠标流量,找到如下的文章:https://www.cnblogs.com/hackxf/p/10670844.html根据这个师傅的说法,不同的鼠标抓到的流量不一样,一般的鼠标流量是四个字节,第一个字节表示按键指示左键右键,第二个字节表示水平位移,为正(小于127)是向右移动,为负(补码负数,大于127小于255)是向左移动。第三个字节表示垂直位移,为正(小于127)是向上移动,为负…

  • Centos7 查看系统版本信息「建议收藏」

    Centos7 查看系统版本信息「建议收藏」本文转自至:https://blog.csdn.net/ZZY1078689276/article/details/777168711.查看版本号  CentOS的版本号信息一般存放在配置文件当中,在CentOS中,与其版本相关的配置文件中都有centos关键字,该文件一般存放在/etc/目录下,所以说我们可以直接在该文件夹下搜索相关的文件。ll/etc/*centos*查看…

  • SQLyog安装成功步骤(附带码),2021版最新

    SQLyog安装成功步骤(附带码),2021版最新一、SQLyong安装:先是一路next,自己改变一下安装路径,点自己激活:Name自己取,下一行输入dd987f34-f358-4894-bd0f-21f3f04be9c1即可二、各种类型的算法高频面试题汇总:https://blog.csdn.net/qq_40262372/article/details/112556249三.群里已有字节、滴滴大佬,可帮忙内推!也欢迎其他大厂的工作人士进群!帮忙内推~QQ群:725936761四、B站视频讲解如何三个月学习JAVA..

  • [RoCE]Flow Control

    [RoCE]Flow Control概览RoCE可以实现lossless无损网络环境,在二层网络上做到可靠网络传输,从而对原本在光纤网络环境下的应用在以太网环境下提供相同的服务,而不必对应用逻辑和上层协议更改。实现无损的方法有GlobalPause,PFC,DroplessReceiveQueue。1.什么是802.3xFlowControl(GlobalPause)?以太网标准(802.3)设计时是不可…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号