Struts2之类型转换

一、类型转换的意义

对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构应用的请求参数是通过浏览器发送到服务器的,这些参数不可能有丰富的数据类型,因此必须在服务器端完成数据类型的转换

MVC框架是一个表现层解决方案,理应提供类型转换的支持,Struts2提供了功能非常强大的类型转换支持.

二、表现层数据的处理

1、对于web应用而言,表现层主要用于与用户交互,包括收集用户输入数据,向用户呈现服务器的状态。因此表现层的数据的流向主要有两个方向:输入数据和输出数据。


2、对于输入数据:则需要完成由字符串数据向多种类型数据的转化。程序通常无法自动完成,需要在代码中手动转化


3、对于输出数据:不管是java或是jsp都支持多种数据类型的直接输出。


4、表现层另外一个数据处理是:数据校验,分为客户校验和服务器端校验.后边会重点讲解

三、类型转换

1、HTTP参数都是字符串类型。 保存的数据可能是字符串、数字、布尔、日期时间等或者JavaBean类型。 手工的类型转换,比如将字符串转换为日期,通过: 通过request.getParameter方法获取字符串; 检查是否为空; 通过DateFormat.parse方法将字符串转换为Date对象

2、Struts2类型转换

Struts2内置的类型转换
String和boolean 完成字符串与布尔值之间的转换
String和char  往常字符串与字符之间的转换
String和int、Integer 完成字符串与整型之间的转换
String和Long 完成字符串与长整型值之间的转换
String和double、Double 完成字符串与双精度浮点值的转换
String和Float 完成字符串和单精度浮点之间的转换
String和Date 完成字符串和日期类型之间的转换,日期格式使用格式用户请求所在Locale的SHORT格式
String和数组 在默认的情况,数组元素是字符串,如果用户定义类型转换器,也可以是其它复合数据类型
String和Map、List

Struts2内置的类型转换
String和boolean 完成字符串与布尔值之间的转换
String和char  往常字符串与字符之间的转换
String和int、Integer 完成字符串与整型之间的转换
String和Long 完成字符串与长整型值之间的转换
String和double、Double 完成字符串与双精度浮点值的转换
String和Float 完成字符串和单精度浮点之间的转换
String和Date 完成字符串和日期类型之间的转换,日期格式使用格式用户请求所在Locale的SHORT格式
String和数组 在默认的情况,数组元素是字符串,如果用户定义类型转换器,也可以是其它复合数据类型
String和Map、List 

3、内置类型转换

<%--
  Created by IntelliJ IDEA.
  User: CKW
  Date: 2017/3/12
  Time: 14:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="aaa" method="post">
    姓名:<input name="uname"><br>
    年龄:<input name="uage"><br>
    生日:<input name="udate"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>
package cn.happy.action;

import com.opensymphony.xwork2.ActionSupport;

import java.util.Date;

/**
 * Created by CKW on 2017/3/12.
 */
public class TypeDate extends ActionSupport {
    private String uname;
    private Integer uage;
    private Date udate;

    @Override
    public String execute() throws Exception {
        System.out.println(uname);
        System.out.println(uage);
        System.out.println(udate);
        return SUCCESS;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getUage() {
        return uage;
    }

    public void setUage(Integer uage) {
        this.uage = uage;
    }

    public Date getUdate() {
        return udate;
    }

    public void setUdate(Date udate) {
        this.udate = udate;
    }
}
<%--
  Created by IntelliJ IDEA.
  User: CKW
  Date: 2017/3/12
  Time: 14:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>SUCCESS</title>
</head>
<body>
<s:property value="uname"/><br>
<s:property value="uage"/><br>
<s:property value="udate"/><br>
<s:date name="udate"/>
</body>
</html>
 <action name="aaa" class="cn.happy.action.TypeDate">
             <result name="success">/success.jsp</result>
             <result name="input">/index.jsp</result>
         </action>
package cn.happy.converter;

import com.opensymphony.xwork2.conversion.TypeConversionException;
import org.apache.struts2.util.StrutsTypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by CKW on 2017/3/12.
 */
public class DateConverter extends StrutsTypeConverter {

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

    private static final List<SimpleDateFormat> list=new ArrayList<SimpleDateFormat>();

    static {
        list.add(new SimpleDateFormat("yy-MM-dd"));
        list.add(new SimpleDateFormat("yy/MM/dd"));
    }

    public Object convertFromString(Map map, String[] strings, Class aClass) {
        String date = strings[0];
        for (SimpleDateFormat item:list){
            try {
                return item.parse(date);
            } catch (ParseException e) {
                continue;
            }
        }
        throw new TypeConversionException();

 /*       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) {
        return new SimpleDateFormat("yyyy年MM月dd日 hh:mm:sss").format(o);
    }
}

4、Struts类型转换的API

Struts2的类型转换器实际上是基于OGNL实现的,在OGNL项目中有一个ognl.TypeConverter接口,这个接口就是实现类型转换器必须实现的接口。该接口定义如下:

public interface TypeConverter {
     public Object convertValue(Map arg0, Object arg1, Member arg2, String arg3,
          Object arg4, Class arg5) {
              return null;
}

实现类型转换器必须实现上面的TypeConverter,不过上面的接口里的方法过于复杂,所以OGNL项目还提供了一个该接口实现类:ognl.DefaultTypeConverter,通过继承该类实现自己类型转换器.该类定义如下:

    public class DefaultTypeConverter extends Object implements TypeConverter{
             public Object convertValue(Map<String,Object> context, Object value, Class toType) {
              }
             ……//其他的方法
     }

ConvertValue方法的作用
该方法完成类型转换,不过这种类型转换是双向的,当需要把字符串转化对象实例时,通过该方法实现,当把对象实例转换成字符串时也通过该方法实现。这种转换是通过toType参数类型是需要转换的目标类型。所以可以根据toType参数来判断转换方向。
ConvertValue方法参数和返回意义
第一个参数:context是类型转换环境的上下文
第二个参数:value是需要转换的参数,根据转换方向的不同value参数的值也是不一样的。
第三个参数:toType是转换后的目标类型
该方法的返回值是类型转换后的值。该值的类型也会随着转换的方向的改变而改变。由此可见转换的convertValue方法接受需要转换的值,需要转换的目标类型为参数,然后返回转换后的目标值
Value为什么是一个字符串数组?
对于DefaultTypeConverter转换器而言,它必须考虑到最通用的情形,因此他把所有请求参数都视为字符串数组而不是字符串。相当于getParameterValues()获取的参数值

原文地址:https://www.cnblogs.com/ckwblogs/p/6545066.html