0

ようこそ。私はWebアプリケーション、スタック:サーブレット、ビューレイヤーとしてフリーマーカーを作成しています.MVCパターンに従ってそれをやろうとしています。すべてのページに、他のサーブレット/ページへのハイパーリンクを含む共通ページ フラグメント ala メニューを含めたいと考えています。すべてのページに 1 つのメニューが含まれています。一部のサーブレットが他のサブディレクトリにマップされていることを追加する必要があります。例:
user/editProfile
admin/statistics
admin/privileges
index
lastMessages

前に言ったように、他のページに含まれる共通のメニュー ページを 1 つ作成したいと考えています。「インデックス」にマップされたサーブレットによってレンダリングされたテンプレートでハイパーリンクが正常に機能するが、すでに管理者/統計番号から取得されている場合。contextPath を使用して他の Web サイトへのパスを作成できると思いますが、freemarker ではこれを行うことができません;/

4

2 に答える 2

4

あなたは間違いなくFreeMarkerでそれを行うことができますが、そうではありません. 確かに FreeMarker には、すぐに使用できるそのような機能は含まれていません。JSP との根本的な違いは、FreeMarker が何も指定しない (サーブレットで使用している場合でさえ) ことです。そのため、フレームワークの作成者は、テンプレートの作成者が何をどのように表示するかを完全に制御できます。そのような機能を公開したい場合は、データモデル、共有変数 (「参考文献」を参照Configuration.setSharedVariable)、または#importフレームワークの Java API を呼び出す -ed FTL (Spring は AFAIR を実行します) を介して実行します。テンプレート作成者の観点から見ると、通常、すべての Web フレームワーク機能を保持する単一の変数があり、たとえば、次のfwようなことを行います。${fw.url('admin/statistics')}フレームワークが絶対 URL に展開します。この例では、テンプレートの作成者は、サーブレット コンテキスト URL の挿入などの高度な技術的な詳細に対処する必要がないことに注意してください。また、この方法では、ターゲットを単なるアクション識別子にすることができ、URL をアクションにマップする構成の別のレイヤーを持つことができます (この柔軟性は、たとえば SEO に役立ちます)。これは、壊れたリンクを自動的に見つけることもできることを意味します。

于 2013-09-10T22:23:18.187 に答える
1

私がしたように、学習していてまだ苦労している人のために、サーブレットで@ddekanyの答えを共有し、補完したいと思います。

public class FW {
    String contextPath0;
    String contextPath;
    FW(HttpServletRequest request) {
        contextPath0 = request.getContextPath();
        contextPath = contextPath0 + "/";
    }
    public String getContextPath() {
        return contextPath0;
    }
    public String url(String path) {
        if (path.startsWith("/")) return contextPath0 + path;
        return contextPath + path;
    }
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    request.setAttribute("fw", new FW(request));
    request.getRequestDispatcher("/template-00.ftl").forward(request, response);
}

以降、.ftl テンプレートで

<pre style="border: 1px solid black; padding: 1em 1em 1em 1em;">
fw.context path: "${fw.contextPath}"
fw.url 1: "${fw.url('/my/safe/absolute/path')}"
fw.url 2: "${fw.url('my/safe/relative/path')}"
</pre>
于 2014-01-20T20:12:58.850 に答える