struts2-类型转换器

版权声明: https://blog.csdn.net/qq_34866380/article/details/79768268

struts2在接受数据后,会将接收到的数据转换成对应的数据类型。这里是struts2中类型转换器的作用,而其中默认的类型转换器有如下(struts-default.xml文件中):
这里写图片描述
页面数据提交,转换器收到数据后执行convertValue()方法,将相应的string字符串按照内部对应属性类型进行转换,在数据传回页面时,有经过转换器将所以转换成string字符串。

在struts2中要实现数据回显(格式错误时跳转回提交页面,显示数据并提示错误)要借助struts-tags的标签,并在struts.xml对应页面action下,加入name=”input”的页面(struts2默认要求)。

 <result name="input">/test.jsp</result>

test.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:form action="test/some" method="post">
    <s:textfield name="date" label="date"></s:textfield>
    <s:textfield name="age" label="age"></s:textfield>
    <s:submit value="submit"></s:submit>
</s:form>
</body>
</html>

如上,在数据格式错误时会有相应提示与数据回显:
这里写图片描述


自定义的类型转换器(时间类型转换器)
1、参照源码
这里写图片描述
2、myDateConvert.java

public class myDateConvert extends DefaultTypeConverter {


    //value接受的是String[],class是要被转换的类型,因为页面到服务端和服务端到页面都要经过转换器,所以内部是双向逻辑。
    @Override
    public Object convertValue(Object value, Class toType) {
        SimpleDateFormat sdf = null; //new一个时间格式空对象
        try{
        if(toType == Date.class){//页面到服务端
            String dateStr = ((String[])value)[0];//获取要被转换为date参数的第一个string字符串
            sdf = getSimpleDateFormat(dateStr);//通过方法获取到对应的格式
            ActionContext.getContext().getSession().put("sdf", sdf);//将格式存入session中,以便在回显和页面获取数据时的格式转换
            return sdf.parse(dateStr);//返回按格式转换的date值
        }
        else if(toType == String.class){//服务端到页面
            Date date = (Date)value;//回显时数据单值,强转date
            sdf = (SimpleDateFormat)ActionContext.getContext().get("sdf");//session获取格式
            return sdf.format(date);//返回按格式转换后的string字符串
        }
        }catch(ParseException e){
            e.printStackTrace();//这个解析异常只会在后台抛出,不会在回显页面提示,所以在获取格式的方法中就抛出类型转换异常
        }

        return super.convertValue(value, toType);
    }

    private SimpleDateFormat getSimpleDateFormat(String dateStr) {
        //根据这里的格式进行判断,若没有相应格式即抛出异常      
        SimpleDateFormat sdf = null;
        if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)){//用模块匹配来判断格式
            sdf = new SimpleDateFormat("yyyy-MM-dd");
        }else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)){
            sdf = new SimpleDateFormat("yyyy/MM/dd");
        }else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)){
            sdf = new SimpleDateFormat("yyyyMMdd");
        }else {
            throw new TypeConversionException();//若格式都不符合则抛出异常
        }
        return sdf;
    }

}

3、这是自定义的转换器,要进行配置,为action指定转换器。
通过局部类型转换注册:

  • 在指定action所在包下,新建properties文件,action名-conversion.properties
  • 内容:属性=转换器的全限定性类名
    这里写图片描述
    运行:这里写图片描述

4、这里数据回显后的错误提示都是英文,于是可以自定义:

  • 在对于action包下,新建action名.properties
  • 内容:invalid.fieldvalue.变量名=错误提示信息

这里写图片描述
5、测试运行:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_34866380/article/details/79768268
今日推荐