数据验证:
这里先说一下这一章对我来说最重要的地方:我曾经是用PHP写程序的,一开始时都是一页一个程序,从数据的表面验证,到逻辑认证,到业务逻辑,到数据操作,各个方面都在一个PHP文件里。虽然可以用面向对象方式进行编写,可是却引发更多的难题和问题,这里就不说了。
在Struts里,数据校验分成两个部份,就是表面数据验证和逻辑数据验证。表面验证方面,是由ActionForm的validate()方法完成的,它较验用户提交的数据表面上(即格式上)是否正确,至于逻辑上是否正确,则由Action调用的业务逻辑层对象进行。而这里要确认的一点就是,Action并不进行逻辑验证,换个说法就是Action调用业务逻辑层进行验证。
那么Action做什么?根据状态处理转向或者重定向,也就是控制器的任务。它调用业务逻辑层对象进行操作得到状态,然后就根据状态进行转向。
把业务逻辑从Action中去掉!
这很重要。我看过很多示例,它们都把业务逻辑放在Action里,一旦不用Struts就会出现很多问题。所以业务逻辑层不能和控制层藕合。(书里面作者的表态是,Struts只能是控制层)
把业务逻辑从视图层中去掉!!
这里用到了DTO,Date Transfer Object,用于专门传输数据,而这里我的理解是,用于控制层和视图层传输数据。在这一章中,作者的代码里用到了UserView这个DTO,这个DTO由LoginAction保存进Session,那么就可以在视图中进行读取操作。
但是这也引发了我一个很大的疑问:就是作者一再强调逻辑业务和视图分开,那么为什么还要IAuthentication返回一个UserView对象呢?那么视图层对UserView这个DTO有新的数据要求时不就要重新设计IAuthertication了吗?这样就达不到书中所讲的逻辑业务和视图分开的效果了。
我个人认为,DTO由控制层通过调用业务层得到数据进行拼装,然后交付给视图。(但是这里也引发另一个疑问,就是业务逻辑能返回那么多数据吗?要作到这一点,可能Action会参与一些逻辑业务,这样就不对了。。。看看这本书是怎么处理的。)
翻译书中有一个地方翻译的不是很合理:form bean最好不要翻译成“表单bean”,读起来很不顺。。。。