Struts2学习(二)———— 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化,struts2的文件上传下载。 把这几个功能都学会了使用之后,struts2基本上就学完了。所以接下来的文章就是对这几个功能进行讲解。如何使用。而进行就对数据自动封装和数据类型自动转型进行讲解。
一、数据自动封装
包括三个方面,而我们就是从这三个方面下手去讲解(注明:该小节是学习该博文http://blog.csdn.net/q547550831/article/details/53323206 写的很不错,所以我就自己实现了一遍,大家随便去哪边都是一样的。)

1.1、静态参数封装(了解)
action获取struts.xml中的参数
struts.xml
action

结果

staticParams拦截器,我们来看看是怎么进行封装的。


直接说结论吧,该拦截器会将静态参数放入值栈中,而action就在值栈中的栈顶,自然就会找到该action中的对应属性,然后进行赋值了。。想查看源码,参考该篇博文:http://blog.csdn.net/xtayfjpk/article/details/14133589
1.2、动态参数封装(掌握)
属性驱动和模型驱动都非常重要,都需要掌握,如果还不会ognl表达式,那么可以在学完ognl表达后在回过头来看即可。
1.2.1、属性驱动
1.2.1.1普通属性驱动,提供get、set方法。跟静态参数封装一样,只不过这里获取的是表单中的参数,也就是请求发送过来的数据。依靠的拦截器为params
param.jsp
action
结果就是成功封装数据并打印出来。
params拦截器


通过查看该博文http://blog.csdn.net/xtayfjpk/article/details/14180981 来了解其源码,其中该拦截器做的事有两件,一是对提交的参数进行数据校验,判断是否合法,判断是否合法的标准就是拦截器中的excludeParams参数的正则表达式的值。二是将其封装到值栈中的栈顶元素中去,而当前action就在栈顶,所以能够将参数放入action中。
1.2.1.2、ognl表达式来封装数据
封装对象
params.jsp

action

User.java

结果
分析:
在jsp页面中的user.name和user.age其实就是ognl表达式,代表着往根(root,值栈valueStack)中存放值,而值栈中的栈顶元素也就是为当前action,我们在action中设置user的get、set属性,即可以让存进来的值匹配到,进而将对应属性赋值成功。
封装List集合。
params.jsp

action
User.java

结果封装成功
分析:
jsp中的users[0].name、users[0].age、users[1].name、users[1].age就是在给值栈中的users集合进行封装对象,users[0]代表list集合中的第一个对象,
封装map集合
map集合和上面的list集合类似,只不过在编写ognl表达式有些不同,users["wuhao"].name、users["wuhao"].age,users["wuhao"]代表的是map中key为wuhao的value,也就找到了key为wuhao的User对象,然后在进行封装数据即可。
1.2.2、模型驱动
1.2.2.1、实现ModelDriven接口和抽象方法
实现ModelDriven接口,提供一个方法getModel(),编写对象实例。
action

其他配置省略,就这样就可以将表单提交的数据封装到User对象中了
分析:这有一个专门的拦截器,叫做modelDriven。


源码分析:http://blog.csdn.net/xtayfjpk/article/details/14004457
其实原理就是,该拦截器将getModel方法返回的结果压入值栈,而我们的表单参数会从值栈中从上往下进行查找,自然就直接将参数封装到User对象中了。
1.2、参数类型自动转型
上面我们知道了struts2的方便之处,不用我们自己手动来获取请求参数了,struts2中的某些拦截器已经帮我们全部解决好了,我们只需要写get、set方法即可,真是非常方便,不知道大家发现了没有,从表单元素提交过来的都是String类型的,而我们在servlet中获取到表单元素后,得到的是Object类型,也就是需要我们自己手动转型,但是在struts2中,我们却不需要,是因为有这么一个机制,参数类型自动转型,获取过来的参数都是String类型的,但是如果我们需要int型,double型等,都会帮我们自己转换。
jsp页面
action

结果:

分析:全部都自动转型了,这里需要注意一点,在使用struts2中的日期自动转型时,表单中的日期字符串的格式是固定的,必须是2014/12/06,也就是yyyy/mm/dd这样的格式,其他格式的话,不能够转型成功,这对有些人来说,就有些不舒服,使用习惯不一样,但是没关系,struts2能够让我们自定义类型转换器,格式让我们自己来决定。
想了解转换器的实现原理:http://blog.csdn.net/xtayfjpk/article/details/16826649
自定义日期转换器
只需要两步即可完成
1、继承DefaultTypeConverter类,重写convertValue方法
2、注册转换器。也就是该转换器的作用范围。局部配置和全局配置。
第一步
第二步
注册,局部配置
位置:action类同包
名称:actionClass-conversion.properties
actionClass:action类的类名
conversion.properties:固定名
内容:
属性=转换器类的全限定类名
这样一来,我们自定义的转换器就只能在Demo01Action中属性名为date身上使用了,超过了该范围,就会使用struts2默认的转换器。
注册,全局配置
位置:src
名称:xwork-conversion.properties
内容:需要转换得类=转换器
全局配置后,所有在struts2中使用Date型的都会用我们写的转换器进行转换。
二、总结
说完这两个功能,我们应该能够感受到struts2给我们带来的一点点便利了,
1、首先,我们在也不需要手动表单提交的参数了,并且也无需对获取到的参数进行转换类型了,这将非常方便,使用起来真的非常爽,直接拿过来用即可。
而我们常用的应该为动态参数封装了,其中更为常用的是使用modelDriven,或者直接使用ognl表达式进行封装。
2、感受到了struts2架构中的拦截器的作用,确实帮我们做了不少事情,了解了几个拦截器的功能,比如params,staticParams、modelDriven等的使用。
3、涉及到了一些ognl表达式和值栈的知识,暂时不懂没关系,后面学到了,在回过头来看看。
Struts2学习(二)———— 表单参数自动封装和参数类型自动转换的更多相关文章
- Bootstrap基础学习(二)—表单
一.表单 1.基本格式 <!-- 基本格式 --> <form> <div class="form-group"> <label>姓 ...
- bootstrap基础学习【表单含按钮】(二)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Struts2 Action接收表单参数
struts2 Action获取表单传值 1.通过属性驱动式 JSP: <form action="sys/login.action" method ...
- request接收表单提交数据及其中文参数乱码问题
一.request接收表单提交数据: getParameter(String)方法(常用) getParameterValues(String name)方法(常用) getParameterMap( ...
- 【Struts2】防止表单重复提交
一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) ...
- struts2之防止表单重复提交
struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- struts2的防止表单重复提交
防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...
- struts2(二) 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...
- struts2(三)之表单参数自动封装与参数类型自动转换
前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...
随机推荐
- win7 home 提升 admin, pip
以管理员权限运行cmd cmd 右击‘以管理员身份运行’ 输入net user administrator /active:yes 取消为 net user administrator /acti ...
- boost asio 学习(一)io_service的基础
原文 http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio/ 编译环境 b ...
- leveldb 学习记录(一) skiplist
leveldb LevelDb是一个持久化存储的KV系统,并非完全将数据放置于内存中,部分数据也会存储到磁盘上. 想了解这个由谷歌大神编写的经典项目. 可以从数据结构以及数据结构的处理下手,也可以从示 ...
- 转载-对js中new、prototype的理解
说明:本篇文章是搜集了数家之言,综合的结果,应向数家致谢 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/java ...
- STM32 + RC522(SPI2 和 模拟SPI)
STM32 + RC522(SPI2 和 模拟SPI) 一. STM32 + RC522(SPI2 模式) 1. 头文件: rc522.h #include "stm32f10x.h&quo ...
- HNOI 2018 简要题解
寻宝游戏 毒瘤题. 估计考试只会前30pts30pts30pts暴力然后果断走人. 正解是考虑到一个数&1\&1&1和∣0|0∣0都没有变化,&0\&0& ...
- 算法竞赛新编??---WERTYU,UVa10082
P47 例题:3-2 WERTYU,UVA10082 注:作者的想法是找出输入字符在常量数组中的位置(使用for( i = 1; s[i] && s[i] != c;i++);语句来 ...
- Codeforces Round #539 (Div. 2) D 思维
https://codeforces.com/contest/1113/problem/D 题意 将一个回文串切成一段一段,重新拼接,组成一个新的回文串,问最少切几刀 题解 首先无论奇偶串,最多只会切 ...
- Java学习笔记38(字符流)
字符输出流:Writer类:使用时候需要它的子类 局限性:只能写文本文件,无法写其他文件 方法: package demo; import java.io.FileWriter; import jav ...
- 闲话ajax,例ajax轮询,ajax上传文件[开发篇]
引语:ajax这门技术早已见怪不怪了,我本人也只是就自己真实的经验去总结一些不足道的话.供不是特别了解的朋友参考参考! 本来早就想写一篇关于ajax的文章的,但是前段时间一直很忙,就搁置了,趁着元旦放 ...