请求数据自动封装:

实现原理:使用了参数拦截器。struts-default.xml中

<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

方式一:JSP页面表单数据填充到action中的属性

方式二:JSP页面表单数据填充到action的对象中的属性

方式一:JSP页面表单数据填充到action中的属性

注册页面:register.jsp:

<body>
      <form action="${pageContext.request.contextPath }/user_register.action" method="post">
          用户名:<input type="text" name="name"><br/>
          密码:<input type="text" name="pwd"><br/>
          年龄:<input type="text" name="age"><br/>
          生日:<input type="text" name="birth"><br/>

          <input type="submit" value="注册">
      </form>
  </body>

处理action:

/**
 * Struts核心业务: 请求数据自动封装以及类型转换*/
public class UserAction {

  //请求数据封装
private String name;//这里的字段名字必须与jsp中的名字一致
   private String pwd;
private int age;
  private Date birth; //。。。对应的get,set方法// 处理注册请求 public String register() { System.out.println(user.getName()); System.out.println(user.getPwd()); System.out.println(user.getAge()); System.out.println(user.getBirth()); return "success"; } }

方式二:JSP页面表单数据填充到action的对象中的属性

一般使用对象来封装数据,而不是用字段。

/**
 * Struts核心业务: 请求数据自动封装以及类型转换*/
public class UserAction {

     // 对象类型,一定给get方法
    private User user;
    public void setUser(User user) {
        this.user = user;
    }
    public User getUser() {
        return user;
    }

    // 处理注册请求
    public String register() {
        System.out.println(user.getName());
        System.out.println(user.getPwd());
        System.out.println(user.getAge());
        System.out.println(user.getBirth());
        return "success";
    }
}

对应的前端jsp页面:

<body>
      <form action="${pageContext.request.contextPath }/user_register.action" method="post">
          用户名:<input type="text" name="user.name"><br/>
          密码:<input type="text" name="user.pwd"><br/>
          年龄:<input type="text" name="user.age"><br/>
          生日:<input type="text" name="user.birth"><br/>

          <input type="submit" value="注册">
      </form>
  </body>

类型自动转换:

在Struts中jsp提交的数据,Struts会自动转换为action中对应属性的类型,对于基本数据类型以及日期类型会自动转换。

注意:前端jsp提交的日期类型在struts中只支持yyyy-MM-dd格式,如2016-11-21,如果在jsp页面中的生日格式用20161121   服务端会报错。

所以如果需要使用其他的日期类型格式,需要自定义类型转换器。

类型转换器分为:

  局部类型转换器

  全局类型转换器

Struts2的自定义类型转换器:

  struts的转换器api:可以查看struts.chm文档

  |--TypeConverter    转换器接口

    |--DefaultTypeConverter   默认的类型转换器类  

      |--StrutsTypeConverter 用户编写的转换器类继承此类

Struts2中如何配置自定义转换器:

  1.写一个类继承StrutsTypeConverter

  2.重写convertFromString和convertToString方法

  3.注册转换器

    3.1在action所在包中建立Action名-conversion.properties

    3.2 在3.1文件中添加以下数据

    需要转换的字段名=自定义转换器类的权限定名

    birthday=xx.convertor.DateTypeConvertor

  

转换器开发步骤:

1.写转换器类

2.配置转换器类,告诉struts应用你写的转换器类

  --在同包的action目录下,新建一个properties文件

  --命名规则:ActionClassName-conversion.properties

举例:

1. 自定义类型转换器类

/**
 * 自定义类型转换器类*/
public class MyConverter extends StrutsTypeConverter {

    // 新需求: 要求项目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..

    // 先定义项目中支持的转换的格式
    DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyyMMdd"),
            new SimpleDateFormat("yyyy年MM月dd日") };

