- 写这篇文章的缘由,同学叫我帮忙搭建立ssi(Struts2+Spring+ibatis)框架,架构搭建成功后,写了个页面测试。其中有日期类型,所以就涉及到了Struts2的自定义数据类型转换器。(Strurts2有默认的日期转换器,但是支持的格式单一)
- 由于信息量比较大,文章的内容是关于"自定义数据类型转换器"一些底层的实现过程,会涉及到很多东西。所有难免有纰漏。
- 分享给希望了解“自定义数据类型转换器”的来龙去脉的同学,希望对你们有点帮助。纯手工写作,喜欢就点个赞。
-------------------------------概述------------------------------------------
从以下两点来认识Struts2中的自定义类型转换器,你能得到什么?你可以掌握它的整个生命周期。
一、自定义数据类型转换器初始化
二、使用自定义数据类型转换器(Struts2框架来完成),
只需要在xwork-conversion.properties配置自定义的数据类型转换器,
和实现自定义类型转换器(通过继承DefaultTypeConverter,也可以继承其子类StrutsTypeConverter)即可。
---------------------------------来龙去脉-------------------------------------------
一、自定义数据类型转换器初始化,具体过程
1.服务器启动,加载和管理web.xml中的Filter:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
2.调用StrutsPrepareAndExecuteFilter类的初始化方法:init(FilterConfig) void
//初始化调度器Dispatcher(笔者叫法,感觉很贴切)
Dispatcher dispatcher = init.initDispatcher(config);
3.调度器Dispatcher中进行加载和解析配置文件,初始化IOC容器等的初始化工作,主要初始化方法如下:
Container container = init_PreloadConfiguration();
接着,加载容器:reloadContainer(List<ContainerProvider>)
4.设置引导容器,比如 XWorkConverter(数据类型转换器,此文章关注点)
// Set the bootstrap container for the purposes of factory creation
Container bootstrap = createBootstrapContainer();
5.DefaultConfiguration中使用构造器模式构建引导程序,源码片段如下:
protected Container createBootstrapContainer() {
ContainerBuilder builder = new ContainerBuilder();
builder.factory(ObjectFactory.class, Scope.SINGLETON);
builder.factory(ReflectionProvider.class, OgnlReflectionProvider.class, Scope.SINGLETON);
builder.factory(ValueStackFactory.class, OgnlValueStackFactory.class, Scope.SINGLETON);
//类型转换器
builder.factory(XWorkConverter.class, Scope.SINGLETON);
builder.factory(XWorkBasicConverter.class, Scope.SINGLETON);
builder.factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON);
builder.factory(ObjectTypeDeterminer.class, DefaultObjectTypeDeterminer.class, Scope.SINGLETON);
builder.factory(PropertyAccessor.class, CompoundRoot.class.getName(), CompoundRo