北京朝阳建站优化直播类app开发公司

diannao/2026/1/19 1:53:07/文章来源:
北京朝阳建站优化,直播类app开发公司,鞍山网站建设工作室,外企网站建设公司接着Struts2_3_day的讲 注:使用Struts2的 s:debug /s:debug就可获取数据储存的分布图 StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象, 所以Struts2的数据存储分为两类: ActionMap(contextMap)以及ValueStack; ActionMap中都是以m…接着Struts2_3_day的讲 注:使用Struts2的 s:debug /s:debug就可获取数据储存的分布图 StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象, 所以Struts2的数据存储分为两类: ActionMap(contextMap)以及ValueStack; ActionMap中都是以map的形式存取数据, 而ValueStack是以Stack的方式存取数据(底层就是List) ActionMap数据操作 利用ActionMap存储数据 ActionMap是一个大的map, 而这个大map中又存有application, session, request, parameters, attr的小map, 所以在ActionMap中存放数据的时候既能存入大map中, 也能存入小map中, 在小map中还能存入map, 形成多层的存储, 如下代码操作: 1.直接在ActionMap中存入数据, 使用ActionMap的静态方法getContext获取ActionMap对象, 然后直接putActionMap context ActionMap.getContext();context.put(contextMap, contextMap);2.往ActionMap中的session对象中存入数据使用ActionMap中的session, session也是一个mapMapString, Object sessionAttribute context.getSession();sessionAttribute.put(sessionMap1, sessionMap1);使用原始HttpSession对象存储数据HttpSession session ServletActionContext.getRequest().getSession();session.setAttribute(sessionMap2, sessionMap2);3.往ActionMap的application中存入数据使用使用ActionMap中的ServletContext域MapString, Object applicationAttribute context.getApplication();application.put(applicationMap1, applicationMap1);使用原始ServletContext对象ServletContext application ServletActionContext.getServletContext();application.setAttribute(applicationMap2, applicationMap2);注: 无论使用ServletActionContext中的存储方式, 还是使用ActionMap.getContext().getXXX()的方式, 他们所指向的存储区域都是一样的, 例如上面的applicationMap1和applicationMap2, 他们二者的数据都是存放在同一片储存区域的, 同理sessionMap1与sessionMap2也是一样的 获取ActionMap中数据 可以直接使用Map的get, 或者使用域对象的getAttribute方法来获取ActionMap中数据, 但是大多数使用OGNL表达式在jsp中获取ActionMap数据, 例如: // 使用OGNL表达式获取域对象数据, OGNL表达式必须写在Struts2的标签中 % taglib uri/struts-tags prefixs % s:property value#session.sessionMap1 //在使用OGNL表达式取用ActionMap的数据的时候, 使用# //借用上面代码的存储方式, 因为sessionMap1,以及sessionMap2是存入session中, 所以直接使用#session.sessionMap1 //数据的查找顺序是: 先去ActionMap中查找session区域, 找到之后在session区域中查找是否具有key为sessionMap1的数据//同理, 当查找applicationMap1也是直接使用:s:property value#application.applicationMap1ValueStack数据操作 利用ValueStack存储数据 正如前面所说的, ValueStack就是一个Stack结构, 当我们向ValueStack中存入数据的时候就是进行入栈, 出栈的操作 下面先介绍获取ValueStack对象引用的3种常见方式: 1.使用s:debug/s:debug之后发现, 在request中存有ValueStack的引用, 所以可以使用get的方式获取:ActionContext context ActionContext.getContext();MapString, Object request (MapString, Object) context.get(request);ValueStack vs (ValueStack)request.get(struts.valueStack);2.使用ServletActionContext获取request对象, 然后再通过getAttribute获取:ServletRequest request ServletActionContext.getRequest();ValueStack vs (ValueStack)request.getAttribute(struts.valueStack);3.直接使用ActionContext对象的getValueStack方法获取:ValueStack vs ActionContext.getContext().getValueStack();注: 通过上面的3种方式获取的vs都是同一个对象当我们获取到ValueStack对象之后就可以对ValueStack对象做push, peek/pop操作以此达到存储数据的目的, 例如: ValueStack vs ActionContext.getContext().getValueStack(); vs.push(new Student(A, 18)); //对一个Student对象做入栈操作注: 默认动作类对象会自动存入ValueStack中, 因此可以通过OGNL表达式获取默认动作对象的属性方法(对该属性一定要写set/get方法) 获取ValueStack中数据 当使用动作类进行ValueStack存储数据的时候, 一定要记住: 如果直接想通过OGNL表达式获取, 此时数据只具有request的作用域范围, 当使用页面重定向后, 就不能访问到刚才动作方法中存入ValueStack中的数据 1.可以使用pop/peek直接获取ValueStack数据或者jsp中使用标签的方式获取ValueStack数据; 2.jsp中操作: 使用 s:property valuename /这里的name是一个OGNL表达式, 用于获取Student中的name属性;3.与获取ActionContext数据不同的是, value后面的参数少了一个#, **#是作为获取ValueStack与ActionMap中数据的一种区别**;4.在ValueStack中, 查找方式是: 在Stack中依次遍历每个对象, 查看当前对象的属性是否是value后面的参数值,如果是就代表找到, 就不再往后查找. 例如: 当动作类中也具有一个name属性, 但是现在栈顶是一个Student对象, 当找到Student对象中的name属性的时候就不再往后找, 即使动作类中也具有name;5.在OGNL表达式中可以多级访问: 比如ValueStack中存入的数据是一个Map对象map, Map对象中存有一个Student对象s1, 当我们想要获取此时Student对象的name属性的时候, 就可以写: s:property values1.name /ValueStack的set与setValue方法的区别 set方法: ValueStack vs ActionContext.getContext().getValueStack(); vs.push(new Student(A, 19)); vs.set(s1, new Student(B, 20));如上述代码, 当vs使用set操作的时候, 操作的元素是ValueStack中的元素. 如果栈顶是一个Map, 就直接将一个key为s1, value为Student对象存入Map中 如果栈顶不是一个Map, 则ValueStack新建MapString, Object对象, 然后将key为s1, value为Student对象存入Map中当连续多次vs.set()的时候, 所有的set的对象都是存入一个Map对象中, 例如:vs.set(s1, new Student(A, 20));vs.set(s2, new Student(B, 10));vs.set(s3, new Student(C, 24));当使用OGNL表达式访问栈中map中的元素, 采用: s:property values1.name/, 而不是s:property value#s1.name, 这里是在ValueStack中取元素, 而不是ActionMap 在获取元素的时候, 元素对象一定要写set/get方法 这里别理解为连续set是建立多个map, 只有在下面这种情况下, 才是建立多个Mapvs.set(s1, new Student(A, 20)); //新建一个mapvs.push(new Student(C, 24));vs.set(s2, new Student(B, 10)); //又新建一个mapsetValue方法: setValue对ValueStack中存储元素值的修改操作:vs.setValue(name, X);将栈中第一个name元素修改为X, 借用上面代码, 此处的修改是将C变为XsetValue的第一个参数是一个OGNL表达式setValue对ActionMap中存储元素值的修改操作:vs.setValue(#name, X);这里修改的name属性, 是对ActionMap中key为name的value进行修改ValueStack的findValue 在JSP上使用OGNL表达式获取ActionMap或者ValueStack中的内容的时候, 都是执行如下操作 vs.findValue(name); //在ValueStack中查找名为name属性的值 vs.findValue(#name); //在ActionMap中查找key为name的value值Struts中的EL JSP中的EL表达式获取的是请求域中对象(page - request - session - application) Struts2的StrutsRequestWrapper对request重新做了封装, 对getAttribute进行改写, 当获取完request域中对象后, 会先去ValueStack, 然后是ActionMap中寻找需要的对象 Struts2对EL表达式进行了改写使得获取对象变为: page - request - ValueStack - ActionMap - session - application 注: 当使用OGNL表达式查找属性值的时候, 如果写做 s:property value“name” /, 它会先去ValueStack中查找, 当没找到的时候再去ActionMap中, name作为key找一遍. Struts2中#, $, %的使用 # OGNL表达中获取ActionMap中的Key为key的value值:s:property value#name //获取Key为name的value值创建Map对象的时候, 主要用于CheckBox, radio的多条件选择:s:radio list#{ male:男, female:女 }$ JSP中使用EL表达式:${name} 在xml中配置文件名, 或者使用静态函数(避免在JSP中写%%代码)${java.lang.Math.random()}% 强制将一个字符串看做是OGNL:s:property value%{name}Struts2中常用标签(使用OGNL配合使用) iterator标签 主要用于迭代遍历元素, 类似于JSP中的foreach标签, 下面举例说明: Action类: //使用list模拟从数据库提取Student数据, 显示在结果视图中public class DemoAction extends ActionSupport{private ListStudent students;public String findAll(){ //action方法students new ArrayListStudent(3);students.add(new Student(A, 20));students.add(new Student(B, 30));students.add(new Student(C, 10));return SUCCESS;}public ListStudent getStudents(){return students; }public void setStudents(ListStudent students){this.students students;}}//JSP中iterator操作s:iterator valuestudents vars statusvstrtds:property value#vs.index/br//tdtds:property value#s.name/br//tdtds:property value#s.age/br//td /tr/s:iterator注: 1.在遍历的过程中具有两种操作用于暂时存储需要遍历的变量(方便获取该变量的内部属性):a.使用ActionMap: 当指定在iterator中指定var属性的时候,Struts2会将var作为key, 当前变量作为value存入ActionMap中, 便于后面通过OGNL表达式获取该变量的内部属性, 因为key是固定的, 所以下一个元素存入ActionMap中会将上一个元素的value覆盖, 这样做也是为了减少空间占用,遍历结束后会将最后存在ActionMap中的变量removeb.使用ValueStack: 如果没有指定var, 那么Struts2会直接将该变量压入栈中, 当使用完该变量进行pop操作, 原因同上2.status主要是用来记录遍历的数据属性(以status作为key, 数据属性作为value存入ActionMap中):status具有index, count, odd, even, first, last属性, 表示下标, 遍历的数据和, 奇数位, 事件, 第一个值, 最后一个值, 具体用法自行百度3.在上面例子中, 可以使用valuename的OGNL表达式来输出变量属性, 也可以使用EL表达式${name}来输出变量属性set标签 与JSP中的set标签一样, 就是声明一个变量, 然后对该变量赋值, 设置访问范围 s:set valuea var1111 scopesession/ s:property value#1111/ 声明一个变量1111, 赋值为a的字符串, 设定访问范围为sessionset设置的变量是存入Map中的, value代表属性值, var代表Key值, scope取值范围application, session, request, page, action, 当scope不写的时候默认是action, ActionMap与request中各存一份action标签 在JSP中调用action方法: s:action name“action1” executeResult“true”/ ,executeResult表示是否显示执行动作结果, 默认值false url和a标签 url标签主要用于获取url地址 a标签用于向一个url地址进行跳转, 就 a href…/ 例:s:url actionaction1 valueaction1 varurls:param nameusername value test /s:param/s:urlaction: 获取值为action1的动作请求地址, 类似于EL表达式: ${pageContext.request.contextPath}/action1.actionvalue: url标签中的value用于输出value的值, 此时的value后面的参数不是OGNL表达式, 只是一个普通字符串; 而param中的value代表get方式添加参数, 会自动编码 如:username?test var: 将值为url作为key存入ActionMap中使用上面的urla hrefs:property value#url点击/a当使用s:a标签的时候就类似于使用s:url标签与a标签的结合品s:a actionaction1s:param nameusername value test /s:aif/else标签: if/else标签的用法与JSP中标签的用法一致 s:if test nameA A/s:if s:elseif test nameB B/s:if s:elseC防止表单数据重复提交 Servlet中的解决方式: 用户第一次提交表单数据之前先将数据存入Session域中, 当用户数据提交之后就删除Session数据, 当用户重复提交的时候会发现表单中数据与Session中数据无法做比较, 最后判定数据重复提交, 对后面提交的数据不作处理 Struts2中的解决方式 使用token/tokenSession拦截器(Struts2提供的一个拦截器) 使用token/tokenSession拦截器的时候, 会产生一个令牌隐藏在Session域中, 当用户提交数据后令牌消失, 下一次提交找不到对应的令牌, 所以最后判定为用户数据重复提交 如上面看到的, Struts2中防止重复提交与Servlet中防止重复提交的思想是一致的此处说明一个问题就是:token/tokenSession不在Struts2的defaultStack中, 在使用的时候需要配置defaultStack拦截器token与tokenSession的区别:token做拦截的时候, 当用户提交后有一个页面跳转, 有一个错误反馈, 告诉用户数据重复提交tokenSession做拦截的时候, 不去做页面跳转和错误反馈, 无论用户提交多少次表单数据, tokenSession只取第一次提交的数据下面使用token举例说明(使用tokenSession的时候, 只需将token改为tokenSession): index.jsp:s:form actionsaves:token/s:token %此标签用于生成隐藏令牌%s:textfield namename label用户名/s:textfields:submit value保存/s:submit/s:formStruts.xml:strutsconstant namestruts.devMode valuetrue/constantpackage namep1 extendsstruts-defaultaction namesave classcom.action.DemoActioninterceptor-ref namedefaultStack/interceptor-ref!--配置token拦截器--interceptor-ref nametoken/interceptor-refresult typeredirect/success.jsp/result!--使用token的时候必须做invalid.token跳转, 跳转到error.jsp中--!--在使用tokenSession的时候不需要做invalid处理--result nameinvalid.token/error.jsp/result/action/package/struts到此Struts2的学习就结束了, 在后面的学习中, 我会将一个没有讲到的内容以及一些容易犯错的地方补充上. 上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

