Плитки, Struts 2, связанные действия и передача значений атрибутов ввода

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

Обычный поток через сайт таков:

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

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

  1. Выберите форму поиска. Для Vanilla перейдите к 2. Для Crazy перейдите к 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, отображаются в плитке результатов:

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 не разговаривают друг с другом напрямую, они просто передают заметки.


person krivard    schedule 21.06.2011    source источник


Ответы (2)


Я думаю, что есть пара независимых проблем, поэтому это не будет полным решением, оно просто устранит то, что, как мне кажется, может стать камнем преткновения.

Основной причиной беспорядка является использование redirectAction, и ваш новый план использования цепочки не намного лучше. В мире struts2 они аналогичны оператору goto. То есть он прост в использовании, отлично подходит для быстрого исправления, но может создать большой беспорядок, если использовать его без ограничений (и, как и goto, их можно вообще избежать).

Вот несколько советов:

Избегайте цепочек и redirectAction. Там, где они, кажется, имеют смысл использовать перехватчик.

Добавьте подключаемый модуль соглашений, чтобы избежать большей части обслуживания struts.xml.

Если все вышеперечисленное будет сделано, то ваше приложение, я уверен, не будет беспорядком, но проблемы с представлением кажутся отдельной проблемой. Я использую плитки, но не могу понять, что не работает. Все результаты ваших плиток указывают на Результаты. То, как я использую плитки, очень похоже на то, как вы используете JSP. У вас должны быть разные определения для разных страниц (результаты плитки). Я думаю, что вы упускаете большую часть возможностей плиток, если у вас нет определений плиток, использующих атрибут extends. Плитки очень похожи на JSP, просто с помощью плиток вы можете выделить всю общность страницы.

person Quaternion    schedule 21.06.2011
comment
(ага, введите) О плитках: все алгоритмы поиска возвращают список документов независимо от того, как они генерируют этот список, и я всегда хочу отображать списки документов одним и тем же способом. Между прочим, я использую extends для вариантов отображения результатов, но эти варианты ортогональны проблеме множественных алгоритмов поиска. - person krivard; 22.06.2011

Моя проблема заключалась в том, как вставить ответ от действия в атрибут плитки. Я сделал это так:

<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>

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

person Luiz Feijão Veronesi    schedule 07.03.2013