开发者社区> 黑泽明军> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

day27_Struts2学习笔记_04

简介: 一、contextMap中的数据操作 1、存数据:    需要熟悉 ActionContext类 和 ValueStack接口 的 API 。框架为我们存数据。 1.1、利用 ActionContext 存数据   我们先看看 ActionContext.class 的源码:  1.2、利用 ValueStack 存数据   a、如何获取ValueStack呢?   b、ValueStack中的getRoot()方法。
+关注继续查看

一、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中进行相关的配置
 
  该拦截器只会处理第一次请求,当重复提交请求时,不会再处理。
我的GitHub地址:https://github.com/heizemingjun
我的博客园地址:http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址:http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
struts2学习笔记(上)
struts2学习笔记(上)
19 0
JAVA学习笔记- - - day 2
# 封装(重点) ​ 目的:提高数据的安全性,通过封装,可以实现对属性访问权限的控制,同时增加了程序的可维护性。 ​ 封装: 将属性私有化,使用private关键字修饰属性,这种属性只有当前类才能访问。 ​ 我们一般给每一个私有属性提供公共public的get和set这种方法供外界来访问我们的私有属性 ​ public 修饰符的作用范围: private 作用范围 protected 的作用范围 default 的作用范围: | | 用一个类 | 同一个包
11 0
Struts2入门 | 学习笔记
快速学习 Struts2入门,介绍了 Struts2入门系统机制, 以及在实际应用过程中如何使用。
12 0
学习笔记2
学习笔记2
30 0
day25_Struts2学习笔记_01
一、框架概述   把重复性的繁琐的代码封装起来。使程序员在编码中把更多的精力放业务需求的分析和理解上面。  特点:封装了很多细节,程序员在使用的时候会非常简单。 三大框架:Struts2、Spring、Hibernate 二、三层架构与Struts2 表现层:M model V view C control 业务层:Service 持久层:Dao data access object Struts2在三层架构中的位置是处于表现层。
1774 0
day14_DBUtils学习笔记
一、DBUtils介绍 Apache公司开发的框架。 什么是dbutils?它的作用?   DBUtils是java编程中的数据库操作实用工具,小巧简单实用。   DBUtils封装了对JDBC的操作,简化了JDBC操作。
2043 0
day08_Servlet学习笔记
============================================================ 一、什么是Servlet?(非常非常重要)   servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。
1212 0
day02_css学习笔记
day02_css学习笔记 ============================================================================= =========================================================...
1141 0
struts2学习笔记1
struts框架可以提供对前端请求的封装和重定向,提高开发效率,对程序代码进行解耦 使用struts2的步骤.  1首先引入struts2核心包, 2在web,xml中配置filter struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*index.jsp /*表示拦截所有请求。
954 0
+关注
黑泽明军
斯人若彩虹,遇上方知有。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载