Tiles, Struts 2, цепочечные действия и прохождение через значения put-attribute
Я пишу поисковую систему для изучения нескольких поисковых алгоритмов. Веб-часть плавает на Struts 2.1.6 и Tiles 2.2.2. В настоящее время это полный беспорядок, поэтому ниже я разработал упрощенную версию, чтобы сосредоточиться на точной проблеме, с которой я столкнулся.
Нормальный поток через сайт таков:
- Searchform всплеск. Выберите алгоритм поиска и введите параметры поиска.
- Отправьте форму. Выбор алгоритма устанавливает действие, в которое отправляется форма.
- Страница результатов. Включает в себя копию поисковой формы вверху (один и тот же 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>
(возможно, переключение отображения входного поиска для обеих страниц поиска на тайлы для сохранения копировальных паст) (и обнуление всего дерьма параметров перенаправления ввода для алгоритмов поиска, поскольку объединение в цепочку автоматически сохраняет эти значения в стеке)
... но теперь я скрылся, потому что цепочечные действия, совместно используемые 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) состоит в том, что действия связанного алгоритма уже отправляются на обычную плитку Results, и я не хочу запрещать эти алгоритмы из обычной SearchPage просто так, чтобы я мог использовать их на CrazySearchPage. Я полагаю, что мог бы определить дубликат набора действий алгоритма для использования CrazySearchPage, который вызывает тот же класс с другим именем и другим результатом, но это вносит беспорядок в struts.xml и мои другие файлы конфигурации (у меня есть обширный показ настройки, связанные с каждым именем действия).
Проблема с (B) состоит в том, что я еще не нашел достаточно документации по плиткам, чтобы сказать мне, возможно ли это или нет, и как это сделать. Struts и Tiles, кажется, не общаются друг с другом напрямую, они просто передают записи.
2 ответа
Я думаю, что есть пара независимых вопросов, так что это не будет полным решением, оно просто решит проблемы, которые, на мой взгляд, станут камнем преткновения.
Основной причиной беспорядка является использование redirectAction, и ваш новый план использования цепочки не намного лучше. Это в мире struts2 сродни утверждению goto. То есть он прост в использовании, отлично подходит для быстрого исправления, но может создать большую путаницу, если используется без ограничений (и, как и в случае с goto, их можно полностью избежать).
Вот несколько советов:
Избегайте цепочки и redirectAction. Там, где они, кажется, имеют смысл использовать перехватчик.
Добавьте плагин соглашений, чтобы вы могли избежать большинства операций с Struts.xml.
Если вышеупомянутое сделано, то ваше приложение, я уверен, не будет беспорядком, но проблемы с представлением кажутся отдельной проблемой. Я использую плитки, но не могу понять, что не работает. Все ваши результаты плитки указывают на результаты. То, как я использую плитки, очень похоже на использование JSP. У вас должны быть разные определения для разных страниц (результаты листов). Я думаю, что вам не хватает всей силы плиток, если у вас нет определений плиток, в которых используется атрибут extends. Плитки очень похожи на JSP, просто с помощью плиток вы можете вычленить всю общность страницы.
Моя проблема заключалась в том, как вставить ответ от действия в атрибут плитки. Я сделал это так:
<tiles:insertTemplate template="/workflow/login.action"/>
И в web.xml:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
Я не знаю, хотите ли вы именно этого, но это не зависит от результата, который вы установили для своего действия.