day27_Struts2学习笔记_04

一、contextMap中的数据操作

1、存数据:

   需要熟悉 ActionContext类ValueStack接口API 。框架为我们存数据。 1.1、利用 ActionContext 存数据    我们先看看 ActionContext.class 的源码:

1.2、利用 ValueStack 存数据    a、如何获取ValueStack呢?

   b、ValueStack中的getRoot()方法。

   c、CompoundRoot是什么?

  d、栈操作。   动作类中相应的代码为:

  学生实体类代码:

  Struts Debug页面查看数据:

2、取数据:用Struts2的标签(OGNL表达式)在JSP上(用的最多)

   使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。 2.1、使用s:property取数据 a、取contextMap中的数据,需使用 #key

b、取contextMap里面ValueStack中对象的属性:直接写属性名

  如果遇有对象的属性的名称相同(属性名同名),可以通过OGNL表达式,选择查找的起始位置。它会从指定起始位置逐个对象查找指定的属性名称,只要找到了,就不再继续查找了。

特殊说明:当s:property不给定value属性时,默认取栈顶对象。

 OGNL的使用总结:    1.取根(root)中对象的属性,不使用#。    2.取contextMap中key的值,要使用#。 2.2、ValueStack的其他方法 a、setValue方法

b、set方法

c、findValue方法:我们在jsp上调用的其实都是findValue

二、Struts2对EL的改变

1、Struts2中使用EL的问题

前提:    我们应该知道,如果我们在动作类中没有往 值栈(根) 中放入数据的话,那么我们的动作类对象默认是在值栈的栈顶。

问题: 我们放到动作类中的属性和请求域中的属性,使用EL表达式取出来了。但是放到应用域中的属性,使用EL表达式没取出来。

2、关于EL问题的分析

分析:    我们知道EL表达式是从四大域对象中依次查找属性。搜索范围是由小到大。    查找顺序:pageScope --> requestScope --> sessionScope --> applicationScope    但是通过测试发现,程序搜索放到应用域中的name属性,搜索完request范围后就没有继续搜索了,原因是:在请求域中没有找到的情况下,去ValueStack中查找了,返回了ValueStack中栈顶对象name属性的值。    问题出现在这个request的包装类上了,该包装类对getAttribute方法进行了改写,如下图所示:

  我们来看看这个包装类的源码:

3、Struts2中EL查找顺序改变总结

EL表达式的查找顺序:pageScope --> requestScope --> sessionScope --> applicationScope

Struts2对EL表达式查找顺序的改变:pageScope --> requestScope --> valueStack(根中) --> 剩余的contextMap(小Map) --> sessionScope --> applicationScope

4、OGNL的特殊说明

  当我们不写#号时,OGNL表达式会从值栈的栈顶开始找对应的属性,如果没有该属性,再去contextMap中把value的值作为key去查找对应的值。这个知道就行,我们开发中一般不这么写!

三、OGNL配合通用标签的其他使用

1、iterator标签(很重要)

2、OGNL投影(了解)

 2.1、使用过滤条件投影  2.2、投影指定属性   如下图所示:

3、Struts2中 `#,$,%` 符号的使用(重要)

3.1、#    a、取contextMap中键key对应的值value时使用,例如:<s:property value="#name"/>    b、OGNL中创建Map对象时使用,例如:<s:radio list="#{'male':'男', 'female':'女'}"/> 3.2、$    a、在JSP中使用EL表达式时使用,例如:${name}    b、在xml配置文件中,编写OGNL表达式时使用,例如:文件下载时,文件名编码: struts.xml --> ${@java.net.URLEncoder.encode(filename)} 3.3、%    在struts2中,有些标签的value属性取值就是一个OGNL表达式,例如:<s:property value="OGNL Expression"/>    还有一部分标签,value属性的取值就是普通字符串,例如:<s:textfield value="username"/>,    如果想把一个普通的字符串强制看成是OGNL表达式,就需要使用 %{} 把字符串套起来。例如:<s:textfield value="%{username}"/>。    当然在 <s:property value="%{OGNL Expression}"/> 也可以使用,但一般不会这么用,因为你两次告诉我你是OGNL表达式,不是有病吗!

4、Struts2中其他标签的使用

4.1、set标签

4.2、action标签

4.3、if标签,elseif标签 else标签

