zoukankan      html  css  js  c++  java
  • struts2框架之类型转换(参考第二天学习笔记)

    类型转换

    1. 什么是类型转换

    刚才学习了封装请求参数,把表单数据封装到Action(模型)的属性中。表单中的数据都是String类型,但Action(模型)的属性不一定什么类型。
    将来我们还需要数据的回显,即把Action的属性值显示到表单中。把Actoin的属性显示在表单中。

    类型转换是双向的

    String[] --> Object,从表单到Action
    Object --> String,从Action到表单

    默认情况下,Struts会帮我们转换如下类型:
    1. Date
    2. 基本类型:int、float ....
    3. String类型
    4. 基本类型对应包装类型:Integer、Double....


    <input type="checkbox" name="hobby" value="上网"/>
    <input type="checkbox" name="hobby" value="看书"/>
    <input type="checkbox" name="hobby" value="再上网"/>
    <input type="checkbox" name="hobby" value="还是看书"/>
    class MyAction {
    private int age;
    private Date birthday;
    }


    =====================

    自定义类型转换

    1. 目标

    在表单给出如下数据:
    张三,23,男

    把这个字符串转换成Person,封装到Action的一个类型为Person的属性中。

    2. 自定义类型转换
      当Struts自动类型转换失败时,它会使用最原始的类型完成封装,即使用String[]类型。
      例如要把字符串数组转换成Person类型时,自动类型转换会失败,这时Struts会去寻找setPerson(String[])方法。
      如果找不到这个方法,会抛出NoSuchMethodException异常,说明类型转换失败。

    1). 编写类型转换器
    2). 配置自定义的类型转换器类。

    3. 编写类型转换器
    1). 实现com.opensymphony.xwork2.conversion.TypeConverter(不方便)
    2). 继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter(不方便)
    3). 继承org.apache.struts2.util.StrutsTypeConverter(就用它)

    SturtsTypeConverter
    * Object convertFromString(Map context, String[] values, Class toClass):String --> Object,从表单到Action
    * String convertToString(Map context, Object o):Object --> String, 从Action到表单

    4. 配置自定义类型转换器
    局部部署:当前转换器只对当前Action的指定属性有效

    1) 配置文件的位置:Action同包下,即PersonAction同包下
    2) 配置文件的名称:Action名称-conversion.properties,PersonAction-conversion.properties,
    3) 配置文件的内容:要处理的属性名称=类型转换器的全名,即:person=cn.itcast.converter.PersonConverter

    全局部署:对某一类型指定类型转换器,例如Person类型都使用同一类型转换器

    1) 配置文件的位置:src下
    2) 配置文件的名称:xwork-conversion.properties
    3) 配置文件的内容:要处理的类型=类型转换器名称,即:cn.itcast.action.Person=cn.itcastion.converter.PersonConverter

    5. 类型转换错误

    HTTP Status 404 - No result defined for action cn.itcast.action.PersonAction and result input
    说明:已经找到了类型转换器,但类型转换失败。这时struts要求跳转到input结果,但我们没有为当前Action配置input结果。

    在input结果页面中给出<s:fielderror/>来显示错误信息。
    但错误信息是英文的,这需要使用国际化。

    国际化key:invalid.fieldvalue.当前字段名,即:invalid.fieldvalue.person
    处理这一问题:
    1. 在当前Action同包下创建资源文件,名称为:Action类名.properties

    6. 原理
    params:完成封装请求数据,它会做类型转换工作。
    converterError:如果出现类型转换错误,会向当前Action中添加fielderror。
    workflow:查看当前Action中是否存在fielderror或actionerror,只要存在错误,拦截请求,转发到input结果,不会在执行Action的请求处理方法。当然,如果没有错误,放行!

  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348757.html
Copyright © 2011-2022 走看看