Я пишу поисковую систему для изучения нескольких поисковых алгоритмов. Веб-часть плавает на Struts 2.1.6 и Tiles 2.2.2. В настоящее время это полный беспорядок, поэтому ниже я выделил упрощенную версию, чтобы сосредоточиться на конкретной проблеме, с которой я столкнулся.
Обычный поток через сайт таков:
- Всплеск поисковой формы. Выберите алгоритм поиска и введите параметры поиска.
- Отправить форму. Выбор алгоритма устанавливает действие, которому отправляется форма.
- Страница результатов. Включает копию формы поиска вверху (один и тот же код jsp формы поиска используется как во всплывающей заставке, так и в результатах).
Проблема: я хочу добавить вариант формы поиска. Вариант 2 будет подчиняться некоторым из тех же поисковых алгоритмов, что и Вариант 1, с той же страницей результатов, но, конечно, я хочу, чтобы форма поиска Варианта 2 отображалась вверху для согласованности. Новый поток будет таким:
- Выберите форму поиска. Для Vanilla перейдите к 2. Для Crazy перейдите к 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>
(вероятно, переключение отображения ввода поиска для обеих страниц поиска на плитки, чтобы сохранить копипасту) (и уничтожение всего дерьма входных параметров перенаправления для алгоритмов поиска, поскольку цепочка автоматически сохраняет эти значения в стеке)
... но теперь я в ступоре, потому что связанные действия, общие для 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"/>
to
<tiles:insertAttribute name="searchform" flush="true"/>
Затем я могу либо (1) создать новую плитку для CrazyResults, которая передается в соответствующую форму поиска jsp, либо (B) найти какой-то способ передать атрибут плитки на основе того, какой запуск *SearchPage.
Проблема с (1) заключается в том, что действия с цепочками алгоритмов уже идут в обычную плитку результатов, и я не хочу запрещать эти алгоритмы из обычной страницы поиска только для того, чтобы использовать их на странице CrazySearchPage. Я полагаю, что мог бы определить повторяющийся набор действий алгоритма для использования CrazySearchPage, который вызывает один и тот же класс с другим именем и другим результатом, но это создает беспорядок в struts.xml и других моих файлах конфигурации (у меня есть обширный дисплей настройки, связанные с каждым именем действия).
Проблема с (B) заключается в том, что я еще не нашел достаточно документации по плиткам, чтобы сказать мне, возможно ли это или нет, и как это сделать. Struts и Tiles не разговаривают друг с другом напрямую, они просто передают заметки.