zoukankan      html  css  js  c++  java
  • struts2类型转换2

    如何自定义类型转换器 ?
    1). 为什么需要自定义的类型转换器 ? 因为 Struts 不能自动完成 字符串 到 引用类型 的 转换.
    2). 如何定义类型转换器:
    I. 开发类型转换器的类: 扩展 StrutsTypeConverter 类.
    II. 配置类型转换器:
    有两种方式
    ①. 基于字段的配置:
    > 在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件
    > 在该文件中输入键值对: fieldName=类型转换器的全类名.
    > 第一次使用该转换器时创建实例.
    > 类型转换器是单实例的!

    ②. 基于类型的配置:
    > 在 src 下新建 xwork-conversion.properties
    > 键入: 待转换的类型=类型转换器的全类名.
    > 在当前 Struts2 应用被加载时创建实例.

    老版本的struts2项目中常用来对Date日期类型做转换,而在新版本的struts2项目中,实际上

    是对于日期类型不需要类型转换器,因为常用的日期值2018-03-16 20:11:49和2018-03-16

    这种struts2可以自动类型转换成Date类型。

    官网原文:

    内置类型转换支持
    类型转换由XWork实现。XWork会自动为您处理最常见的类型转换。这包括对以下各项的字符串转换支持:


    布尔值/布尔值
    字符/字符
    int / Integer,float / Float,long / Long,double / Double
    日期 - 使用与当前请求关联的语言环境的SHORT格式(详细见java分类下的日期格式汇总)
    数组 - 假设单个字符串可以转换为单个项目
    集合 - 如果不能确定对象类型,则假定它是一个字符串,并创建一个新的ArrayList>请注意,对于数组,类型转换将按照数组元素的类型并尝试单独转换每个项目>。与任何其他类型转换一样,如果无法执行转换,则使用标准类型转换>错误报告来指示处理类型转换时发生的问题。
    枚举
    BigDecimal和BigInteger

    老项目中常用的类型转换方式是②基于类型的配置:定义日期类型转换

    常用工具类1:
    package com.utils;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    
    import org.apache.struts2.ServletActionContext;
    import org.apache.struts2.util.StrutsTypeConverter;
    
    public class DateConverter extends StrutsTypeConverter {
    
    	private DateFormat dateFormat;
    	
    	public DateConverter() {
    		System.out.println("DateConverter's constructor...");
    	}
    	
    	public DateFormat getDateFormat(){
    		if(dateFormat == null){
    			//获取当前 WEB 应用的初始化参数 pattern(即web.xml的pattern)
    			ServletContext servletContext = ServletActionContext.getServletContext();
    			System.out.println(servletContext); 
    			String pattern = servletContext.getInitParameter("pattern");
    			dateFormat = new SimpleDateFormat(pattern);
    		}
    		
    		return dateFormat;
    	}
    	
    	@Override
    	public Object convertFromString(Map context, String[] values, Class toClass) {
    		
    		System.out.println("convertFromString...");
    		
    		if(toClass == Date.class){
    			if(values != null && values.length > 0){
    				String value = values[0];
    				try {
    					return getDateFormat().parseObject(value);
    				} catch (ParseException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		
    		//若没有转换成功, 则返回 values
    		return values;
    	}
    
    	@Override
    	public String convertToString(Map context, Object o) {
    		
    		System.out.println("convertToString...");
    		
    		if(o instanceof Date){
    			Date date = (Date) o;
    			return getDateFormat().format(date);
    		}
    		
    		//若转换失败返回 null
    		return null;
    	}
    
    }

    web.xml中定义要转换的日期格式:

      <context-param>
      <param-name>pattern</param-name>
      <param-value>yyyy-MM-dd hh:mm:ss</param-value>
      </context-param>

      

    常用工具类2:
    package com.utils;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    public class MyDateConverter extends DefaultTypeConverter {
    	private static final DateFormat[] ACCEPT_DATE_FORMATS = new DateFormat[]{
    			new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
    			new SimpleDateFormat("yyyy-MM-dd HH:mm a"), new SimpleDateFormat("yyyy-MM-dd HH:mm"),
    			new SimpleDateFormat("dd/MM/yyyy"), new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyy/MM/dd")};
    
    	public Object convertValue(Map context, Object value, Class toType) {
    		if (toType != Date.class) {
    			if (toType == String.class) {
    				Date arg11 = (Date) value;
    				return (new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss")).format(arg11);
    			} else {
    				return null;
    			}
    		} else {
    			String date = null;
    			String[] params = (String[]) ((String[]) value);
    			date = params[0];
    			DateFormat[] arg5 = ACCEPT_DATE_FORMATS;
    			int arg6 = arg5.length;
    			int arg7 = 0;
    
    			while (arg7 < arg6) {
    				DateFormat format = arg5[arg7];
    
    				try {
    					return format.parse(date);
    				} catch (Exception arg10) {
    					++arg7;
    				}
    			}
    
    			return null;
    		}
    	}
    }

    注意:

    1,还需要在src下编写xwork-conversion.properties

      内容举例如下:

      java.util.Date =com.utils.MyDateConverter
      #java.util.Date =com.utils.DateConverter

    2,注意由后台的对象转成页面显示的String类型,要想类型转换器起作用。必须使用ognl

    而不是el。

  • 相关阅读:
    python 约束与异常处理
    ActiveMQ
    SpringMVC项目,启动项目怎么总是报找不到log4j.properties文件
    java 字符串处理
    java面向对象学习笔记
    JSONArray遍历
    get/post方式调用http接口
    IO流认识
    Apache Mina 入门实例
    “wsimport -keep ”生成客户端报错“Use of SOAP Encoding is not supported.”
  • 原文地址:https://www.cnblogs.com/zxwBj/p/8620514.html
Copyright © 2011-2022 走看看