招聘网站怎么做吸引人王烨然盈盈

目录 Zookeeper1 启动单个Zookeeper实例1.1 下载Zookeeper安装包并解压1.2 添加环境变量1.3 修改默认配置1.4 新建数据存储目录和日志目录1.5 启动Zookeeper1.6 停止Zookeeper 2 搭建Zookeeper集群2.1 新建集群目录2.2 配置环境变量2.3 创建节点目录2.4 修改配置2.5 创建节点ID…

温州专业手机网站制作哪家便宜威海网站制作

欢迎关注【CSDN云计算】公众号——国内专业的云计算服务平台,平台内详细为您介绍什么叫云计算、云计算技术以及云计算概念和应用。 CSDN云计算作为国内专业的云计算服务平台,提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、机器学习、智…

wix网站做图片能折叠吗WordPress文章收录代码

参见英文答案 > The server time zone value ‘AEST’ is unrecognized or represents more than one time zone????????????????????????????????????9个我的问题MySQL连接器“服务器时区值中欧时间”无法识别或代表多个时区.该项目小…

汉口网站制作公司免费看电视的网站

http://www.cnblogs.com/cxjchen/p/3148582.html 单例模式 单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况&am…

学c还是网站开发品牌vi设计是什么意思

AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念 Copyright © Microsoft Corporation. All rights reserved. 适用于License版权许可 更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区 Content01.0-神经网络的基本工作原理0…

