我正在编写一个搜索引擎来探索多种搜索算法。web 部分浮动在 Struts 2.1.6 和 Tiles 2.2.2 上。它目前完全是一团糟,所以下面我已经分解出一个简化版本来专注于我遇到的确切问题。
通过该站点的正常流程是这样的:
- 搜索表单飞溅。选择搜索算法并输入搜索参数。
- 提交表格。算法选择设置表单提交到的操作。
- 结果页面。在顶部包含搜索表单的副本(在启动画面和结果中都使用相同的搜索表单 jsp 代码)。
问题:我想添加一个搜索表单变体。变体 2 将提交与变体 1 相同的一些搜索算法,具有相同的结果页面,但当然我希望变体 2 搜索表单显示在顶部以保持一致性。新流程将是:
- 选择一个搜索表单。对于香草,转到 2。对于疯狂,转到 3。
- 从 {A, B, C} 中选择搜索算法并输入搜索参数。转至 4。
- 从 {B, C, D, E} 中选择搜索算法并输入搜索参数。转至 4。
- 提交。链(使用 Struts“链”结果类型**)到所选算法的适当搜索操作。
- 显示结果。包括一份{Vanilla | 疯狂}搜索表单。
** 切换到“链”是为了允许更自动地传递算法参数。旧方法使用隐藏字段,并且使用重定向来维护非常痛苦,正如您将在下面的 struts.xml 中看到的那样。
所以对于单个变体,我有这样的东西:
struts.xml:
<action name="SearchPage" class="nies.actions.search.SearchForm">
<result name="input">/Search.jsp</result>
</action>
<!-- List of available search algorithms to fill 'searcher' param above: -->
<action name="AlgorithmA" class="nies.actions.search.AlgorithmA">
<result name="success" type="tiles">Results</result>
<result name="input"type="redirectAction">
<param name="actionName">SearchPage</param>
<param name="namespace">/</param>
<param name="searchAlgorithm">AlgorithmA</param>
</result>
</action>
<action name="AlgorithmB" class="nies.actions.search.AlgorithmB">
<result name="success" type="tiles">Results</result>
<result name="input" type="redirectAction">
<param name="actionName">SearchPage</param>
<param name="namespace">/</param>
<param name="searchAlgorithm">AlgorithmB</param>
</result>
</action>
<action name="AlgorithmC" class="nies.actions.search.AlgorithmC">
<result name="success" type="tiles">Results</result>
<result name="input" type="redirectAction">
<param name="actionName">SearchPage</param>
<param name="namespace">/</param>
<param name="searchAlgorithm">AlgorithmC</param>
</result>
</action>
所以我打算补充的是:
struts.xml:
<action name="CrazySearchPage" class="nies.actions.search.CrazySearchForm">
<result name="input">/CrazySearch.jsp</result>
<result name="success" type="chain">${searcher}</result>
</action>
(可能将两个搜索页面的搜索输入显示切换为图块以保存 copypasta)(并为搜索算法消除所有输入重定向参数废话,因为链接会自动将这些值保留在堆栈中)
...但现在我已经被淹没了,因为 SearchPage 和 CrazySearchPage 共享的链接操作都显示在结果图块中:
tiles.xml:
<tiles-definitions>
<definition name="Results" template="/resultsTemplate.jsp">
<put-attribute name="tabPane" value="/resultsEagerTabPane.jsp"/>
</definition>
...
结果磁贴包括常规 SearchPage 中使用的常规搜索表单代码:
resultsTemplate.jsp:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<html>
<head>
<title><s:property value="query.queryString"/></title>
</head>
<body>
...
<div id="searchform">
<tiles:insertTemplate template="/searchform.jsp" flush="true"/>
</div>
...
我想相信通过切换
<tiles:insertTemplate template="/searchform.jsp" flush="true"/>
至
<tiles:insertAttribute name="searchform" flush="true"/>
然后我可以(1)为 CrazyResults 制作一个新的磁贴,该磁贴在适当的搜索表单 jsp 中传递,或者(B)找到某种方法来传递基于 *SearchPage 运行的磁贴属性。
(1) 的问题是链式算法操作已经转到常规结果图块,我不想禁止常规 SearchPage 中的这些算法,以便我可以在 CrazySearchPage 上使用它们。我想我可以定义一组重复的算法操作供 CrazySearchPage 使用,它们以不同的名称和不同的结果调用同一个类,但这会使 struts.xml 和我的其他配置文件变得一团糟(我有广泛的显示与每个动作名称关联的设置)。
(B) 的问题是我还没有找到足够的瓷砖文档来告诉我这是否可能以及如何去做。Struts 和 Tiles 似乎并不直接相互交谈,它们只是传递注释。