我有多个操作,在完成后重定向回到一般页面(showStuff)。我正在寻找一种不重复每个重定向动作的参数列表的方法。
我拥有的是:
<action name="doThis" class="com.domain.package.MyAction" method="doThis">
<result type="redirectAction">
<param name="actionName">showStuff</param>
<param name="parse">true</param>
<param name="selectedYear">${selectedYear}</param>
<param name="selectedMonth">${selectedMonth}</param>
<param name="selectedDay">${selectedDay}</param>
</result>
</action>
<action name="doThat" class="com.domain.package.MyAction" method="doThat">
<result type="redirectAction">
<param name="actionName">showStuff</param>
<param name="parse">true</param>
<param name="selectedYear">${selectedYear}</param>
<param name="selectedMonth">${selectedMonth}</param>
<param name="selectedDay">${selectedDay}</param>
</result>
</action>
我想将参数列表保留在showStuff操作定义中,然后使用就像这样:
<action name="doThis" class="com.domain.package.MyAction" method="doThis">
<result type="redirectAction">
<param name="actionName">showStuff</param>
</result>
</action>
<action name="doThat" class="com.domain.package.MyAction" method="doThat">
<result type="redirectAction">
<param name="actionName">showStuff</param>
</result>
</action>
有可能吗?
答案 0 :(得分:1)
有几个选择。
老实说,我会跳过大部分的解决方法,并将它们放入会议中。
一旦他们进入会话,就创建一个拦截器和接口(Dateable
或其他东西)。在拦截器中检查会话中的变量(见下文),如果操作是Dateable
,请在操作上设置它们,然后就完成了。
另一种选择是将这些变量封装为日期,并使用内置转换器或使用您自己的转换器。那你只需要一个参数。此选项也适用于拦截器的想法。
答案 1 :(得分:0)
事实证明,这是非常可能的。你就是这样做的:
添加全局结果:
<global-results>
<result name="show-stats" type="redirectAction">
<param name="actionName">showStats</param>
<param name="parse">true</param>
<param name="selectedYear">${selectedYear}</param>
<param name="selectedMonth">${selectedMonth}</param>
<param name="selectedDay">${selectedDay}</param>
</result>
然后是行动:
<action name="doThis" class="com.domain.package.MyAction" method="doThis"/>
<action name="doThat" class="com.domain.package.MyAction" method="doThat"/>
最后在java代码中,只需:
return "show-stats";
你已经完成了。
作为旁注,为什么我要花费这么多时间来坚持最基本的DRY原则?是不是所有这些框架都应该......你知道......简化东西?只是想知道...
答案 2 :(得分:0)
我面临同样的问题,无数的参数越来越长,在几个地方重复。我最终做的是我创建了一个外部文件并在struts.xml中将其声明为实体然后包含它而不是重复所有参数
这是doctype标签
<!ENTITY referenceName SYSTEM "fileName">
然后你就这样包括它
&referenceName;