    /**
     * 把String转换为指定的类型 【String To Date】
     * @param context 当前上下文环境
     * @param values  jsp表单提交的字符串的值
     * @param toClass 要转换为的目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
         
// 判断: 内容不能为空 if (values == null || values.length == 0) { return null; } // 判断类型必须为Date if (Date.class != toClass) { return null; } // 迭代:转换失败继续下一个格式的转换; 转换成功就直接返回 for (int i=0; i<df.length; i++) { try { return df[i].parse(values[0]); } catch (ParseException e) { continue; } } return null; } @Override public String convertToString(Map context, Object o) { return null; } }

2. 在action的同包下,新建一个文件UserAction-conversion.properties

  内容为:user.birth=转换器类的全路径,即MyConverter的完整路径名称

注意:以上的转换器注册时候是与action的名字相耦合的,因此只能在自己的action中内部使用,项目中其他的action是不能用该转换器的,称之为局部转换器注册方式。

那如何定义全局类型转换器呢???

需要写一个转换器,给所有的action用。与局部类型转换器开发过程一样,只是配置的不一样。

配置全局类型转换器:

  1.在项目的src目录下新建一个固定文件:xwork-conversion.properties

  2.在该文件中添加以下数据

    需要转换的类类型=转换器类的权限定名

    如:java.util.Date=xxx.converter.DateConverter(即,当遇到日期类型的时候,就用xxx.converter.DateConverter转换器)该转换器并没有与任何的action关联,是一个全局的类型转换器。

如果局部转换器已经有了,就不再用全局的了,采用就近原则。

Struts2 请求数据的自动封装 及 自定义转换器类的更多相关文章

  1. @ConfigurationProperties注解对数据的自动封装

    @ConfigurationProperties注解对数据的自动封装 @ConfigurationProperties可以对基本数据类型实现自动封装,可以封装格式为yyyy/MM/dd的日期 测试代码 ...

  2. angular开发中对请求数据层的封装

    代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...

  3. asp.net中Request请求参数的自动封装

    这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns= ...

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

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

  5. struts中的请求数据自动封装

    Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中.该工作主要是由Parameters拦截器做的.而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作.在st ...

  6. 20.struts2的数据填充和类型转换.md

    目录 1. struts2的自动填充 2. struts2的对象填充 3. struts2的类型转换器 3.1 类继承关系 3.2 局部转换器 3.3 全局转换器 3.4 注意 1. struts2的 ...

  7. Struts2.0 封装请求数据和拦截器介绍

    1. Struts2 框架中使用 Servlet 的 API 来操作数据 1.1 完全解耦合的方式 Struts2 框架中提供了一个 ActionContext 类,该类中提供了一些方法: stati ...

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

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

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

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

随机推荐

  1. css3 box-shadow 阴影的用法

    text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...

  2. velocity的宏

    velocity中的宏macro的使用当中,由于velocity会将宏加载到tomcat中去,但是如果修改之后再加载的话velocity发现有了相同的宏名称,则不会加载 所以这时候的问题就是,在页面上 ...

  3. ejabberd组成模块

    转自:http://blog.sina.com.cn/u/1776260990 mod_adhoc 特定命令 (XEP-0050) mod_announce 管理公告推荐 mod_adhoc mod_ ...

  4. redis的常用命令

    键值得相关命令: keys * 返回满足给定patternd的所有key exists 确认一个key是否存在 del 删除一个key expire 设置一个key的过期时间 ttl 查看过期时间还有 ...

  5. RegOpenKey(注册表定位器) 1.5 中文免费绿色版

    软件名称: RegOpenKey(注册表定位器) 1.5 中文免费绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Wi ...

  6. Javascript兑现图片预加载【回调函数,多张图片】 (转载)

    Javascript实现图片预加载[回调函数,多张图片] 使用JS实现一组图片动画效果或者使用HTML5 Canvas渲染一系列图片等案例中,需要图片全部加载完成方可运行动画效果.此时程序中就会涉及多 ...

  7. 如何为CentOS 7配置静态IP地址

    问题:在CentOS 7上,我想要将我其中一个网络接口从DHCP改为静态IP地址配置,如何才能永久为CentOS或RHEL 7上的网络接口分配静态IP地址? 如果你想要为CentOS 7中的某个网络接 ...

  8. 笨方法学python--读文件

    1 raw_input()的另外用法 prompt = '> ' likes = raw_input(prompt) 提示符> 可以不用每次输入,要修改,只修改一个地方. 2 读取文件 t ...

  9. mysql5.7.16安装

    系统:centOS6.5 mysql: 5.7.16 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-linux-glib ...

  10. ACE_Event_Handler:事件响应入口

    1:ACE_Event_Handler类 头文件“Event_Handler.h” 在ACE Reactor框架中,ACE_Event_Handler是所有事件处理器的基类.ACE_Event_Han ...