按照Struts2的工作流程,当请求发送过来的时候,一般情况下,你的Action会继承ActionSupport以及在struts.xml配置中会有一个这样的默认包extends="struts-default";这个包默认的会进行一些必要的工作,比如前面所说的类型转换,数据校验等等;Struts2的类型转换我在网上找到一篇比较好的文章,不过这篇文章是类型转换的自定义使用;

 我先来说说自己对类型转换的工作原理简单说说:当请求发送,你会注意到:表单中的TEXT类型都是以String类型传值的,但是有时你会发现,你的Action中的属性值会是int,或者double或者其他的常用类型,神奇的便是Struts2不但自动的找到相应的参数,并且会将传过来的参数值进行类型转换,转化为你Action中需要的数据类型;这便是默认包中的配置起的作用,有了这些包中的配置,Struts2会在请求发送给Action之前进行类型转化,还有数据校验;你可以尝试着不添加这个默认包,进行传值操作,便会出现类型转换的错误。当然了,这些类型转化和数据校验之所以能够被执行,依赖的依然是interceptor,interceptor贯穿Action的全过程,拦截器比较灵活,可以再Action之前之后都能进行一些额外的操作,下面不在粘贴默认包中的配置信息,你可以在Struts2核心包中的strus-default.xml中查看;

  通常,我们不需要自定义类型转化,但是有些表单中特殊的参数不得不使用类型转换,常见的便是表单中的参数是一个String但是,Action中时一个实体类,这时候你不得不进行自定义的类型转化,还有就是表单中一些list,map等特殊数据类型,这些数据类型Struts2并没有帮我们做好类型的转化,需要我们自己进行;下面是Struts2(Xwork)所支持的类型转化,其他的类型需要自定义转化;

Struts2笔记(3)-----Struts2的类型转化原理_javaweb

总结:

(1). web.xml中配置了Struts2的过滤器filter,过滤请求;

(2). Struts2的org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;进    行相应的操作;

(3). Struts2,读取Struts.xml文件开始调用Action;

(4). 调用Action前,被intercepter拦下;

(5). 拦下之后,进行类型转化或者数据校验等;

(6). 上面的操作进行完之后,Struts2会将相应的结果开始发送给前台显示页面;

(7). 不幸的这个结果依然被拦截器intercepter拦下,进行一些“鬼知道”的操作;

(8). 终于,可以将结果页面按照struts.xml中的result中配置转发过去;  


这些仅仅是按照Struts2默认的配置;如果自定义拦截,或者不继承默认包中配置,这些工作流程看上去会混乱不堪,你仅仅记住,这些操作,都是在请求被拦截器拦下之后,在Action处理前后,添加的其他操作;附一些源码:类型转换的实例;

 自定义的类型转化的原理是,你在项目中配置的属性文件,并且在struts.xml中指明了属性文件,

<constant name="struts.custom.i18n.resources" value="global"></constant>

Struts2在读取struts.xml时,检测到了属性文件,便去寻找属性文件(当然,有时候项目中有许多属性文件),将所有属性文件读取,读取到类型转化的属性文件的时候,检测符合类型转化的命名规则,便又去寻找相对应的自定义类型转化器,请求经过这个转化器处理之后,在将处理结果交给Action,显然Action接到被处理的数据,浑然不觉,我感觉Action此时就是一个SB;

 不行了, 我自拔不能了,你有没有,想过在struts.xml配置了

<constant name="struts.custom.i18n.resources" value="global"></constant>Struts2为何,便会去寻找属性文件,个人认为是,xml的解析器的功劳!