什么是OGNL?
>>Object Graph Navigation Language
>>开源项目,取代页面中Java脚本,简化数据访问
>>和EL同属于表达式语言,但功能更为强大
OGNL在Struts2中做的两件事情
>>表达式语言
>>将表单和Struts2标签与特定的Java数据绑定起来,用来将数据移入、移除框架;
>>类型转换
>>数据进入和流出框架,在页面数据的字符串类型和Java数据类型之间进行转换;
创建自定义类型转换器
当默认类型转换器满足不了使用的时候,创建自定义类型转换器就很必要了。
基本步骤:
>>继承StrutsTypeConverter抽象类
>>继承org.apache.struts2.util.StrutsTypeConverter类
#将一个或多个字符串值转换为指定的类型
public Object convertFromString(Map context,String[] val,Class to Type)
#将指定对象转化为字符串
public String convertToString(Map context,Object object)
例如:
public class DateConverter extends StrutsTypeConverter{
private final DateFormat[] dfs={
new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy.MM.dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy-MM-dd"),
} ;
//存入时调用
public Object convertFromString(Map context,String[] values,Class toType){
String dataStr=value[0];
for(DateFormat df: dfs){
tyr{retrun df.parse(dateStr);}catch(ParseException e){continue;}
}
throw new TypeConversionException(); //异常处理实现消息输出
}
//取出是调用
public String conbertToString(Map context, Object object){
Date date =(Date)object;
retrun new SimpleDateFormat("yyyy-MM-dd").formate(date);
}
}
另外,还需要配置自定义类型转换器,分两种情况
>>应用于全局范围的类型转换器
>>在src目录创建xwork-conversion.properties
转换类全名=类型转换器类全名
例如: java.util.Date=cn.ssh.ch.converter.DateConberter
>>应用于特定类的类型转换器
>>在特定类的相同目录下创建一个名为ClassName-conversion.properties的属性文件
特定类的属性名=类型转换器类全名
例如: 在需要转换类属性的同包中创建 timeDate=cn.ssh.ch.converter.DateConberter
处理类型转换错误
向用户输出类型转换错误的前提条件
>>启动StrutsConversionErrorInterceptor拦截器
>>拦截器已经包含在defaultStack拦截器栈中
>>Action要继承ActionSupport类
>>实质是实现ValidationAware接口
>>配置input结果映射
>>页面使用Struts 2表单标签或<s:fielderror>标签
>>Struts 2表单标签内嵌了输出错误信息功能
>>普通HTML标签需使用<s:fielderror>标签输出转换错误
修改所有类型的转换错误信息
>>思路
>>修改xwork.default.invalid.fieldvalue键的值
>>实现
>>在struts.xml中指定资源文件的基名
<constant name="struts.custom.i18n.resources" value="message"/>
>>在src目录下创建资源文件message.properties并修改键值
xwork.default.invalid.fieldvalue=字段"{0}"的值无效
定制特定字段的类型转换错误信息
>>思路
>>在Action范围的资源文件中添加I18N消息键invalid.fieldvalue.属性
>>实现
>>在Action包下创建RegisterAction.properties,指定键值
invalid.fieldvalue.birthday=生日转换错误