Far*_*rid 8 struts conventions struts-1
我即将开始使用Struts 1.2的e项目.没有计划转移到另一个框架.
我想知道在表单中处理日期时的惯例是什么?
我应该创建一个Date变量并创建一个setDate(String date)
转换发生的方法吗?
创建一个Date变量,setDate(Date date)
并在链中的某处注册一个特殊的转换器?(不知道是否可能)
创建一个String变量,setDate(String date)
并让validate
ActionForm bean中的方法转换/验证?
还是另一种方法?
另外,如果你有任何建议来加快这个框架的速度,我真的很感激.
小智 16
在回答你的问题之前,让我首先说一句:人们不明白ActionForm是什么或者ActionForm做了什么
所述的ActionForm表示用户填充在HTML形式的数据.Struts读入请求参数,并通过名称与配置的ActionForm匹配提交的目标Action.它是用户输入的数据,简单明了.
请求中出现的数据始终为java.lang.String类型.但是人们可能有一个名为"age"的表单字段,它在Model数据中是一个int.或者也许代替"年龄",他们有一个"birthDate",当然在他们的模型数据中是java.util.Date.因此他们认为将类型int和Date放在ActionForm上是一个好主意,并允许Struts将请求到达的字符串转换为整数和日期.
它是一个非常有用的转换,你作为开发人员不必处理它,Struts确实如此.这是一些框架魔术.
但这不是哈利波特!在整数和日期转换可能会失败.为什么?
int是基本类型,因此它必须始终具有值.默认初始化为零.在进行绑定(ActionForm对象属性的请求参数)时,Struts在ActionForm上看到一个int类型,并尝试将请求String值转换为int.
如果用户插入字符串"5",则该字段设置为5.这很好!
但如果用户插入"bla"怎么办?我们会得到一个例外吗?不!我们返回零值,因为转换(静默)失败.UPS!
日期再次成为问题.为什么?因为它们的值作为String请求到达.他们的格式可能像"12/01/2011"那样简单,作为信息完全没用.为什么?因为表示为字符串的日期必须与区域设置齐头并进,才能转换为它所代表的正确日期实例.
"12/01/2011" + Locale.US = 01 December 2011
"12/01/2011" + Locale.FRENCH = 12 January 2011
Run Code Online (Sandbox Code Playgroud)
UPS!
好的,所以这是介绍!现在让我们回答你的问题.
- 我应该创建一个Date变量并创建一个转换将发生的setDate(String date)方法.
在某些时候,你将不得不将日期发送回视图,Struts html标签通常必须getDate()
返回一个返回String的标签.如果getter返回Date(Struts将对toString()
getter值执行a),则用户输入的"12/01/2011"可能会显示为"2011年1月12日00:00:00" .所以你实际上需要Date字段,其中包含Date类型的setter/getter和String类型的setter/getter.在Action类中使用Date类型,并使用String与视图标记进行交互.
题?如何处理ActionForm中正确的Locale值?
- 创建一个Date变量,一个setDate(Date date)并在链中的某个地方注册一个特殊的转换器(不知道是否可能)
这是可能的.您可以创建并注册可能采用日期的字符串表示形式并将其转换为日期的自定义转换器.如果您使用ISO 8601格式,我认为您将是安全的.
题?您是否可以将此容纳到现有应用程序中,而不会破坏使用各种格式或语言环境以自己的方式将String转换为日期的代码?
- 创建一个String变量,一个setDate(String date),并将转换/验证转换为actionForm bean中的validate方法
这不行.validate
在ActionForm对象上的参数绑定之后调用该方法.当你达到这一点时已经很晚了.Struts做了转换.如果你有一个类型为int的字段,其值为零,则无法知道用户是否实际插入了零并且转换是否有效,或者用户是否插入了"bla"并且转换失败并且您返回零作为默认初始化值.如果零是您的应用程序的有效值,则比您遇到更大的麻烦.
那么惯例是什么?
没有惯例.根据您的具体情况,使用上述信息并应用常识.
理想情况下,您应该将ActionForm中的所有属性都作为字符串,以便在绑定期间不会丢失任何信息.但这涉及在使用它们之前手动将属性转换为Action类中的正确类型.你有完全的控制权(Struts不再进行转换,因为源和目标值都是String类型),但是你还要编写很多样板代码,以正确的方式进行,这在某些时候会变得很烦人.
PS我结束这和睡觉前(这是在我的国家凌晨01:00:d)我只想提一两件事,人们往往看不到.ActionForm不是模型的一部分,也不应该直接与模型交互.
如果需要在模型中处理ActionForm中的数据,则将其映射为与模型DTO(数据传输对象)的一对一关系.如果不这样做,那么在Model和Struts框架之间创建紧密耦合,因为ActionForm对象不是POJO.你的类必须从我们一直在谈论的Struts扩展ActionForm类.人们不这样做,并将ActionForm直接发送给模型.更糟的是,他们还用validate
方法来执行,而不是基本验证,如"需要"业务验证,"是价值withing范围"等.
ActionForms只是Action(控制器)和视图之间的通信路径.这样对待它.