複数の検索アルゴリズムを探索する検索エンジンを作成しています。Web 部分は、Struts 2.1.6 および Tiles 2.2.2 でフロートします。現在、完全に混乱しているため、私が抱えている正確な問題に焦点を当てるために、簡略化されたバージョンを以下に示します。
サイトの通常の流れは次のとおりです。
- 検索フォームのスプラッシュ。検索アルゴリズムを選択し、検索パラメーターを入力します。
- フォームを送信します。アルゴリズムの選択により、フォームが送信されるアクションが設定されます。
- 結果ページ。上部に検索フォームのコピーが含まれます (スプラッシュと結果の両方で同じ検索フォーム jsp コードが使用されます)。
問題:検索フォームのバリアントを追加したい。バリアント 2 は、バリアント 1 と同じ検索アルゴリズムのいくつかに送信され、同じ結果ページが表示されますが、もちろん、一貫性を保つためにバリアント 2 の検索フォームが一番上に表示されるようにしたいと考えています。新しいフローは次のようになります。
- 検索フォームを選択します。バニラの場合は 2 に進みます。クレイジーの場合は 3 に進みます。
- {A、B、C} から検索アルゴリズムを選択し、検索パラメーターを入力します。4へ。
- {B、C、D、E} から検索アルゴリズムを選択し、検索パラメータを入力します。4へ。
- 送信。選択したアルゴリズムの適切な検索アクションに (Struts "chain" resulttype** を使用して) チェーンします。
- 結果を表示します。{バニラ | のコピーを含める Crazy} 検索フォーム。
** 「チェーン」への切り替えは、アルゴリズム パラメーターのより自動化された受け渡しを可能にするためのものです。以下の 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"/>
に
<tiles:insertAttribute name="searchform" flush="true"/>
次に、(1) 適切な検索フォーム jsp を渡す CrazyResults の新しいタイルを作成するか、(B) 実行する *SearchPage に基づいて tiles 属性を渡す方法を見つけます。
(1) の問題は、チェーンされたアルゴリズム アクションが既に通常の結果タイルに移動していることです。これらのアルゴリズムを通常の SearchPage から禁止したくないのは、CrazySearchPage で使用できるようにするためです。CrazySearchPage で使用するアルゴリズム アクションの重複セットを定義して、同じクラスを別の名前と別の結果で呼び出すことができると思いますが、これにより struts.xml とその他の構成ファイルが混乱します (私は広範囲に表示します)。各アクション名に関連付けられた設定)。
(B) の問題は、これが可能かどうか、およびその方法を説明するのに十分なタイルのドキュメントをまだ見つけていないことです。Struts と Tiles は互いに直接対話しているようには見えず、メモを渡すだけです。