前言

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

  struts2的文件上传下载。 把这几个功能都学会了使用之后,struts2基本上就学完了。

一、数据自动封装概述

   Struts2提供了一些基于拦截器的数据封装方式,一共有四种,分为

    静态参数封装和动态属性封装

    动态属性封装又可分为属性驱动和模型驱动

    属性驱动又可分为基本属性驱动和对象图导航语言(OGNL,Object Graph Navigation Language)驱动。

  

二、静态参数封装

  在struts.xml文件中,给动作类注入值,使用的是setter方法

  1)编写一个Action类:DemoActionTest类

package com.jxlg.web.action;

import com.opensymphony.xwork2.ActionSupport;

public class DemoActionTest extends ActionSupport{
private String username;
private String age; public String addUser(){
System.out.println(username+"---"+age);
return null;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} }

DemoActionTest

  2)struts.xml的配置

  

  3)在一个jsp中写入

    

    然后进行访问

  4)结果

    

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

  

  结论:该拦截器会将静态参数放入值栈中,而action就在值栈中的栈顶,自然就会找到该action中的对应属性,然后进行赋值了。

三、动态参数封装

  属性驱动和模型驱动都非常重要,都需要掌握,如果还不会ognl表达式,那么可以在学完ognl表达后在回过头来看即可。

3.1、属性驱动

  1)普通属性驱动,提供get、set方法。跟静态参数封装一样,只不过这里获取的是表单中的参数,也就是请求发送过来的数据。

   依靠的拦截器为params。

    index.jsp

    

    struts.xml

    

    DemoActionTest

    

    测试:

    访问index.jsp

    

    提交

    

    结果就是成功封装数据并打印出来

    

  2)ognl表达式来封装数据

    2.1)封装对象

      User.java

      

      index.jsp

      

      struts.xml

      

      DemoActionTest

      

      测试:

      访问index.jsp

      

      提交

      

      结果

      

    分析:

      在jsp页面中的user.name和user.age其实就是ognl表达式,代表着往根(root,值栈valueStack)中存放值,而值栈中的栈顶元素也就是为当前action,

      我们在action中设置user的get、set属性,即可以让存进来的值匹配到,进而将对应属性赋值成功。

    2.2)封装List集合

      index.jsp

      

      DemoActionTest

      

      结果封装成功

      分析:

        jsp中的users[0].name、users[0].age、users[1].name、users[1].age就是在给值栈中的users集合进行封装对象,users[0]代表list集合中的第一个对象。

    2.3)封装map集合

      map集合和上面的list集合类似,只不过在编写ognl表达式有些不同,

      users["lance"].name、users["lance"].age,users["lance"]代表的是map中key为lance的value,也就找到了key为lance的User对象,然后在进行封装数据即可。

3.2、模型驱动(开发中采用方式)

  要想使用模型驱动,数据模型和动作类必须分开写。
  实现数据模型的步骤:
    实现一个ModelDriven的接口
      实现接口里的方法getModel()
      在使用模型驱动的时候,数据模型必须由我们来完成实例化

  是由一个ModelDriven的拦截器帮我们做的

  1)实现ModelDriven接口和抽象方法

     实现ModelDriven接口,提供一个方法getModel(),编写对象实例。

    DemoActionTest

    

    index.jsp

    

    分析:

      这有一个专门的拦截器,叫做modelDriven。

      

      其实原理就是,该拦截器将getModel方法返回的结果压入值栈,而我们的表单参数会从值栈中从上往下进行查找,自然就直接将参数封装到User对象中了。

四、struts中的数据类型转换

  上面我们知道了struts2的方便之处,不用我们自己手动来获取请求参数了,struts2中的某些拦截器已经帮我们全部解决好了,我们只需要写get、set方法即可,真是

  非常方便,不知道大家发现了没有,从表单元素提交过来的都是String类型的,而我们在servlet中获取到表单元素后,得到的是Object类型,也就是需要我们自己手动

  转型,但是在struts2中,我们却不需要,是因为有这么一个机制,参数类型自动转型,获取过来的参数都是String类型的,但是如果我们需要int型,double型等,都会

  帮我们自己转换。

4.1、开发中数据类型变化

  1)开发中的情况

    实际开发中用户输入的数据都是String或String[].

    string/String[]——填充模型(set方法)——POJO(plain old java object)pojo中有java的数据类型

    POJO——获取(get方法)——页面展示String

  2)类型转换情况

    写数据:(增、删、改)都是String或string[]转换成其他类型

    读数据:(查)其他数据类型转换成String

  3)struts2提供的常用类型转换

    A.基本数据类型自动转换

    B.日期类型:默认按照本地日期格式转换(yyyy-MM-dd) 

    C.字符串数组:默认用逗号+空格,连接一个字符串

  test.jsp

  

  DemoActionTest

  

  分析:

    全部都自动转型了,这里需要注意一点,在使用struts2中的日期自动转型时,表单中的日期字符串的格式是固定的,必须是2014/12/06,也就是yyyy/mm/dd这样的格式,

    其他格式的话,不能够转型成功,这对有些人来说,就有些不舒服,使用习惯不一样,但是没关系,struts2能够让我们自定义类型转换器,格式让我们自己来决定。

    想了解转换器的实现原理:http://blog.csdn.net/xtayfjpk/article/details/16826649

