Java Struts2 (四)
一、contextMap中的数据操作
|
root根:List
|
||||||||||||||
|
contextMap:Map
|
1、存数据:
需要熟悉ActionContext和valueStack的API。框架为我们存数据。
1.1、利用ActionContext存数据

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

b、ValueStack中的getRoot()方法:

c、CompoundRoot是什么:

d、栈操作:

2、取数据:用Struts2的标签(OGNL表达式)在JSP上(用的最多)
使用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。
2.1、使用s:property取数据
a、取contextMap中的数据,需使用#



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


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




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


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



在Jsp页面上获取【李四】

b、set方法



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

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


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

二、Struts2对EL的改变
1、Struts2中使用EL的问题:
前提:
我们应该知道,如果我们没有往值栈(根)中放入数据的话,那么我们的动作类默认是在值栈的栈顶。




问题:
我们放到请求域中的属性,使用EL表达式取出来了。但是放到应用域中的属性,使用EL表达式没取出来。
2、关于EL问题的分析:
分析:
我们知道EL表达式是从四大域对象中依次查找属性。搜索范围是由小到大。page Scope————>request Scope————>sessionScope————>application Scope
但是通过测试发现,搜索完request范围后就没有继续搜索,而是返回了ValueStack中栈顶对象name属性的值。


3、Struts2中EL查找顺序改变总结:
EL表达式: page Scope————>request Scope————>sessionScope————>application Scope
OGNL表达式:page Scope————>request Scope————>valueStack(根中)————>contextMap————>sessionScope————>application Scope
4、OGNL的特殊说明:


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

三、OGNL配合通用标签的其他使用
1、iterator标签(很重要)



2、OGNL投影(了解)
2.1、使用过滤条件投影

2.2、投影指定属性

3、Struts2中#,$,%符号的使用(重要)
3.1、#
a、取contextMap中key时使用,例如<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}" />也可以使用,但不会这么用。
4、其他标签
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



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

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

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

五、防止表单重复提交(拦截器)
1、回顾之前的解决办法:

2、Struts2中的解决办法:
2.1、使用重定向

遗留的问题:防不住后退,再提交。
2.2、使用<s:token/>生成令牌配合token拦截器


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

配置结果视图:

遗留的问题:此种解决方式,是产生了错误之后再告知用户,你错了。
2.3、使用<s:token/>生成令牌配合tokensession拦截器

Java Struts2 (四)的更多相关文章
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- Java的四种内部类
Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...
- Java实验四
20145113 Java实验四 快捷键 之前没怎么记ISDEA的快捷键,但是熟练使用快捷键可以带来很多的便利,于是先开始学习一些常用的快捷键,就采用它默认的快捷键,这样后期就不会出现冲突,一些and ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- 小兵眼中的Java Struts2
老魏终于可以回园子了,但是这次要慢慢的回来,不能一下子回来,这段时间除了要照顾刚出生的小女儿,还要做项目.说实在的老魏时间真是有限,不能照顾到园子的文章了,所以只能慢慢的回来写文章了.抱歉! ...
- java中四种引用类型
java中四种引用类型 今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...
- 《Thinking In Java第四版》拾遗
<Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...
- Java第四次上课博文动手动脑
Java第四次上课博文动手动脑 1. 查看String.equals()方法 public class StringEquals { /** * @param args the command ...
- Java进阶(四十七)Socket通信
Java进阶(四十七)Socket通信 今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...
- Java进阶(四十三)线程与进程的区别
Java进阶(四十三)线程与进程的区别 1.线程的基本概念 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必 ...
随机推荐
- 简述Dubbo
目前处于实习期间,白天工作,网上自主学习.最近没事逛了一下当前招聘网上的招聘要求,其中dubbo这个关键字出现的比较多,因此花了点时间学习了一番,在这写写自己的理解. 说起Dubbo,得先聊聊RPC, ...
- (二)Audio子系统之new AudioRecord()(Android4.4)
在上一篇文章<(一)Audio子系统之AudioRecord.getMinBufferSize>中已经介绍了AudioRecord如何获取最小缓冲区大小,接下来,继续分析AudioReco ...
- Eureka 高可用 - 踩坑回忆
1.application.yml中eureka配置更改 ## Eurake 公用配置 ## 向其他注册中心注册 eureka.client.register-with-eureka=true ## ...
- 论文阅读 | CornerNet:Detecting Objects as Paired Keypoints
论文地址:https://arxiv.org/abs/1808.01244v1 论文代码:https://github.com/umich-vl/CornerNet 概述 CornerNet是一篇发表 ...
- 使用Session监听器实现统计在线人数
使用Session监听器实现统计在线人数 1.工作目录结构 包含监听器类和jsp页面 2.session监听器 首先利用session监听器来实现对访问网站时的session计数,当有session创 ...
- Form Authentication
1.创建登陆的控制器和视图,实现登陆基本功能 2.创建视图模型,并在Action里面引用. 3.创建一个接口两个类,那个IUserPricipal接口要实现IPrincipal接口,UserPrici ...
- Kettle 中生成随机数 或者GUID唯一标识符
添加步骤 "生成随机数" 英文名字叫 "Generate Random Value" 如下图..选择UUID..
- Android自动化之AccessibilityService
简介demo示例说明Manifest声明AccessibilityService的XML配置文件创建继承自AccessibilityService的服务类MainActivity检测服务是否开启UiA ...
- Win7/Vista/Server2008下VS 环境 调试调用 HTTP.SYS 无法启动监听服务及启动后其他机器无法访问端口
一. VS调试在Win7(vista系列)操作系统下 HttpListener无法绑定多个 指定IP.端口问题 来自:http://www.cnblogs.com/ryhan/p/4195693.ht ...
- Python数据类型(数字)
文章内容参考了教程:http://www.runoob.com/python/python-basic-syntax.html#commentform Python 变量类型 变量存储在内存中的值.这 ...