概述

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. Android权限安全(11)内置计费相关安全要点

    内置计费相关安全要点 1.计费Server接口保密且Transiction 加密 (SSL) 2.仅允许配套的安全本地组件(通常是第三方付费sdk如支付宝)与计费Server通信,且安全本地组件负责与 ...

  2. JAVA文件中获取路径及WEB应用程序获取路径方法

    JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...

  3. BZOJ 2326 数学作业(矩阵)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2326 题意:定义Concatenate(1,N)=1234567……n.比如Concat ...

  4. Android开发之ActivityManager获取系统信息

    1.判断指定的service是否在运行 public static boolean isServiceRunning(Context ctx, String serviceName) { Activi ...

  5. poj 3790 Recursively Palindromic Partitions (递推)

    题目 题意:求输入的数字的递归回文. 思路:答案等于这个数字一半之前的所有的 之和. #include <iostream> #include <cstdio> #includ ...

  6. uva11181Probability|Given

    枚举,条件概率. 2^20次方等于100w,是大约可以没准还能过的. 二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),t ...

  7. C#中结构体的声明

    定义:       结构是用户自定义的值类型 代码样式:struct Pair{    public int X, Y; //公有变量名单词的首字母大写(PascalCase规则)}struct Pa ...

  8. ZOJ 2587 Unique Attack (最小割唯一性)

    题意 判断一个无向图的割是否唯一 思路 错误思路:一开始想的是判断割边是否都是关键割边,那既然割边两端点能连通S.T点的边是关键边,那么只要遇到有某个边两端点不连通S or T则这条边就不是关键割边( ...

  9. 给table中某一列的文字右对齐

    一般来说,没写过jquery的前端人员,肯定是定义一个class,给每一行的那列加上align_r{text-align:right}.这是很麻烦的. 所以用jquery来写,可以$("ta ...

  10. u-boot 源码修改 bootcmd,IP ,BOOTARGS等参数

    uboot1.1.6\include\configs\smdk6410.h #define CONFIG_BOOTCOMMAND"nand read 0xc0008000 0x200000 ...