概述

A 、从一个HTML
表单到一个 Action 对象,类型转换是从字符串到非字符串.
   –HTTP没有“类型” 的概念.每一项表单输入只可能是一个字符串或一个字符串数组.在服务器端,
必须把String
转换为特定的数据类型
B、在struts2中,把请求参数映射到
action 属性的工作由Parameters拦截器负责,它是默认的
defaultStack拦截器中的一员. Parameters拦截器可以自动完成字符串和基本数据类型之间转换.

类型转换错误的处理

A、若Action 类没有实现ValidationAware接口:Struts在遇到类型转换错误时仍会继续调用其Action方法,就好像什么都没发生一样.
B、若Action类实现
ValidationAware接口:Struts在遇到类型转换错误时将不会继续调用其Action方法: Struts将检查相关action元素的声明是否包含着一个name=input的result. 
如果有, Struts将把控制权转交给那个
result 元素;
若没有input
结果, Struts将抛出一个异常

C、ActionSupport类实现了此接口,因此,常规的继承ActionSupport即间接的实现了此接口

类型转换错误消息的定制

A、作为默认的default拦截器的一员,ConversionError拦截器负责添加与类型转换有关的出错消息(前提:Action类必须实现了ValidationAware接口)和保存各请求参数的原始值.
B、若字段标签使用的不是simple主题,则非法输入字段将导致一条有着以下格式的出错消息:Invalid
field value for field fieldName
C、覆盖默认的出错消息

–在对应的Action类所在的包中新建 ActionClassName.properties文件,ClassName即为包含着输入字段的Action类的类名

–在属性文件中添加如下键值对: Invalid fieldvalue.fieldName=errorMsg

D、定制出错消息的样式:
   –每一条出错消息都被打包在一个HTMLspan元素里,
可以通过覆盖其行标为errorMessage的那个css样式来改变出错消息的格式. 
E、显示错误消息:
如果是 simple 主题,可以通过
<s:fielderrorfieldName=“filedname”></s:fielderror>标签显示错误消息

如何自定义类型转换器

1). 为什么需要自定义的类型转换器 ? 因为 Struts 不能自动完成 字符串 到 引用类型 的 转换.

2). 如何定义类型转换器:

    I.  开发类型转换器的类: 扩展 StrutsTypeConverter 类.

    II. 配置类型转换器:

    有两种方式

    ①. 基于字段的配置:

        > 在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件

        > 在该文件中输入键值对: fieldName=类型转换器的全类名.

        > 第一次使用该转换器时创建实例.

        > 类型转换器是单实例的!    

    

    ②. 基于类型的配置:

        > 在 src 下新建 xwork-conversion.properties

        > 键入: 待转换的类型=类型转换器的全类名.

        > 在当前 Struts2 应用被加载时创建实例.

简单的自定义类型转换器实现:

假如有如下action

public class ProductAction {

	private int id;
private String name;
private Date createtime; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
} public String execute(){
return "success";
} }

在页面输入的createtime的时间字符串需要被转换成Date类型,自定义类型转换器如下:

public class DateConvert extends StrutsTypeConverter {
    
    private DateFormat dateFormat;
    
    public DateFormat getDateFormat() {
        if(dateFormat==null){
            
            ServletContext context=ServletActionContext.getServletContext();
            String pattern=context.getInitParameter("pattern");
            dateFormat= new SimpleDateFormat(pattern);
        }
        
        return dateFormat;
    }
    
