webwork 中action不执行execute的方法
通常我们会根据逻辑来划分action,譬如Login、Register、Search和Logout等等,这 些从逻辑语义上独立的部分都应该分别作为一个action,这一点是大家都认可的。在以上这些action的周边仍然会有一些其他附属功能,譬如在 Login之前需要做的准备工作——PreLogin;在Search之后需要作进一步搜索的SearchMore。在面对这样的功能时候,你或许会将它 们独立出来,作为一个新的action,同时也有可能想着将这些功能放到主逻辑功能当中去。如果你选择了后者,然后兴冲冲地打开IDE想往里面加方法的时 候,或许你会犯愁了:方法加了进去,该在哪里调用呢?因为在应用程序运行的时候,WebWork框架只会调用继承的execute方法,那么自己加进去的 方法呢?难道真的要在execute中调用?这不是又跟其他功能扯上关系了嘛?不要着急,且听我慢慢说来。
其实,以上说了那么多,只是想为大家勾 勒一个应用场景而已。撇开那些复杂的场景不谈,需要解决的问题实际就是:如果让框架调用execute以外的方法。了解WebWork的您应该都十分了 解:我们通常所写的action都会extend了ActionSupport类并且需要提供一个override的execute方法,然后在收到请求 之后,WebWork框架会将请求分派给不同的action,由action的execute方法来处理这个请求。这就是框架所带来的好处:更加有序地组 织代码;同时这也是一个限制。框架都会在限制与功能之间寻找一个平衡点,一个好的框架则会将这对矛盾处理得很好:有一定程度的限制,又不失灵活和强大功 能,而WebWork就是这样一个框架。正当你为无法调用execute以外的方法而懊恼的时候,你会惊喜地发现WebWork提供了一种灵活的方式,让 你只需修改一下配置文件就可以调用action中execute以外的方法,这样就不需要为一些主逻辑的周边功能而创建新的action类了,让你在设计 的时候有更多的选择。要实现框架调用action中execute以外的方法,只需要设置好action节点的method属性即可。如以下例子所示:
以 上例子中名为PreLogin的action节点配置就会调用Login action中的preLogin方法,而不是常见的execute方法了。这里还有一个十分灵活的地方需要注意的,如果preLogin方法找不到的 话,WebWork并不会马上抛出Exception,而是进而查找doPreLogin方法(注意大小写)。这样做的原因是为了避免方法名和Java的 关键字冲突,譬如你想使用default这样的方法名,那么你在配置文件仍然可以写上method="default",然后在Java代码中,你就不能 用default做方法名了,因为default是Java的关键字。但是这并不意味着就要把配置文件中method的value给改掉,你只要把方法名 换上doDefault就行了。从这里可以看出WebWork考虑入微的一面,当然,我不赞成使用这种方式,毕竟这是以损失效率为代价的。
其实,以上说了那么多,只是想为大家勾 勒一个应用场景而已。撇开那些复杂的场景不谈,需要解决的问题实际就是:如果让框架调用execute以外的方法。了解WebWork的您应该都十分了 解:我们通常所写的action都会extend了ActionSupport类并且需要提供一个override的execute方法,然后在收到请求 之后,WebWork框架会将请求分派给不同的action,由action的execute方法来处理这个请求。这就是框架所带来的好处:更加有序地组 织代码;同时这也是一个限制。框架都会在限制与功能之间寻找一个平衡点,一个好的框架则会将这对矛盾处理得很好:有一定程度的限制,又不失灵活和强大功 能,而WebWork就是这样一个框架。正当你为无法调用execute以外的方法而懊恼的时候,你会惊喜地发现WebWork提供了一种灵活的方式,让 你只需修改一下配置文件就可以调用action中execute以外的方法,这样就不需要为一些主逻辑的周边功能而创建新的action类了,让你在设计 的时候有更多的选择。要实现框架调用action中execute以外的方法,只需要设置好action节点的method属性即可。如以下例子所示:
<action name="Login" class="com.fantasysoft.Login">
<result name="success">userProfile.jsp</result>
<result name="input">login.jsp</result>
</action>
<action name="PreLogin" class="com.fantasysoft.Login" method="preLogin">
<result name="success">login.jsp</result>
<result name="error">error.jsp</result>
</action>
<result name="success">userProfile.jsp</result>
<result name="input">login.jsp</result>
</action>
<action name="PreLogin" class="com.fantasysoft.Login" method="preLogin">
<result name="success">login.jsp</result>
<result name="error">error.jsp</result>
</action>
以 上例子中名为PreLogin的action节点配置就会调用Login action中的preLogin方法,而不是常见的execute方法了。这里还有一个十分灵活的地方需要注意的,如果preLogin方法找不到的 话,WebWork并不会马上抛出Exception,而是进而查找doPreLogin方法(注意大小写)。这样做的原因是为了避免方法名和Java的 关键字冲突,譬如你想使用default这样的方法名,那么你在配置文件仍然可以写上method="default",然后在Java代码中,你就不能 用default做方法名了,因为default是Java的关键字。但是这并不意味着就要把配置文件中method的value给改掉,你只要把方法名 换上doDefault就行了。从这里可以看出WebWork考虑入微的一面,当然,我不赞成使用这种方式,毕竟这是以损失效率为代价的。