对于每一个客户请求, Struts的 ActionServlet 只负责把请求转发给相应模块的的 RequestProcessor 对象去处理。
读了Struts的源码,发现:
如果请求中附有 From 表单信息,则 RequestProcessor 的 processActionForm方法 负责将客户端传过来的表单信息封装成相应的 ActionForm 对象。
processActionForm方法则执行了如下语句:
ActionForm instance =
RequestUtils.createActionForm (request, mapping, moduleConfig , servlet );
在 RequestUtils 中, Struts 从配置文件中获取了这个 ActionForm 类的各个成员变量的转换 map ,这个 map 标识了各个成员变量从 String 类型转换到何种类型。这个 map 命名为 properties后, Struts通过 BeanUtils.populate(bean, properties)方法将类型转换的任务委托给 了 comments-beanutils 包。
在 comments-beanutils包中, BeanUtils类把转换任务下交给 BeanUtilsBean:
BeanUtilsBean.getInstance().populate(bean, properties);
BeanUtilsBean根据 map中的 name-value值, bean中的各个成员变量进行 setProperty, setProperty方法主要是根据 comments-beanutils 包中已经存在的 Convert 类,将 String 类型的表单输入转换成相应的成员变量类型,从而实现对 bean 中的属性进行赋值。
由于 comments-beanutils 包中自带的 Convert 类不能解决所有的问题。例如,这个包提供了从 String 到 java.sql.Date 的转换。但是没有提供从 String 到 java.util.Date 的转换。
所以,有时候,我们需要自定义一个 Convert 类,然后注册给 ConvertUtils ,从而实现让 Struts转化 String为自定义的类。
因为要在系统启动时就注册自定义的 Convert 类,所以常用的方法有,自定义一个自动 load 的 Servlet ,在它的 init 方法中注册 Convert 类。另一种方法是,自定一个 ActionServlet ,在它的 init 方法中注册 Convert 类。
给出第二种方法的一个实现:
首先,定义一个 Convert :
自定义 ActionServlet,注册 DateConvert:
最后配置这个 ActionServlet 为使用的 Servlet 即可。