Java Struts2 (四) 二、Struts2对EL的改变 三、OGNL配合通用标签的其他使用 四、Struts2的UI标签和主题 五、防止表单重复提交(拦截器)

一、contextMap中的数据操作

root根:List

元素1

元素2

元素3

元素4

元素5

contextMapMap

key

value

application

Map

key

value

name

test

session

Map

request

Map

attr

Map

1、存数据:

需要熟悉ActionContextvalueStackAPI。框架为我们存数据。

1.1、利用ActionContext存数据

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

1.2、利用ValueStack存数据

a、如何获取ValueStack

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

bValueStack中的getRoot()方法:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

cCompoundRoot是什么:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

d、栈操作:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

使用OGNL表达式来去,struts2OGNL表达式必须写在struts2标签中。

2.1、使用s:property取数据

a、取contextMap中的数据,需使用#

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

如果遇有对象属性重名,可以通过OGNL表达式,选择查找的起始位置

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

OGNL的使用总结:

1.中对象的属性不使用#

2.contextMapkey的值,要使用#

2.2ValueStack的其他方法

asetValue方法

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Jsp页面上获取【李四】Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

bset方法

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器) 

细节问题:

当按照如下方式,往根中存放数据时,根中元素是什么顺序?

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

使用<s:debug/>标签查看:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

cfindValue:我们在Jsp上调用的都是findValue

 Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

1Struts2中使用EL的问题:

前提:

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

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

 Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

问题:

我们放到请求域中的属性,使用EL表达式取出来了。但是放到应用域中的属性,使用EL表达式没取出来。

2、关于EL问题的分析:

分析:

我们知道EL表达式是从四大域对象中依次查找属性。搜索范围是由小到大。page Scope————>request Scope————>sessionScope————>application Scope

但是通过测试发现,搜索完request范围后就没有继续搜索,而是返回了ValueStack中栈顶对象name属性的值。

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

3Struts2EL查找顺序改变总结:

  EL表达式: page Scope————>request Scope————>sessionScope————>application Scope

OGNL表达式:page Scope————>request Scope————>valueStack(根中)————>contextMap————>sessionScope————>application Scope

4OGNL的特殊说明:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

 Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

注意:以下内容知道即可。

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

1iterator标签(很重要)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

 Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

2OGNL投影(了解)

2.1、使用过滤条件投影

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

2.2、投影指定属性

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

3.1#

a、取contextMapkey时使用,例如<s:property value="#name" />

bOGNL中创建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}" />也可以使用,但不会这么用。

4、其他标签

4.1set标签

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

4.2action标签

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

 4.3if标签,elseif标签 else标签

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

4.4urla标签(很有用)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

四、Struts2UI标签和主题

1Struts2UI标签的优势

自动的数据回显和错误提示功能

自带的简单样式和排版

2、表单标签的通用属性

 说明:UI标签中value的取值一般都是字符串。

2.1UI标签的通用属性

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

2.2、关于checkboxlist的使用:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

3UI标签的模板(主题)

3.1struts2中默认主题

默认主题的名称是XHTML,都是在struts的默认属性文件中定义着:default.properties

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

3.2、更改默认主题

a、更改表单某个元素的默认主题:使用的是表单元素的theme属性。

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

b、更改表单所有主题:使用的是form标签的theme属性。

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

c、更改全站所有表单主题:是在struts.xml配置文件中,覆盖原有主题的设置。

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

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

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

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

2Struts2中的解决办法:

2.1、使用重定向

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

遗留的问题:防不住后退,再提交。

2.2、使用<s:token/>生成令牌配合token拦截器

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

点击后退的时候,会提示:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

配置结果视图:

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)

遗留的问题:此种解决方式,是产生了错误之后再告知用户,你错了。

2.3使用<s:token/>生成令牌配合tokensession拦截器

Java Struts2 (四)
二、Struts2对EL的改变
三、OGNL配合通用标签的其他使用
四、Struts2的UI标签和主题
五、防止表单重复提交(拦截器)