前篇文章对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(二) 表单参数自动封装和参数类型自动转换的更多相关文章

  1. request接收表单提交数据及其中文参数乱码问题

    一.request接收表单提交数据: getParameter(String)方法(常用) getParameterValues(String name)方法(常用) getParameterMap( ...

  2. struts2:表单标签

    目录 表单标签1. form标签2. submit标签3. checkbox标签4. checkboxlist标签5. combobox标签6. doubleselect标签7. head标签8. f ...

  3. struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

    原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($(&q ...

  4. struts2:表单标签续(datetimepicker标签)

    18. datetimepicker标签 18.1 拷贝JAR包 在struts-2.x.x压缩包的lib目录中拷贝struts2-dojo-plugin-2.3.8.jar到WEB-INF/lib目 ...

  5. 关于struts2防止表单重复提交

    struts2防表单重复提交有两种方式. 其一是action的重定向,跳转时设置type为从一个action跳转到另一个action或者另一个页面, 使用户提交后,所停留的位置,不是当前处理数据的Ac ...

  6. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  7. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  8. Struts2(接受表单参数)请求数据自动封装和数据类型转换

    Struts2请求数据自动封装: (1)实现原理:参数拦截器 (2)方式1:jsp表单数据填充到action中的属性:        普通的成员变量,必须给set,get可以不给的.    注意点,A ...

  9. 【转】Struts2解决表单重复提交问题

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

随机推荐

  1. Callback Promise Generator Async-Await 和异常处理的演进

    根据笔者的项目经验,本文讲解了从函数回调,到 es7 规范的异常处理方式.异常处理的优雅性随着规范的进步越来越高,不要害怕使用 try catch,不能回避异常处理. 我们需要一个健全的架构捕获所有同 ...

  2. 华为oj---合并数组

    题目标题: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 详细描述: 接口说明 原型: voidCombineBySort(int* pArray1,intiArray1Num,int* pAr ...

  3. ubuntu服务器远程连接xshell,putty,xftp的简单使用教程

    当你自己千辛万苦终于搞到一个服务器(ubuntu(linux)系统的)之后,却不知道怎么进行时,xshell,putty,xftp是个很不错的选择 xshell和xftp是win下访问ubuntu(l ...

  4. 无线网络中,使用MDK3把指定的用户或者热点踢到掉线

    准备 1:系统环境为ubuntu16.04, 2:需要mdk3, mdk3这个软件需要通过apt安装, 需要kali系统的源 3:需要安装aircrack-ng套件 今天这套东西,可以在未连接上靶机网 ...

  5. asp.net core mvc剖析:启动流程

    asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghelper,viewcomponent,D ...

  6. 零基础HTML编码学习笔记

    任务目的 了解HTML的定义.概念.发展简史 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 任务描述:完成一个HTML页面代 ...

  7. 数据库读写分离Amoeba

    1.理解读写分离的原理 Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql ...

  8. SQLHELPER 帮助类

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. 每天一个linux命令(32)--/etc/group文件详解

    Linux /etc/group 文件与 /etc/passwd 和/etc/shadow 文件都是有关于系统管理员对用户和用户组管理时相关的文件.Linux /etc/group 文件是有关于系统管 ...

  10. 每天一个Linux命令(12)--more命令

    more命令,功能类似cat,  cat 命令是这个文件的内容从上到下显示在屏幕上,more会以一页一页的显示方便使用者主页阅读,而最基本的指令就是按空格键就往下一页显示,按B键就会往回一页显示,而且 ...