我有一个从用户接收一些参数的动作(例如日期)。此操作会生成许多不同的报告,因此它有许多不同的方法。我需要在每个方法之前调整这些参数(将时间设置为午夜)。 prepare
方法在绑定参数之前执行。是否有其他拦截器或任何其他允许我这样做的约定?
答案 0 :(得分:3)
另一种方法(如果您现在正在编码便宜,如果您已编码所有内容则价格昂贵)将模块化您必须在一个Struts2 Action中执行的每个操作。
然后你会得到像BaseReportAction
这样的内容,其中包含使用protected
代替private
共享的所有常见属性和方法,对参数和{中的常见操作进行调整{1}}方法;
每个报告的一个Action扩展了BaseReportAction,让我们说
ExcelReportAction,PdfReportAction等......
或
MinimalReportAction,CompleteReportAction等......
或
DailyReportAction,MonthlyReportAction等......
唯一的要求是使用execute()
作为每个子动作的super.execute();
方法的第一个语句。
这样你就可以利用继承,拥有更多更小,更干净(最终打包成几个子包)的Action而不是一个带有大量方法的巨大Action。
少数报告使用的所有实用程序方法仅适用于那些报告,而不适用于所有其他报告(比如说PDF和XLS的内容)......
对于不同的操作,您也可以从XML验证中受益(可能一个报告需要不同的输入)。
最后,您的调优代码将是线程安全的(操作是线程安全的,拦截器不是)。
但如上所述,这是一种更适合预编码阶段的实现选择(即使根据Web应用程序的大小,重构并不困难......)。
答案 1 :(得分:2)
使用<interceptor-ref name="paramsPrepareParamsStack"/>
<!-- An example of the params-prepare-params trick. This stack is exactly the same as the defaultStack, except that it includes one extra interceptor before the prepare interceptor: the params interceptor. This is useful for when you wish to apply parameters directly to an object that you wish to load externally (such as a DAO or database or service layer), but can't load that object until at least the ID parameter has been loaded. By loading the parameters twice, you can retrieve the object in the prepare() method, allowing the second params interceptor to apply the values on the object. -->
如果您使用 Convention插件将其应用于操作
@Action(value="action1", interceptorRefs=@InterceptorRef("paramsPrepareParamsStack"))