首页 > 代码库 > Java Struts2 (三)

Java Struts2 (三)

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存数据

技术分享

 

1.2、利用ValueStack存数据

a、如何获取ValueStack

 技术分享

 

bValueStack中的getRoot()方法:

 技术分享

 

cCompoundRoot是什么:

 技术分享

 

d、栈操作:

 

技术分享

 

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

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

2.1、使用s:property取数据

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

 技术分享技术分享

技术分享

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

技术分享

技术分享

 

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

 技术分享

技术分享技术分享

 

 技术分享

 

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

技术分享

 

 技术分享

OGNL的使用总结:

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

2.contextMapkey的值,要使用#

2.2ValueStack的其他方法

asetValue方法

 技术分享技术分享

技术分享

 

Jsp页面上获取【李四】技术分享技术分享

 

 

bset方法

 技术分享技术分享技术分享

 

 

 

细节问题:

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

 技术分享

 

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

 技术分享

 

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

 技术分享技术分享

 

 

二、Struts2EL的改变

1Struts2中使用EL的问题:

前提:

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

 技术分享技术分享

技术分享技术分享

 

 

 

 

问题:

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

2、关于EL问题的分析:

分析:

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

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

 技术分享

 

 技术分享

 

3Struts2EL查找顺序改变总结:

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

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

4OGNL的特殊说明:

 技术分享技术分享

 

 

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

 技术分享

 

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

1iterator标签(很重要)

 技术分享技术分享

 

 

 技术分享

 

2OGNL投影(了解)

2.1、使用过滤条件投影

 技术分享

 

2.2、投影指定属性

 技术分享

 

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

3.1#

a、取contextMapkey时使用,例如<s:property value="http://www.mamicode.com/#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="http://www.mamicode.com/OGNL Expression" />

还有一部分标签,value属性的取值就是普通字 符串,例如<s:textfield value="http://www.mamicode.com/username"/>,如果想把一个普通的字符串强制看成时OGNL,就需要使用%{}把字符串套起来。

例如<s:textfield value="http://www.mamicode.com/%{username}"/>。当然在<s:property value="http://www.mamicode.com/%{OGNL Expression}" />也可以使用,但不会这么用。

4、其他标签

4.1set标签

 技术分享技术分享

 

 

4.2action标签

 技术分享技术分享

 

 

4.3if标签,elseif标签 else标签

 技术分享技术分享

 

 

4.4urla标签(很有用)

 技术分享

 

四、Struts2UI标签和主题

1Struts2UI标签的优势

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

自带的简单样式和排版

2、表单标签的通用属性

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

2.1UI标签的通用属性

 技术分享

 

2.2、关于checkboxlist的使用:

 技术分享

技术分享

 

 

 技术分享

 

 技术分享

 

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

 

 技术分享

 

 技术分享

技术分享

 

3UI标签的模板(主题)

3.1struts2中默认主题

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

 技术分享

 

 技术分享技术分享

 

 

3.2、更改默认主题

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

 技术分享

 

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

 技术分享

 

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

 技术分享

 

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

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

 技术分享

 

2Struts2中的解决办法:

2.1、使用重定向

 技术分享

 

 

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

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

 技术分享

技术分享

 

 

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

 技术分享

 

配置结果视图:

 技术分享

 

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

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

 技术分享

 

Java Struts2 (三)