Я пишу поисковую систему для изучения нескольких поисковых алгоритмов. Веб-часть плавает на Struts 2.1.6 и Tiles 2.2.2. В настоящее время это полный беспорядок, поэтому ниже я разработал упрощенную версию, чтобы сосредоточиться на точной проблеме, с которой я столкнулся.
Обычный поток через сайт выглядит так:
- Searchform splash. Выберите алгоритм поиска и введите параметры поиска.
- Отправьте форму. Выбор алгоритма устанавливает действие, в которое отправляется форма.
- Страница результатов. Включает в себя копию поисковой формы вверху (один и тот же jsp-код поисковой формы используется и в заставке, и в результатах).
Проблема: Я хочу добавить вариант формы поиска. Вариант 2 будет подчиняться некоторым из тех же алгоритмов поиска, что и Вариант 1, с той же страницей результатов, но, конечно, я хочу, чтобы поисковая форма Варианта 2 отображалась вверху для согласованности. Новый поток будет:
- Выберите форму поиска. Для ванили, перейти к 2. Для сумасшедшего, перейти к 3.
- Выберите алгоритм поиска из {A, B, C} и введите параметры поиска. Перейти к 4.
- Выберите алгоритм поиска из {B, C, D, E} и введите параметры поиска. Перейти к 4.
- Submit. Привязать (используя 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, отображаются в плитке Results:
tiles.xml:
<tiles-definitions>
<definition name="Results" template="/resultsTemplate.jsp">
<put-attribute name="tabPane" value="/resultsEagerTabPane.jsp"/>
</definition>
...
И плитка Результаты включает в себя обычный код формы поиска, используемый в обычной странице поиска:
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, кажется, не общаются друг с другом напрямую, они просто передают записи.