0

複数の検索アルゴリズムを探索する検索エンジンを作成しています。Web 部分は、Struts 2.1.6 および Tiles 2.2.2 でフロートします。現在、完全に混乱しているため、私が抱えている正確な問題に焦点を当てるために、簡略化されたバージョンを以下に示します。

サイトの通常の流れは次のとおりです。

  1. 検索フォームのスプラッシュ。検索アルゴリズムを選択し、検索パラメーターを入力します。
  2. フォームを送信します。アルゴリズムの選択により、フォームが送信されるアクションが設定されます。
  3. 結果ページ。上部に検索フォームのコピーが含まれます (スプラッシュと結果の両方で同じ検索フォーム jsp コードが使用されます)。

問題:検索フォームのバリアントを追加したい。バリアント 2 は、バリアント 1 と同じ検索アルゴリズムのいくつかに送信され、同じ結果ページが表示されますが、もちろん、一貫性を保つためにバリアント 2 の検索フォームが一番上に表示されるようにしたいと考えています。新しいフローは次のようになります。

  1. 検索フォームを選択します。バニラの場合は 2 に進みます。クレイジーの場合は 3 に進みます。
  2. {A、B、C} から検索アルゴリズムを選択し、検索パラメーターを入力します。4へ。
  3. {B、C、D、E} から検索アルゴリズムを選択し、検索パラメータを入力します。4へ。
  4. 送信。選択したアルゴリズムの適切な検索アクションに (Struts "chain" resulttype** を使用して) チェーンします。
  5. 結果を表示します。{バニラ | のコピーを含める 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 は互いに直接対話しているようには見えず、メモを渡すだけです。

4

2 に答える 2

1

いくつかの独立した問題があると思うので、これは完全な解決策ではなく、つまずきになると思うものに対処するだけです。

混乱の主な理由はredirectActionの使用であり、チェーンを使用する新しい計画はそれほど良くありません。struts2の世界では、これらはgotoステートメントに似ています。つまり、使いやすく、すばやく修正するのに最適ですが、制限なしで使用すると、なんとか大きな混乱を引き起こすことができます(gotoのように、それらを完全に回避することもできます)。

ここにいくつかのアドバイスがあります:

連鎖とredirectActionは避けてください。意味があると思われる場合は、インターセプターを使用します。

struts.xmlのほとんどのメンテナンスを回避できるように、conventionsプラグインを追加します。

上記が行われた場合、アプリケーションが混乱することはないと確信していますが、ビューの問題は別の問題のようです。私はタイルを使用していますが、何が機能していないのか理解できません。すべてのタイルの結果は結果を指しています。私がタイルを使用する方法は、JSPを使用するのとよく似ています。ページごとに異なる定義が必要です(タイルの結果)。extends属性を使用するタイル定義がない場合、タイルの多くの機能が失われていると思います。タイルはJSPに非常によく似ています。タイルを使用すると、ページのすべての共通性を除外できるというだけです。

于 2011-06-21T20:45:33.623 に答える
0

私の問題は、タイル属性にアクションからの応答を挿入する方法でした。私はこのようにしました:

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

これがまさにあなたがやりたいことかどうかはわかりませんが、これはアクションに設定した結果とは無関係です。

于 2013-03-07T14:54:26.757 に答える