【学习笔记】Struts2 类型转换

为什么需要类型转换


在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端
但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boolean Date 等等
因此 当这些参数进入应用程序时 必须被转换成适合的服务器端编程语言的数据类型

在Servlet中 类型转换工作是由开发者自己完成的
比如我们在易买网里要把分页的信息pageIndex读取出来
String s=request.getParameter("pageIndex");
int pageIndex=Integer.parseInt(s);

类型转换的工作是必不可少的 重复性的. 如果有一个良好的类型转换机制 必将大大节省开发时间,提高开发效率

Struts2提供了强大的类型转换功能

1.内置转换器
对于大部分的常用类型 开发人员在开发过程中不需要自己编码实现类型转换 这是因为在Struts2框架爱中可以完成大多数常用的类型转换
//由内部提供的类型转换器完成
1.String 将 int long double boolean String数组或者java.util.Date类型转换为字符串
2.boolean/Boolean 在字符串和布尔值之间转换
3.char/Character 在字符串和字符之间进行转换
4.int/Integer float/Float long/Long double/Double
5.Date 在字符串和日期只见进行转换 具体输入输出格式与当前的local有关
6.数组和集合 在字符串数组和数组对象 几何对象之间进行转换

2.自定义类型转换器

pom.xml

(需要注意的是build节点 否则局部properties可能无法识别到)

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.14</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

包结构如上

converter

//StrutsTypeConverter 继承自 DefaultTypeConverter
//DefaultTypeConverter 有一个实现类 XWorkConverter

@Inject
public void setObjectFactory(ObjectFactory factory) {
this.objectFactory = factory;
// note: this file is deprecated
loadConversionProperties("xwork-default-conversion.properties");

loadConversionProperties("xwork-conversion.properties");
}

public String buildConverterFilename(Class clazz) {
String className = clazz.getName();
return className.replace('.', '/') + "-conversion.properties";
}

具体步骤

1.新建一个converter包,在包下创建类型转换器类,继承自抽象类StrutsTypeConvert
//实现两个方法
public Object convertFromString(Map context, String[] values, Class toClass)
//其中 context是OGNL上下文的Map对象
//value是需要转换的字符串值
//toType是要转换的目标类型

public String convertToString(Map context, Object object)
//object是要转换的对象

public class DataConverter extends StrutsTypeConverter {

    private final DateFormat[] dfs = {
            new SimpleDateFormat("yyyy/MM/dd"),
            new SimpleDateFormat("yyyy-MM-dd")
    };

    public Object convertFromString(Map map, String[] strings, Class aClass) {
        String data = strings[0];
        for (int i = 0; i < dfs.length; i++) {
            try {
                return dfs[i].parse(data);
            } catch (ParseException e) {
                continue;
            }
        }
        throw new TypeConversionException();
    }

    public String convertToString(Map map, Object o) {
        Date date = (Date) o;
        return new SimpleDateFormat("yyyy年MM月dd日").format(date);
    }
}

2.配置全局类型转换器或者特定类的类型转换器
//特定类
在Action所在的包下建立 类名-conversion.properties
配置: 特定类的属性名=类型转换器类的全名

//全局
在classpath下建立 xwork-conversion.properties
配置: 需要转换的数据类型的类的全名=类型转换器类的全名

3.处理类型转换错误
//需要启动StrutsConversionErrorInterceptor拦截器 它包含在defaultStrack拦截器栈中
(就是不用管)
//需要实现ValidationAware接口 但是ActionSupport实现了这个接口

//配置input结果映射
(失败result=input)
//用<s:filederror>接收

原文地址:https://www.cnblogs.com/swordtm/p/6538167.html