概述

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. Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

    在部署的时候出现Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server ...

  2. 1160. Network(最小生成树)

    1160 算是模版了 没什么限制 结束输出就行了 #include <iostream> #include<cstdio> #include<cstring> #i ...

  3. ZOJ 3607 Lazier Salesgirl(贪心)

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3607 题意:一个卖面包的小姑娘,给第i个来买面包的人的价格是pi, ...

  4. 服务器发布MVC常见问题解决方案

    1  问题:IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelin ...

  5. iOS开发:告诉git不要跟踪UserInterfaceState.xcuserstate

    在xcode中使用git管理项目的技巧: 在多人协作开发的时候,每个开发者都会在项目中的某个目录生成一个 UserInterfaceState.xcuserstate 文件,这个文件大概每5s会刷新一 ...

  6. JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)

    近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...

  7. 物联网操作系统HelloX开发者入门指南

    HelloX开发者入门指南 HelloX是聚焦于物联网领域的操作系统开发项目,可以通过百度搜索"HelloX",获取详细信息.当前开发团队正在进一步招募中,欢迎您的了解和加入.如果 ...

  8. POJ:最长上升子序列

    Title: http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2  ...

  9. curl命令访问域名

    1.前言 curl是利用URL语法在命令行方式下工作的开源文件传输工具(来自百度百科).cURL 是一种简单有效的工具,可以使用cURL工具进行WEB相关的调试开发工具,相对于Yeelink这样的云平 ...

  10. linux下打开chm文件的方法

    windows中,通常情况下,chm文件可以使用系统自带的程序打开,但是linux就没有那么幸运了,那么,如何在linux下打开chm 文件呢?有小编来为您介绍介绍,本篇,小编以ubuntu环境为例 ...