php简单购物网站源码慕课网电子商务网站开发

Adobe Illustrator 2024 for Mac是一款专为Mac用户设计的行业标准矢量图形设计软件。该软件以其卓越的性能和丰富的功能,为设计师和艺术家们提供了一个全新的创意空间。 作为一款矢量图形软件,Adobe Illustrator 2024 for Mac支持创建高质量的矢量图形&a…

网站页面配色分析自己做网站外包

添加噪声的方式大致分为两种,一种是每张图像在任意timestep都加入一样的均匀噪声,另一种是按照timestep添加不同程度的噪声 一、在任意timestep都加入一样的noise batch_size 32x_start torch.rand(batch_size,3,256,256) noise torch.randn_like(x_…

什么网站可以做二建的题目电子商务平台建设与运营技术

参考:嵌入式 交叉编译链的安装 作者:一只青木呀 发布时间:2020-08-04 18:13:13 网址:https://blog.csdn.net/weixin_45309916/article/details/107789879 目录什么是交叉编译器交叉编译器的下载交叉编译器的安装1.把下载的文件放到…

中国最大网站建设公司网站设计原型工具

MySQL面试问题的标准回答: 什么是数据库范式?MySQL中常见的范式有哪些? 标准回答:数据库范式是一组规则,用于设计关系型数据库的结构,以减少数据冗余和提高数据的一致性。常见的数据库范式包括第一范式&…

哪里做网站seo网站开发一般用什么软件

vs显示堆栈数据分析A poor craftsman blames his tools. But if all you have is a hammer, everything looks like a nail.一个可怜的工匠责怪他的工具。 但是,如果您只有一把锤子,那么一切看起来都像钉子。 It’s common for web developers or databa…

临沂网站建设厂家dw建网站怎么做

steam是计算机游戏界最大的数码发行平台,是一个游戏整合下载平台,很多喜欢玩游戏的朋友都会用这个软件,当然也不少刚开始使用这个软件的朋友,这些朋友因为才刚刚接触到这个软件所以不知道steam账户名称怎么取,不要担心…

上线了做网站价格贵军事视频2020最新

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

个人怎样做旅游网站合肥网站建设电话咨询

即时设计 即时设计是一种基于云的在线矢量设计工具,是一种免费的绘图软件,专门用于现代UI和UX设计。它极大地简化了矢量图形的编辑,以一种非常直观和易于使用的方式,让设计师专注于他们最擅长的事情:创造优秀的产品。…

微盟商城官网深圳排名seo公司

1、创建测试用例 为ComeOnBroadcastReceiverDo创建一个测试用例: 在导航栏File-->New-->Other 选择AndroidTestProject 2、点击next输入测试工程的name,选择测试工程路径 点击next,选择要测试的工程: 点击Finish完成测试工程的新建 被…

网站开发人员岗位分布说明企业品牌策划排行榜

线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法:逻辑回归模型保存与加载无监督学习:K-means算法 1、应用场景 2、原理 2.1 输入 2.2 激活函数 3、损失以及优化 3.1 损失 3.2 优化 4、逻辑回归API 5、分类的评估方法 5.1 精确率和召回率 5.2…

自己制作网站的软件网页图片格式

地址 https://gitee.com/charrie/vue3-uniapp-init 部分截图展示 技术说明 采用vue3viteuniapp技术栈,setup语法糖编码方式使用完全免费的sard-uniapp组件库引入unocss量子化样式引擎,动态css不用自己写样式,引用class即可,降低…

网站热点关键词移动互联网开发课件

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…

巴中网站开发国家企业信用查询系统

1 基础概念 什么是窗口? 答:窗口就是屏幕上的一片区域,接受用户的输入,显示程序的输出。可以包含标题栏、菜单栏、工具栏以及控件等。什么是句柄? 答: 作为一种管理和操作系统资源的机制,提供了…

企业网站的高跳出率应该如何解决电子商务网站建设的平台

字符串str 一、字符串定义 概念:字符串是有序的 不可修改的,元素以引号包围的序列 引号类型:单引号 “”双引号 “ ””三引号 三单引号 print(python) print("python") print(python) print("""python""…

公明网站建设合作公司做网站

目录 常规的Web应用搭建 三种常规网站搭建模式 程序源码 中间件配置 数据库类型 文件访问路径 总结 章节知识点: 应用架构:Web/APP/云应用/三方服务/负载均衡等 安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令:文件…