Tiles, Struts 2, цепочечные действия и прохождение через значения put-attribute

Я пишу поисковую систему для изучения нескольких поисковых алгоритмов. Веб-часть плавает на Struts 2.1.6 и Tiles 2.2.2. В настоящее время это полный беспорядок, поэтому ниже я разработал упрощенную версию, чтобы сосредоточиться на точной проблеме, с которой я столкнулся.

Нормальный поток через сайт таков:

  1. Searchform всплеск. Выберите алгоритм поиска и введите параметры поиска.
  2. Отправьте форму. Выбор алгоритма устанавливает действие, в которое отправляется форма.
  3. Страница результатов. Включает в себя копию поисковой формы вверху (один и тот же jsp-код поисковой формы используется и в заставке, и в результатах).

Проблема: я хочу добавить вариант формы поиска. Вариант 2 подчиняется некоторым из тех же алгоритмов поиска, что и Вариант 1, с той же страницей результатов, но, конечно, я хочу, чтобы поисковая форма Варианта 2 отображалась вверху для согласованности. Новый поток будет:

  1. Выберите форму поиска. Для ванили, перейти к 2. Для сумасшедшего, перейти к 3.
  2. Выберите алгоритм поиска из {A, B, C} и введите параметры поиска. Перейти к 4.
  3. Выберите алгоритм поиска из {B, C, D, E} и введите параметры поиска. Перейти к 4.
  4. Отправить. Привязать (используя Struts "цепочка" тип результата **) к соответствующему поисковому действию для выбранного алгоритма.
  5. Показать результаты. Включить копию {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>

Я не знаю, хотите ли вы именно этого, но это не зависит от результата, который вы установили для своего действия.

Другие вопросы по тегам