4.2、自定义类型转换器

  

  从这张图可以看的出来如果你想要自定义一个类型转换器的话需要集成StrutsTypeConverter类

  只需要两步即可完成:

    1)继承DefaultTypeConverter类,重写convertValue方法 

    2)注册转换器。也就是该转换器的作用范围。局部配置和全局配置。

  1)创建一个MyConvertor继承StrutsTypeConverter类

  

  2)注册类型转换器

    2.1)注册,局部配置

      位置:action类同包

      名称:actionClass-conversion.properties

        actionClass:action类的类名

        conversion.properties:固定名

      

      内容:

       属性=转换器类的全限定类名

      

    这样一来,我们自定义的转换器就只能在Demo01Action中属性名为date身上使用了,超过了该范围,就会使用struts2默认的转换器。

    2.2)注册,全局配置

      位置:src

      名称:xwork-conversion.properties

      

      内容:需要转换得类=转换器

      

      全局配置后,所有在struts2中使用Date型的都会用我们写的转换器进行转换。

4.3、转换失败后的处理(重点)

  当转换失败后,页面的提示

  

  解决办法:配置回显结果试图

  

总结:

  1)首先,我们在也不需要手动表单提交的参数了,并且也无需对获取到的参数进行转换类型了,这将非常方便,使用起来真的非常爽,直接拿过来用即可。

        而我们常用的应该为动态参数封装了,其中更为常用的是使用modelDriven,或者直接使用ognl表达式进行封装。

  2)感受到了struts2架构中的拦截器的作用,确实帮我们做了不少事情,了解了几个拦截器的功能,比如params,staticParams、modelDriven等的使用。

喜欢就点个“推荐”哦!  

struts2(三)之表单参数自动封装与参数类型自动转换的更多相关文章

  1. Struts2 Action接收表单参数

    struts2 Action获取表单传值    1.通过属性驱动式    JSP:        <form action="sys/login.action" method ...

  2. DB2支持的三种表空间SMS、DMS、DMS的自动存储

    DB2支持的三种表空间SMS.DMS.DMS的自动存储 DB2中,表空间是数据库与这个数据库中存储的表之间的逻辑层.表空间在数据库中创建,表在表空间中创建.容器是一个物理存储设备.它可以由目录名.设备 ...

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

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

  4. 【Struts2】防止表单重复提交

    一.概述 二.Struts2中解决方案 三.实现步骤 一.概述 regist.jsp----->RegistServlet 表单重复提交 危害: 刷票. 重复注册.带来服务器访问压力(拒绝服务) ...

  5. struts2之防止表单重复提交

    struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  6. struts2的防止表单重复提交

    防止表单重复提交其实就是struts2的一个拦截器的使用: struts.xml配置文件: <?xml version="1.0" encoding="UTF-8& ...

  7. BootStrap 智能表单系列 三 分块表单配置的介绍

    相信广大博友肯定碰到过一个编辑页面分了很多块的情况,智能表单插件已经为您支持了这种情况, 代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartF ...

  8. BootStrap 智能表单系列 二 BootStrap支持的类型简介

    代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/master/demo/form1-basic.html): <! ...

  9. struts2(二) 表单参数自动封装和参数类型自动转换

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

随机推荐

  1. 43.Linux调试测试输入思路

    当产品要发布之前,都会进行反复的测试输入,比如:测试按键,遥控,触摸等等. 当出现bug时,就还需要不停地找规律,修改程序,直到修复成功,会显的非常麻烦 答: 可以通过之前在35.Linux-分析并制 ...

  2. Spring框架中ModelAndView、Model、ModelMap区别

    原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别   注意:如果方法 ...

  3. jquery如此强大,为什么还要写原生呢?

    这是一个伪标题,其实是一篇年终总结. 在这家公司一年多,蛮多收获的.大部分来自自己,小部分来自公司. 做前端开发到现在,我觉得可以分为两部分. 前半部分做项目用原生js,jquery以及各种基于jq的 ...

  4. Swift MD5加密 所需桥接文件

    Swift MD5加密在github有一个非常好的第三方库,使用也比较简单,还有很多加密方法,如果需要,点击这里下载 对于那些不需要太多的加密,只需要MD5加密的同学,我建议还是不要用第三方库. 因为 ...

  5. C:数据结构与算法之顺序表

    顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表 /* Note:Your choice ...

  6. 如果没有UX经验,如何创建个人UX作品集?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 一直以来,这是设计行业的悖论. 当今,许多活跃于我们用户体验行业的专业人士在开始个人职业生涯时都面临 ...

  7. SpringMVC处理multipart请求.

    一.简述 multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域.在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是 ...

  8. template package (godoc 翻译)

    template 包 概述(Overview) template 包实现了数据驱动模板用于生成文本输出. 要生成HTML输出,请参阅html/template包,它具有与此包相同的接口,但会自动保护H ...

  9. spring boot 遇到 supported setting property http://xml.org/sax/properties/lexical-handler

    解决链接:http://apache-fop.1065347.n5.nabble.com/org-xml-sax-SAXNotSupportedException-thrown-by-FOP-td11 ...

  10. oracle 处理时间和金额大小写的相关函数集合

    CREATE OR REPLACE FUNCTION MONEY_TO_CHINESE(MONEY IN VARCHAR2) RETURN VARCHAR2 IS C_MONEY ); M_STRIN ...