4.4、url和a标签(很有用)

修改动作名称的扩展名

四、Struts2的UI标签和主题

1、Struts2中UI标签的优势

     自动的数据回显和错误提示功能      自带的简单样式和排版

2、表单标签的通用属性

     说明:UI标签中value的取值一般都是字符串。 2.1、UI标签的通用属性

2.2、关于标签checkboxlist的使用

2.3、UI标签的小案例以及模型驱动的分析

3、UI标签的模板(主题)

3.1、struts2中默认主题    默认主题的名称是XHTML,都是在struts的默认属性文件中定义着,该文件是:default.properties,    文件位置:\struts-2.3.15.3-all\struts-2.3.15.3\apps\struts2-blank\WEB-INF\lib\struts2-core-2.3.15.3\org\apache\struts2\default.properties

3.2、更改默认主题    a、更改表单某个元素的默认主题:使用的是表单元素的theme属性。    b、更改表单所有主题:使用的是form标签的theme属性。    c、更改全站所有表单主题:是在struts.xml配置文件中,覆盖原有主题的设置。   如下图所示:

  注意:当我们使用了simple主题后,我们需要 自己添加文本信息 。原来我们在jsp中怎么写,现在还怎么写。

例如:
    <s:textfield name="name" label="用户名" />
改写为:
    用户名:<s:textfield name="name"  />

五、防止表单重复提交(使用拦截器)

1、回顾之前的解决办法:

2、Struts2中的解决办法:

2.1、使用重定向

遗留的问题:刷新页面,再提交没有问题,但是防不住后退,再提交。 2.2、表单上使用<s:token/>生成令牌,再配合token拦截器,在struts.xml中进行相关的配置

   点击后退再提交时,会提示:没有一个invalid.token的结果视图,如下图所示:

  那我们就配置一下这个invalid.token的结果视图:

遗留的问题:此种解决方式,是产生了错误之后再去告知用户,你错了。 2.3、表单上使用<s:token/>生成令牌,再配合tokenSession拦截器,在struts.xml中进行相关的配置

该拦截器只会处理第一次请求,当重复提交请求时,不会再处理。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件开发

前端MVC Vue2学习总结(二)——Vue的实例、生命周期与Vue脚手架(vue-cli)

一、Vue的实例 1.1、创建一个 Vue 的实例 每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue...

58470
来自专栏Django中文社区

Django模板标签regroup的妙用

在使用 Django 开发时,有时候我们需要在模板中按对象的某个属性分组显示一系列数据。例如博客文章按照时间归档分组显示文章列表(示例效果请看我的博客的归档页面...

34060
来自专栏用户2442861的专栏

PyQt4 - 关闭最小化问题

在这个部分,我们开始学习一些PyQt4的基本功能,解释会比较详细,就像教孩子说话一样。 最简单的example     下面的示例会非常的简单,仅仅显示...

35710
来自专栏我的小碗汤

一个神秘现象引发对beego框架的思考

小强最近在项目中遇到了一个很奇怪的问题:在整改日志规范时,为了避免影响现有的代码结构以及改动尽可能小的前提下,在调用记日志的SDK处将某一个字段值首字母改为大写...

8740
来自专栏菩提树下的杨过

Flash/Flex学习笔记(1):Hello World!

万世开头难,先来一个Hello World!吧,Adobe出了二款支持Action Script3语言的经典开发工具,即:Flash CS 与Flash Bui...

23650
来自专栏24K纯开源

Qt界面编程:窗口传值方式

1、问题   一个这样的场景:主窗口界面有一个菜单项,点击该菜单项弹出一个对话框。点击对话框上的测试按钮,显示主窗口类中的一个字符串成员的内容。这就是整个窗口传...

40070
来自专栏Golang语言社区

Go语言-base64使用

什么是base64? Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。...

464130
来自专栏ascii0x03的安全笔记

PySide——Python图形化界面入门教程(一)

PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-...

74180
来自专栏吴伟祥

Velocity语法大全 转

本文转载自:http://www.cnblogs.com/codingsilence/archive/2011/03/29/2146580.html

7340
来自专栏前端达人

2018年最全面的前端面试题都在这里了

意义:根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析。 注意: 1.尽可能少的...

5.8K70

扫码关注云+社区

领取腾讯云代金券