概述

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. Eclipse中Python插件PyDev的安装与配置流程

    安装PyDev插件的两种安装方法: 方法1.下载地址:http://sourceforge.net/projects/pydev/files/,将下载的PyDev解压(目前最新版本 PyDev 4.5 ...

  2. [LeetCode#267] Palindrome Permutation II

    Problem: Given a string s, return all the palindromic permutations (without duplicates) of it. Retur ...

  3. BootStrap基本样式

    文本对齐风格:.text-left:左对齐.text-center:居中对齐.text-right:右对齐.text-justify:两端对齐 取消列表符号:.list-unstyled内联列表:.l ...

  4. UVa 11361 (计数 递推) Investigating Div-Sum Property

    题意: 统计[a, b]中有多少个数字满足:自身是k的倍数,而且各个数字之和也是k的倍数. 分析: 详细分析见<训练之南>吧,=_=|| 书上提出了一个模板的概念,有了模板我们就可以分块计 ...

  5. bzoj1355: [Baltic2009]Radio Transmission

    将原串看成是循环节的后缀加上若干个循环节,那么考虑每种情况都会发现n-next[n]就是最小循环节.(一开始总输出n...然后发现build_next连调用都没有,%%% #include<cs ...

  6. Dapper使用在WCF上总是说Service找不到

    原因是用Console Application 做宿主的时候,创建的时候默认是Client Profile 4 ,坑爹啊.改成Net framework 4 即可.

  7. 五大主流SQL数据库

    一. 开放性 1. SQL Server 只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的.Windows9X系列产品是偏重于桌面应用,NT server只适合中 ...

  8. Java [Leetcode 257]Binary Tree Paths

    题目描述: Given a binary tree, return all root-to-leaf paths. For example, given the following binary tr ...

  9. Oracle 一次 锁表 处理小记

    同事说测试库上的一张表被锁了. 不能执行DML 操作. 锁表的准确说法应该是阻塞.之前的一遍blog里有说明: 锁 死锁 阻塞Latch 等待 详解 http://blog.csdn.net/tian ...

  10. wap版和pc版的旋转js

    <script type="text/javascript"> var evt = "onorientationchange" in window ...