    @Override
    public Object convertFromString(Map map, String[] values, Class typeClass) {
        if(typeClass==Date.class){
            if(values!=null && values.length>0){
                try {
                    return getDateFormat().parse(values[0]);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }
        return values[0];
    }     @Override
    public String convertToString(Map map, Object o) {
        if(o instanceof Date){
            return getDateFormat().format(o);
        }
        return null;
    } }

上述Date转换器中的转换后的时间格式可以在web.xml中进行配置,这样可以做到对时间格式的动态配置,在web.xml文件中加入如下配置即可:

 <context-param>
<param-name>pattern</param-name>
<param-value>yyyy-MM-dd hh:mm:ss</param-value>
</context-param>

配置上述的自定义类型转换器,有2种方式:

1、通过字段名来配置:

在ProductAction所在的包下新建配置文件 :ProductAction-converion.properties ,内容如下:

createtime=com.elgin.convert.DateConvert

2、通过类型匹配

在src下新建配置文件名为:xwork-conversion.properties ,内容如下:

java.util.Date=com.elgin.convert.DateConvert

显然,第二种配置方式是全局的,也就是在其他Action中若存在同样的类型转换问题,只要是此种配置,会自动将字符串转为Date类型。而第一种配置方式,只有ProductAction是createtime字段才会进行转换。

Struts2类型转换器的更多相关文章

  1. 8.Struts2类型转换器

    类型转换器1.引入在Struts2中,请求参数类型不仅可以是String,还可以是其它类型.如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,则birthday接收到的 ...

  2. struts2类型转换器、 类型转换错误 以及INPUT view

    1.1.1    Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...

  3. Struts2基础学习(四)—类型转换器和数据校验

    一.自定义类型转换器 1.概述      Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器.Struts2 类型转换器实际上都是基于OG ...

  4. 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】

    一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...

  5. Struts2:类型转换器

    常规的String,int能自动转换,但是,有些类型不是这么简单,比如输入字符串,但需要Date.自定义类型,因此需要自定义类型转换类型转换器分全局和局部按惯例,局部的优先级高于全局 需求: 1.输入 ...

  6. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器   如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString   注 ...

  7. Struts2框架的自定义类型转换器

    前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...

  8. Struts2之类型转换器

    一.类型转换器的应用场景 类型转换是OGNL的一部分,默认的八种基本类型.String.Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在 ...

  9. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

随机推荐

  1. LA 6187 - Never Wait for Weights 并查集的带权路径压缩

    只有一个地方需要注意: 设节点a的根为u,b的跟为v,则:a = u + d[a];  b = v + d[b]; 已知:b-a=w.所以v - u = d[a] - d[b] + w; 在合并两个集 ...

  2. HDU 4717 The Moving Points(三分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 题意:给出n个点的坐标和运动速度(包括方向).求一个时刻t使得该时刻时任意两点距离最大值最小. ...

  3. jquery 字符串转json

    这里考虑的都是服务器返回JSON形式的字符串的形式 代码如下: var data=" { root: [ {name:'1',value:'0'}, {name:'6101',value:' ...

  4. 【.NET应用技巧】Asp.NET MVC 4 设置IIS下调试

    [环境] VS 2012  IIS7.5 [问题] MVC项目在创建时和APS.NET不同,不能够选择服务器类型,不能够直接把项目创建到IIS上. 如果在项目中直接更改属性,更换调试服务器类型,会报错 ...

  5. unicode string和ansi string的转换函数及获取程序运行路径的代码

    #pragma once#include <string> namespace stds { class tool { public: std::string ws2s(const std ...

  6. ubuntu12.04下txt文件乱码如何解决

    :gsettings set org.gnome.gedit.preferences.encodings auto-detected "['UTF-8','GB18030','GB2312' ...

  7. BZOJ3540: [Usaco2014 Open]Fair Photography

    3540: [Usaco2014 Open]Fair Photography Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 29 ...

  8. uestc 1721 吴神,人类的希望

    // 将n个相同的球放进m个盒子 盒子不为空的方法总数// dp[i][j] 表示i个盒子 j个球的方法总数// 递推关系 dp[i][j]=dp[i-1][j-1]+d[i][j-i]// a. i ...

  9. 一天一个Java基础——排序

    插入排序 直接插入排序: 当插入第i个数据元素k时,由前i-1个数据元素组成已排序的数据序列,将k与数据序列中各数据元素依次进行比较后,插入到数据序列的适当位置,使得插入后的数据序列仍是排序的. 直接 ...

  10. logback.xml_appender配置

    logback<appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. < ...